恢复 Spring 状态机实例时的推荐方法

Recommended approach when restoring a Spring State Machine instance

我打算使用 Spring 状态机来控制执行工作流程。系统预计会接收来自多个用户的请求,并且每个用户可能被分配到多个工作流。我最初的想法是每个工作流有一个 SM 实例,每次用户在工作流中执行一个步骤时,我都会使用它的标识符从持久存储中恢复机器,输入新事件并存储更新的 SM。

我了解到初始化 SM 是一项昂贵的操作,有些人建议使用它的单个实例,但用一些数据“补充”该实例。我的理解是这样会更有效,但我认为它会成为一个“阻塞”操作,换句话说,一个工作流程需要等待前一个工作流程finished/released。由于我是这个主题的新手,任何人都可以阐明我的用例的最佳替代方案以及可能说明差异的代码片段吗? (PS: 我使用的是 v2.4.0)

我首先实现了“再水化”机制,因为正如您所说,它很有意义,并且还用于 spring-statemachine 的“坚持”示例。

但是,针对我的 API 的 运行 性能测试表明,当使用 StateMachine 作为具有 prototype 作用域的 @Autowired Bean 时,使用单个实例失败在该示例中进行了描述。发生的情况是针对我的 API 的同时请求覆盖了状态机 Bean,并且第一个请求失败,因为状态机在写回数据库时发生了变化(我使用了 redis)。

所以现在我实际上在每次收到请求时都构建了一个新的状态机并重新水合该对象:

    public String getStatesGuest(HttpServletRequest httpServletRequest) throws Exception {
        StateMachine<States, Events> stateMachine = stateMachineConfig.stateMachine();
        resetStateMachineFromStore(httpServletRequest.getSession().getId(), stateMachine);
        return convertToJson(buildGetStateResponse(stateMachine));
    }

它仍然非常高效,我测试了大约 30 reqs/s 并且仍然得到 12 毫秒的中值。 (Docker 2 个内核用于 spring 启动,1 个内核用于 redis)。