Azure service fabric 在服务结构服务上调用fire-and-forget方法的正确方法
我需要从ServiceB调用ServiceA上的一个方法。这个方法执行起来需要5分钟,我不在乎它的返回值。(方法的输出以另一种方式处理) 我在Azure service fabric 在服务结构服务上调用fire-and-forget方法的正确方法,azure-service-fabric,service-fabric-remoting,Azure Service Fabric,Service Fabric Remoting,我需要从ServiceB调用ServiceA上的一个方法。这个方法执行起来需要5分钟,我不在乎它的返回值。(方法的输出以另一种方式处理) 我在IServiceA中设置了我的方法,如下所示: [OneWay] Task LongRunningMethod(int param1); 但是,它似乎没有运行,因为我得到的是System.TimeoutException:如果在服务繁忙或其长时间运行的操作并且花费的时间超过配置的操作超时时丢弃消息,则可能发生这种情况。 一种选择是增加超时,但似乎应该有更
IServiceA
中设置了我的方法,如下所示:
[OneWay]
Task LongRunningMethod(int param1);
但是,它似乎没有运行,因为我得到的是System.TimeoutException:如果在服务繁忙或其长时间运行的操作并且花费的时间超过配置的操作超时时丢弃消息,则可能发生这种情况。
一种选择是增加超时,但似乎应该有更好的方法。
是否有?对于启动和遗忘或长时间运行的操作,最好的解决方案是使用消息总线作为中间件,处理两个进程之间的依赖关系
要想在没有中间件的情况下做你想做的事情,你的来电者将不得不担心很多事情,比如:超时(就像你的情况一样)、交付保证(确认)、服务可用性、异常等等
对于中间件,应用程序逻辑需要的唯一担心是交付保证,其余的应由中间件和接收方处理
有很多选择,例如:
- Azure服务总线
- Azure存储队列
- MSMQ
- 活动中心
- 等等
我不推荐使用SF通信,Task.Run(),线程解决方案,因为它们只会给您带来额外的工作,并且不会像中间件方法那样运行顺畅。您能提供一个如何调用此方法的片段吗?看起来某些消息传递框架非常适合您的目的(例如Azure队列)。您考虑过吗?另一种可能的方法是在单独的线程中运行执行,并立即响应调用方。