在服务结构服务上调用fire-and-forget方法的正确方法

时间:2018-06-12 02:40:39

标签: azure-service-fabric service-fabric-remoting

我在ServiceA上有一个需要从ServiceB调用的方法。该方法执行时间超过5分钟,我不关心其返回值。 (该方法的输出以另一种方式处理)

我在IServiceA设置了我的方法,如下所示:

[OneWay]
Task LongRunningMethod(int param1);

然而,这似乎无法运行,因为我收到System.TimeoutException: This can happen if message is dropped when service is busy or its long running operation and taking more time than configured Operation Timeout.

一种选择是增加超时,但似乎应该有更好的方法。 有吗?

1 个答案:

答案 0 :(得分:2)

对于 fire并忘记长时间运行的操作,最好的解决方案是使用消息总线作为中间件来处理这两个进程之间的依赖关系。

为了在没有中间件的情况下做你想做的事情,你的来电者将不得不担心许多事情,例如:超时(如你的情况),交付保证(确认),服务可用性,例外情况等。

对于中间件,您的应用程序逻辑需要的唯一担心是交付保证,其余应由中间件和接收器处理。

有很多选择,例如:

  • Azure Service Bus
  • Azure存储队列
  • MSMQ
  • 活动中心
  • 等等。

我不建议使用SF Communication,Task.Run(),Threads解决方法,因为它们只会为您带来额外的工作,并且不会像中间件方法一样顺利运行。