【问题标题】:Request atomicity within microservices bounded context微服务限界上下文中的请求原子性
【发布时间】: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


    【解决方案1】:

    我认为这更像是一种缓存范例。将您的请求/响应粘贴到由 uuid 索引的外部缓存提供程序(REDIS 或类似)中。拥有 TTL 将允许您的响应自动清理那些永远不会返回的请求,并且高速实现 (o1) 应该允许它很好地扩展。它还将为您提供开箱即用的异步模型(不是既定目标,但始终是一个不错的选择)。

    【讨论】:

    • 是的,基本上它是一种缓存,但我需要能够正确地对这些重复请求做出反应,如果可能的话,识别操作正在进行中并等到它结束然后响应
    • 对,所以通过uuid(或者一些有意义的hash)将请求放入缓存中,当响应返回时,附加响应,然后响应客户端。客户端每次检查是否已经存在与其哈希匹配的请求,如果找到,则使用附加响应,如果没有附加响应,则等待一些合理的超时,并继续检查。最终,带有初始客户端请求的线程将填充响应,否则将发生超时,并会出现一个新的客户端请求来完成。
    • 好吧,我不确定我们是否在同一页面上,所以我用我正在考虑的一些操作建议扩展了这个问题。无论如何,我不能告诉请求者做某事/以任何方式改变它的请求过程..所以这取决于我们的微服务上下文来做出良好的响应并尽可能减少损害:)
    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2018-06-17
    • 1970-01-01
    • 2019-04-10
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多