【问题标题】:The right way to call fire-and-forget method on a service-fabric service在服务结构服务上调用即发即弃方法的正确方法
【发布时间】:2018-11-21 08:12:01
【问题描述】:

我在 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.

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

【问题讨论】:

  • 你能提供一个sn-p你如何调用这个方法吗?
  • 看起来某些消息传递框架非常适合您的目的(例如 Azure Queue)。你考虑过吗?另一种可能的方法是在单独的线程中运行执行并立即响应调用者。

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


【解决方案1】:

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

要在没有中间件的情况下做你想做的事,你的调用者将不得不担心很多事情,比如:超时(如你的情况)、交付保证(确认)、服务可用性、异常等等。

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

有很多选择,比如:

  • Azure 服务总线
  • Azure 存储队列
  • MSMQ
  • 活动中心
  • 等等。

我不建议像许多地方建议的那样使用 SF Communication、Task.Run()、Threads 变通方法,因为它们只会给您带来额外的工作,并且不会像中间件方法那样顺利运行。

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2012-07-27
    相关资源
    最近更新 更多