java长时间运行操作的状态应该存储在哪里?
我们在系统中构建了一个操作(在此命名为check()
)。启动此过程后,我们希望将此资源的状态从Not Started
更改为In Process
,完成后更改为Failed
或Successful
当前实现是将所述资源的相应状态写入数据库。因此,流程如下(如果运行成功):
User clicked check ->
check()
started -> set status of the resource toIn Process
in DB->check()
finished -> set the status of the resource toSuccessful
in DB
在check()
期间,如果用户单击前端上的刷新,将触发对相应资源的GET
请求,从而检索要显示给用户的当前状态(In Process
)。如果另一个用户试图在当前为In Process
的资源上运行check()
,则在检查数据库中资源的状态时,请求应该失败
这是向DB注册临时状态的正确解决方案吗?我觉得DB应该用来保存记录,而不是用作闩锁
# 1 楼答案
您可以使用event sourcing技术解决此问题。您可以将一系列状态转换存储为事件,而不是存储流程的最新状态
对于每个传入命令(如您提到的检查或刷新),您可以:
要正确实现此类系统,请不要忘记对事件进行版本控制。以下是版本控制指南:Versioning in an Event Sourced System