长时间运行的状态应该存储在哪里?

时间:2018-08-15 08:49:46

标签: java spring

我们在系统中内置了一个操作(以下称为check())。开始此过程后,我们希望将此资源的状态从Not Started更改为In Process,并在完成后将其更改为FailedSuccessful

当前的实现是将所述资源的相应状态写入DB。这样的流程就像(假设运行成功):

  

用户单击检查-> check()开始->在DB中将资源状态设置为In Process-> check()完成->将资源状态设置为{{1} }在数据库中

Successful期间,如果用户单击前端的 Refresh ,则会触发对相应资源的check()请求,从而检索当前状态({{ 1}})显示给用户。如果另一个用户尝试在当前GET的资源上运行In Process,则在检查数据库中资源的状态时,该请求将失败。

这是向数据库注册临时状态的正确解决方案吗?我觉得应该使用DB来持久记录,而不是将其用作闩锁。

1 个答案:

答案 0 :(得分:1)

您可以使用event sourcing技术解决此问题。您可以将一系列状态转换存储为事件,而不是存储过程的最新状态。
对于每个传入命令(如您提到的检查或刷新),您:

  1. 汇总某个事件已经发生在某个过程中的事件 id,重新创建您的进程状态。
  2. 根据您的业务逻辑,根据当前状态和传入命令(这是一种状态机)决定下一个状态转换。
  3. 为状态转换创建新事件,并将其保留在事件存储中。

要正确实现这种系统,请不要忘记对事件进行版本控制。这是版本控制指南:Versioning in an Event Sourced System