首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mircroservices .集成事件的排序

Mircroservices .集成事件的排序
EN

Software Engineering用户
提问于 2018-06-08 13:27:50
回答 2查看 3.1K关注 0票数 11

我目前正在学习事件驱动的体系结构,并拥有以下两个微服务。

  • 产品服务-负责产品管理
  • 订购服务-负责处理订单

每当产品创建时,产品服务都会发布以下事件

  • ProductedCreatedEvent
  • ProductedUpdatedEvent

订购服务使用这些消息并更新自己的本地产品数据存储。

问题

事件的排序似乎非常重要,因为我不希望订购服务在产品实际创建之前使用ProductUpdatedEvent。

我一直在研究Azure服务总线,因为这可以保证订购,但是他们的最新产品,即专为事件驱动的体系结构设计的Azure事件网格,并不支持有保证的排序。

您应该只使用在微服务架构中支持FIFO的消息传递系统吗?

如果命令不能通过消息系统得到保证,那么如果这确实是一个问题,我们还能用什么方法来解决这个问题呢?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2018-06-09 16:20:35

决定订单是否重要取决于每个微型服务。在你的情况下,绝对是。上面的示例实际上很容易解决,因为如果OrderService在产品不存在时获得一个UpdateProduct事件,它可以将UpdateProduct事件重新放到队列中,前提是不久就会有一个创建事件。然而,两个UpdateProduct事件出现故障可能会导致问题,所以我们仍然需要解决这个问题。

有一些方法可以确保出版商和订阅者的订单,但它们很笨拙。如果Update事件包含产品的整个新状态,则可以添加时间戳,如果传入的时间戳比持久化时间戳旧,则拒绝更新缓存。如果updated只发送更新数据,则可以在聚合中添加一个递增版本号,如果传入的事件大于现有版本的1,则在中间事件即将到来的情况下请求该事件。正如你所看到的,这些都是笨拙的。你最好确保队列中的秩序。

您可以考虑Azure事件中心而不是Azure事件网格。事件集线器将保证在一个分区中的订单,所以明智地分区您的应用程序可以给您订单保证您需要。事件集线器的作用更像卡夫卡,而不是传统的队列,因为它提供了一个队列加上事件的持续时间很短的时间。如果系统崩溃并需要恢复,这可能是有利的。

票数 10
EN

Software Engineering用户

发布于 2020-09-12 06:19:16

基于

时间戳的解决方案:

收到的消息是:

代码语言:javascript
复制
{
 id: 1,
 timestamp: T2,
 name: Samuel
}
{
 id: 1,
 timestamp: T1,
 name: Sam,
 age: 26
}
{
 id: 1,
 timestamp: T3,
 name: Marlon Samuels,
 contact: 123
}

不管数据库中的顺序如何,我们希望看到的是:

代码语言:javascript
复制
{
 id: 1,
 timestamp: T3,
 name: Marlon Samuels,
 age: 26,
 contact: 123
}

对于每一条传入的消息,请执行以下操作:

  1. 获取持久化记录并计算时间戳。
  2. 无论哪个时间戳更大,都是目标。

现在让我们来看看下面的消息:

  1. T2首先到达:将其存储在数据库中,因为它是第一个。
  2. T1接下来到达:持久化一个( T2 ) &传入(T1),因此T2是目标。
  3. T3到达:持久化(T2)和传入( T3 ),因此T3是目标。

下面的deepMerge(src,目标值)应该能够给出结果:

代码语言:javascript
复制
public static JsonObject deepMerge(JsonObject source, JsonObject target) {
    for (String key: source.keySet()) {
        JsonElement srcValue = source.get(key);
        if (!target.has(key)) { // add only when target doesn't have it already
            target.add(key, srcValue);
        } else {
            // handle recursively according to the requirement

        }
    }
    return target;
}

如果您需要deepMerge()的完整版本,请在注释中告诉我

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/372285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档