Actor 模型:在这种特定情况下如何实现数据完整性?

Posted

技术标签:

【中文标题】Actor 模型:在这种特定情况下如何实现数据完整性?【英文标题】:Actor model: how to reach data integrity in this specific situation? 【发布时间】:2019-11-28 16:13:14 【问题描述】:

我是演员模型和奥尔良的新手,因此非常感谢任何有关解决以下任务的良好做法的建议:

我们有 [service1] 运行一些逻辑并将一些结果存储在关系数据库中(遗留的东西)。现在在中间的某个地方,我们要调用 Orleans actor [Actor1],它包含一个数字列表,以获取下一个可用的数字。 [Actor1] 的目标是按顺序和一致地输入数字,因此不允许跳过,不允许重复,因此它是一种单线程堆栈。单线程不仅每个进程,而且贯穿整个服务集群,这正是我们所需要的。

[service1] -> [Actor1]

现在我在这里看到的唯一问题是 [service1] 在获取下一个数字之后但在将结果存储到数据库之前可能会失败并出现异常。 Number 取自单线程堆栈,但由于调用应用程序无法根据数据库中的馈送数字存储结果,因此它丢失了。换句话说,我不希望演员提供下一个号码,除非它确保最后一个提供的号码被很好地使用,并且只有调用应用程序知道它是否是。

您建议如何处理这些情况?除非调用服务(或其他演员)将其提交到数据库,否则我能否以某种方式保持奥尔良演员的工作开放?

【问题讨论】:

actors 是很好的有限状态机,您可以在获取值并在 service1 的工作完成后确认它(另一个调用)后使其状态处于挂起状态。但请记住,您需要处理沟通问题 @Fabio,你能否澄清一下我怎样才能让演员的状态“待定”?也许您可以参考一些现有的项目或相关文章?谢谢! 我的意思是不仅有序列号作为actor中的一个状态,还有一个布尔值表示最后一个操作是否已经完成,所以你可以生成一个新的数字。 但是我将不得不手动阻止grain内的所有后续调用,除非布尔标志让我们走得更远,然后手动将它们置于等待状态,而不是依赖actor模型框架。它可能有效,但我认为可能有一些更好的问题解决方案 当actor在收到这个号码被使用的确认后失败并且不能保持它的状态时会发生什么?它会再次为这个号码服务吗?演员会确认确认吗?还是等待确认确认确认?这是一个拜占庭问题,所以没有简单的解决方案。 【参考方案1】:

这是一个拜占庭问题,因此没有简单的解决方案:数字序列中会出现“漏洞”,或者您将使用相同的数字两次。

如果有必要,我更愿意在以后找到漏洞并用虚拟数据填充它们(例如,如果这是一个计费系统,则在月底为每个作为“漏洞”的票据编号输入一个已取消的空票据)。

即使在 SQL 中,Insert 和 Rollback 也会让序列在自增主键 ID 列中递增,因此失败后可能会出现漏洞。

【讨论】:

以上是关于Actor 模型:在这种特定情况下如何实现数据完整性?的主要内容,如果未能解决你的问题,请参考以下文章

scala学习笔记-Actor(19)

如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库

在这种情况下,我如何建立核心数据模型以及与啥关系?

深度强化学习 Actor-Critic 模型解析,附Pytorch完整代码

在这种特定情况下,如何使用 SQL 仅检索与日期字段的最后一个值相关的记录?

Lite Actor:方舟Actor并发模型的轻量级优化