【发布时间】:2021-02-09 01:16:06
【问题描述】:
我们的项目由多个微服务组成。这些微服务形成了一个边界,入口点没有严格定义,这意味着每个微服务都可以被请求,也可以请求其他服务。
我们需要在这个有界微服务上下文中处理的情况如下: 客户端(其他应用程序)发出请求以执行某些逻辑并更改数据(PATCH), 请求超时, 在处理请求时,客户端会触发相同的请求以重复操作, 操作成功完成, 第二个请求正在以相同的方式处理并在它的时间内完成并且客户端得到响应。
现在发生的情况是,由于第一次超时,相同的内容被处理了两次。
我们需要确保不会处理相同的请求,并且应用程序将使用以前的响应和状态代码进行响应。
后续请求由相同的uuid标识。
现在,我知道应该由客户端进行更精确的请求,或者我们应该在微服务有界上下文中有一个请求入口点,但在企业项目中,团队并不拥有整个系统,因此我们有点受限与我们针对该问题提出的解决方案。考虑到这一点,同时试图不重新发明轮子,我想到了这一点:
微服务应该利用某种会话共享(spring-session?),能够在请求被处理之前通过它的id 查找请求,并且在所描述的情况下,当第一个被处理并且第二个到达时,等待完成第一个,并用客户端超时的第一个数据响应第二个。
我正在努力想象处理回复第二个请求的异步性以及如何侦听第一个请求的会话状态。
如果使用 spring-session(例如使用 hazelcast),我缺少某种具体的会话状态处理程序,它会在请求结束时被触发。有这样的东西可以听吗?
还没有编写代码。这是我想讨论的架构思想实验。
如果不确定理解,请第二次阅读,我很乐意扩展。
编辑:第一个想法:
- (1) 第一个请求被触发
- (3) 处理开始; (2) 同时请求超时;
- (4) 客户端重复相同的请求;程序知道它以前收到过相同的请求,因为它知道请求。身份证。
- 程序检查缓存和该请求 ID 为“待处理”的状态,因此它等待(异步)。
- 第一个请求的计算结果被保存到缓存中 - 橙色方块
- (5) 程序使用本应用于第一个请求的数据响应第一个请求
想法是结果检查和对重复请求的响应将在过滤器链中完成,因此当第二个请求异步等待由第一个请求触发的操作完成时它实际上不会命中控制器(我当从缓存中添加/更新/逐出行时,看到 hazelcast 有一些事件 - 不知道它是否还在工作)并且在完成时只是响应(以某种方式写入 HttpServletResponse)。结果将被保存到 postHandling 过滤器的缓存中。
感谢您的见解。
【问题讨论】:
标签: java rest architecture microservices spring-session