如何处理可靠角色或有状态可靠服务中的长期操作以及“重新处理”失败的状态

时间:2018-08-13 23:44:08

标签: azure-service-fabric

我是Service Fabric Reliable Actors技术的新手,正在尝试为这种特定情况找出最佳实践:

假设我们有一些旧代码,我们想运行基于SF Reliable Actor的新代码。某些类型“ ActorExecutor”的Actor将异步调用某些第三方服务,该服务有时可能会停留很长时间,比Acter的调用客户端准备等待的时间更长,甚至会遇到长期的底层通信问题。我们不希望客户端(传统代码)被ActorExecutor中的任何问题所阻塞,它不希望从actor那里获得任何价值或地位。我们应该为此使用SF ReliableQueue吗?我们是否应该使用某种actor-broker来接收来自客户端的请求并将其存储在队列中:Client-> ActorBroker-> ActorExecutor?提醒在这里有用吗?

在这方面还有一个问题:当成千上万的演员可能同时卡在“第三方不完整通话”中,而我们想重新激活并重复对他们的最后一次通话时,给出这种情况是可能的我们为此编写了一个新工具?在NServiceBus中,您可以在MSMQ中创建一个错误队列,在该队列中所有失败都将失败,例如“无法处理”消息被降落,然后我们可以在将来的任何时间简单地对其进行重新处理。据我了解,Service Fabric中没有这种东西,这是我们需要自己构建的东西。

1 个答案:

答案 0 :(得分:1)

event driven方法可以为您提供帮助。您不必等待Actor从调用返回服务,而可以在其上排队一些任务,以请求其执行某些操作。调用Actor的服务将自动运行,处理其任务队列中的项目。这将允许它执行重试和错误处理。呼叫成功后,新事件可以通知系统的其余部分。

也许this项目可以帮助您入门。

编辑:

  • 目前,我不认为您可以在Actors中使用可靠的集合。因此,Actor的state中的队列是常规(read-only)集合。
  • 使用Actor计时器处理队列。不要使用线程池,因为它不是持久性的,也无法在崩溃和Actor垃圾回收中幸免。