【发布时间】:2023-03-27 22:57:01
【问题描述】:
我有一个 Web Api 无状态服务,它正在创建一个 Actor,该 Actor 通过提醒(即发即弃)进行一些长时间运行的处理。它将自己的进度存储在本地状态中。由于 Actor 的单线程性质,我无法获得那个长时间运行的进程的进度,对获取进度的方法的任何调用都将等到长时间运行的进程完成。有没有人对此有解决方案(不使用外部数据源)?
【问题讨论】:
我有一个 Web Api 无状态服务,它正在创建一个 Actor,该 Actor 通过提醒(即发即弃)进行一些长时间运行的处理。它将自己的进度存储在本地状态中。由于 Actor 的单线程性质,我无法获得那个长时间运行的进程的进度,对获取进度的方法的任何调用都将等到长时间运行的进程完成。有没有人对此有解决方案(不使用外部数据源)?
【问题讨论】:
如果您只是希望在无需等待 Actor 锁定的情况下获取 Actor 的当前状态,您实际上可以使用托管 Actor 的底层 ActorService 来查询状态,而不会中断或被长时间运行的 Actor 阻塞方法。
托管 Actors 的 ActorService 实际上只是一个 StatelessService(有一些花里胡哨),您可以像与任何 Service 通信一样与它通信 - 向它添加一个 IService 接口并使用 IServiceProxy 到跟它说话。这个 SO Answer 显示了您如何做到这一点How to get state from service fabric actor without waiting for other methods to complete?
如果您想在执行 Actor 方法的过程中取得进展,您可以通过调用 SaveStateAsync 来强制保存在长时间运行的执行过程中的状态更改
【讨论】:
您可以创建一个ProgressTrackingActor 并定期从现有的Actor 更新它。查询ProgressTrackingActor 以获取进度。
您可以使用ActorReference 指示要查询哪个Actor 的进度,或使用相同的ActorId 值。
【讨论】: