在 service-fabric 服务上调用即发即弃方法的正确方法
The right way to call fire-and-forget method on a service-fabric service
我在 ServiceA 上有一个方法需要从 ServiceB 调用。该方法的执行时间超过 5 分钟,我不关心它的 return 值。 (该方法的输出以另一种方式处理)
我在 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.
一个选择是增加超时时间,但似乎应该有更好的方法。
有吗?
对于 fire and forget 或 long 运行ning 操作,最好的解决方案是使用消息总线作为中间将处理两个进程之间的这种依赖关系的软件。
要在没有中间件的情况下做你想做的事,你的调用者将不得不担心很多事情,比如:超时(就像你的情况)、交付保证(确认)、服务可用性、异常等等。
使用中间件,您的应用程序逻辑唯一需要担心的是交付保证,其余的应该由中间件和接收方处理。
有很多选项,例如:
- Azure 服务总线
- Azure 存储队列
- MSMQ
- 事件中心
- 等等。
我不推荐使用 SF Communication,Task.Run(),Threads 解决方法,正如许多地方所建议的那样,因为它们只会给你带来额外的工作,并且不会 运行 像中间那样顺利 -洁具方法。
我在 ServiceA 上有一个方法需要从 ServiceB 调用。该方法的执行时间超过 5 分钟,我不关心它的 return 值。 (该方法的输出以另一种方式处理)
我在 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.
一个选择是增加超时时间,但似乎应该有更好的方法。 有吗?
对于 fire and forget 或 long 运行ning 操作,最好的解决方案是使用消息总线作为中间将处理两个进程之间的这种依赖关系的软件。
要在没有中间件的情况下做你想做的事,你的调用者将不得不担心很多事情,比如:超时(就像你的情况)、交付保证(确认)、服务可用性、异常等等。
使用中间件,您的应用程序逻辑唯一需要担心的是交付保证,其余的应该由中间件和接收方处理。
有很多选项,例如:
- Azure 服务总线
- Azure 存储队列
- MSMQ
- 事件中心
- 等等。
我不推荐使用 SF Communication,Task.Run(),Threads 解决方法,正如许多地方所建议的那样,因为它们只会给你带来额外的工作,并且不会 运行 像中间那样顺利 -洁具方法。