gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:24:31 28 4
gpt4 key购买 nike

我计划使用 Spring 状态机来控制执行工作流。系统预期接收来自多个用户的请求,并且每个用户可能被分配到多个工作流。我最初的想法是每个工作流有一个 SM 实例,每次用户在工作流中执行一个步骤时,我都会使用它的标识符从持久存储中恢复机器,输入新事件并存储更新的 SM。
我已经读到初始化 SM 是一项昂贵的操作,有些人建议使用它的单个实例,但是用一些数据“补充”该实例。我的理解是这样会更有效,但我认为它会变成一个“阻塞”操作,换句话说,一个工作流需要提前等待前一个工作流完成/发布。由于我是这个主题的新手,任何人都可以阐明我的用例的最佳替代方案,也许还有一些代码来说明差异? (PS:我使用的是v2.4.0)

最佳答案

我首先实现了“再水化”机制,因为正如你所说,它是有道理的,并且也被用在 spring-statemachine 的“持久化”示例中。
然而,对我的 API 运行性能测试表明,当使用 StateMachine 作为 @Autowired 时,使用单个实例失败。 bean 用prototype该示例中描述的范围。发生的情况是,针对我的 API 的同时请求覆盖了 Statemachine Bean,并且第一个请求失败,因为在写回 DB 时状态机发生了变化(我使用了 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)。

关于java - 恢复 Spring 状态机实例时的推荐方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68290333/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com