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

Azure 参与者模型:在这种特定情况下如何实现数据完整性?,azure,azure-service-fabric,distributed-computing,actor,orleans,Azure,Azure Service Fabric,Distributed Computing,Actor,Orleans,我是演员模特和奥尔良的新手,因此对于解决以下任务的良好做法,我非常感谢: 我们有[service1],它运行一些逻辑并将一些结果存储在关系数据库中(遗留的东西)。现在在中间的某个地方,我们想叫奥尔良演员[ACTRO1]持有一个数字列表,以得到下一个可用的数字。[Actor1]的目标是按顺序一致地输入数字,因此不允许跳过,不允许重复,因此它是一种单线程堆栈。单线程不仅是每个进程,而且是整个服务集群,这正是我们所需要的 [service1] -> [Actor1] 现在,我在这里看到的唯一问

我是演员模特和奥尔良的新手,因此对于解决以下任务的良好做法,我非常感谢:

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

[service1] -> [Actor1]
现在,我在这里看到的唯一问题是,[service1]在获取下一个数字之后,但在将结果存储到数据库之前,可能会异常失败。数字是从单线程堆栈中获取的,但由于调用的应用程序未能基于数据库中的fed数字存储结果,所以丢失了该数字。换句话说,我不想让参与者输入下一个数字,除非它确保最后一个输入的数字被很好地使用,并且只有调用的应用程序知道它是否被使用


您建议如何处理这些情况?除非调用服务(或另一个参与者)将其提交到数据库,否则我是否可以以某种方式保持Orleans actor的作业处于打开状态

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

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


即使在SQL中,插入和回滚也会使序列在自动递增的主键ID列中递增,因此失败后可能会有漏洞。

actors是很好的有限状态机,您可以在获取值并在service1的作业完成后确认它后使其状态挂起(另一个调用)。但请记住,你需要处理好沟通issues@Fabio,请您澄清如何将演员的状态设置为“待定”?也许你可以参考一些现有的项目或相关的文章?谢谢我的意思是,不仅要将序列号作为actor中的一个状态,还要有一个布尔值,表示最后一个操作是否已完成,这样您就可以生成一个新的编号。但是,我必须手动阻止grain中的所有后续调用,除非boolean标志允许进一步执行,并手动将它们置于等待状态,而不是依赖于参与者模型框架。它可能会起作用,但我认为可能会有一些更好的解决方案,当参与者在收到使用此号码的确认后失败,并且无法保持其状态时,会发生什么?这个号码还能用吗?演员会确认确认吗?还是等待确认的确认的确认?这是一个拜占庭式的问题,因此没有简单的解决办法。