我是演员模型和奥尔良的新手,因此,对于解决以下任务的良好做法的任何建议都将受到赞赏:
我们有[service1],它运行一些逻辑并将一些结果存储在关系数据库中(旧式事物)。现在,在中间的某个地方,我们要称呼拥有数字列表的奥尔良演员[Actor1],以获取下一个可用数字。 [Actor1]的目标是连续一致地输入数字,因此不跳过,不允许重复,因此是一种单线程堆栈。不仅每个进程都是单线程的,而且整个服务集群中都是单线程的,正是我们需要的。
[service1] -> [Actor1]
现在,我在这里看到的唯一问题是,[service1]在接受下一个数字之后但在将结果存储到数据库中之前会因异常而失败。数字是从单线程堆栈中获取的,但是由于调用应用程序无法根据数据库中提供的数字存储结果而丢失了该数字。换句话说,我不希望演员提供下一个数字,除非它确保最后一个被使用的数字被正确使用,并且只有调用应用程序才能知道该数字是否正确。
您如何建议应对这些情况?我能否以某种方式保持Orleans演员的工作,除非调用服务(或另一个演员)将其提交到数据库?
答案 0 :(得分:0)
这是拜占庭式的问题,因此没有简单的解决方案:数字序列中会出现“空洞”,或者您将两次使用相同的数字。
如果有必要,我宁愿拿空洞并在以后用虚拟数据填充它们(例如,如果这是一个计费系统,则月底应为每个“空洞”的帐单号输入一个已取消的空钞)。
即使在SQL中,插入和回滚操作也会使序列在自动递增的主键ID列中递增,因此失败后可能会有漏洞。