【问题标题】:What is the best way to synchronize two post methods同步两个发布方法的最佳方法是什么
【发布时间】:2020-09-27 11:08:02
【问题描述】:

我正在开发休息服务。 有两种发布方法。

第一种方法:

post /something
  1. 接收第一部分数据
  2. 保存到数据库
  3. 返回带有 id 的答案
  4. 使用数据进行异步操作

第二种方法:

post /something/{id}/details
  1. 接收带id的第二部分数据
  2. 检查第一个方法是否完成
  3. 处理整个数据

发展这种互动的最佳方式是什么?

  1. 第二种方法检查数据库是否完成
  2. 调度程序检查数据库是否存在整个数据并处理它
  3. 另一个

【问题讨论】:

  • 什么描述了第一部分数据的处理时间?如果你有你在第一种方法中处理的数据的标识符,你在第二种方法中仍然有它吗?
  • @LukasCoomas,我有固定的描述。第一种方法返回整个数据的标识符,第二种方法可以使用

标签: rest web-services architecture microservices scheduler


【解决方案1】:

既然你知道你在第二个端点上做什么,你就知道要在你的数据库中检查哪些数据。

我建议只检查数据库中是否存在数据,然后继续执行您的逻辑。

如果您要为您正在使用的端点安排任务,您将给应用程序添加不必要的状态完整性。

始终尝试让您的端点尽可能无状态。

【讨论】:

  • 但是如果数据不存在,等待存在?还是返回响应?
【解决方案2】:

我认为您可以使用事件驱动架构来实现您的愿望!

像这样:

post /something
 1. Receive the first part of data
 2. Save to database
 3. Return the answer with id
 4. Make async actions with data
 5. Raise an event with async-something-process-done

第二种方法:

post /something/{id}/details
 1. Receive the second part of data with id;
 2. Checks that first method is completed (I don't know 
    man! Create a flag, attribute... whatever!);
 3. If the something was previously processed then
       process whole details data using a service, function 
       or what ever you have implemented to do this process.
    Else
       store whole details data in a temporary storage.

现在...在您的应用程序的其他部分,您可以添加一个事件侦听器,这将侦听async-something-process-done,并且您必须实现一个处理程序来获取已处理的something 的ID 并搜索something details存储在临时存储中,如果有一些详细信息,则将从您的临时存储中检索到的something details 传递给您的服务、功能或您已实施的任何东西,以执行您在后期实施中使用的此过程。

这种架构需要一些好的设计来分离系统各个部分的职责(接收帖子、验证有效负载、存储在数据库中、存储在临时存储中、处理某些内容和处理某些细节)。

看看这些参考文献:

https://en.wikipedia.org/wiki/Event-driven_architecture#:~:text=Event%2Ddriven%20architecture%20(EDA),of%2C%20and%20reaction%20to%20events.&text=An%20event%2Ddriven%20system%20typically,sinks)%2C%20and%20event%20channels.

https://microservices.io/patterns/data/event-driven-architecture.html

https://www.redhat.com/en/topics/integration/what-is-event-driven-architecture

【讨论】:

  • 但是如果事件发生了,但是没有收到一些细节的数据怎么办
  • 根据你业务规则的复杂程度,在这样的场景下,你需要把“补偿步骤”映射到逆向操作,或者通知用户或者系统,甚至把这个事件放到如果 something datails 未到达,则重试状态以使用 something 尝试一次或 (X) 次以上。对 Saga 补偿模式进行一些研究。
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多