首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NATS Jetstream是否提供消息按键排序?

NATS Jetstream是否提供消息按键排序?
EN

Stack Overflow用户
提问于 2021-08-30 13:22:49
回答 1查看 1K关注 0票数 5

我是NATS Jetstream的新手,我一直在阅读他们的官方文档(https://docs.nats.io/jetstream/jetstream),以理解它的概念,并将其与Kafka进行比较。我的一个主要用例是解决基于特定id的消息/事件排序(就像Kafka世界中的partition key )。

例如,有几个Order实体的更新事件即将到来,而我的系统需要以相同的顺序使用特定Order的事件。在这种情况下,当发布到Kafka主题时,我将使用order-id作为分区键。如何在Jetstream中完成此操作?

我在Jetstream中遇到了去重键(Nats-Msg-Id),但我认为这个功能与Kafka中的主题压缩更有同义词。我说的对吗?

尽管如此,我还是用Golang编写了以下代码以供发布:

代码语言:javascript
运行
复制
order = Order{
    OrderId: orderId,
    Status:  status,
}
orderJson, _ := json.Marshal(order)
dedupKey := nats.MsgId(order.OrderId)
_, err := js.Publish(subjectName, orderJson, dedupKey)

我这样做对吗?在Jetstream世界中,特定orderId的所有订单是否都会到达同一消费者组中的同一消费者,从而保持顺序?

编辑1

这是我从@tbeets的建议中得到的。例如,我预定义了10个流主题,如ORDER.1ORDER.2ORDER.3……ORDER.10

在发布端,我可以执行一个order-id%10+1来找到我想要发布的确切的流主题。因此,在这里,我们已经实现了同一orderId的所有更新事件每次都将转到同一个流主题。

现在,在订户端,我有10个消费者组(每个消费者组中有10个消费者),每个消费者组都来自一个特定的流主题,比如来自ORDER.1consumerGroup-1消费,来自ORDER.2consumerGroup-2消费等等。

比方说,对于order-id 111来了2个顺序更新事件,它将被映射到ORDER.1流主题,并且相应地consumerGroup-1将消费这2个事件。但是在这个consumerGroup中,两个更新事件可以转到不同的消费者,如果其中一个消费者有点忙或慢,那么在总体上,订单更新事件消耗可能不同步或失序。

Kafka使用分区键的概念解决了这个问题,因为消费者组的消费者被分配到特定的分区。因此,同一orderId的所有事件都由同一消费者消费,从而保持订单更新事件消费的顺序。如何在Jetstream中解决此问题?

EN

回答 1

Stack Overflow用户

发布于 2021-08-30 17:57:11

在NATS中,发布主题可以包含多个分隔标记。例如,您的Order事件可以发布到ORDER.{store}.{orderid},其中最后两个令牌特定于每个事件,并提供您的用例所需的任何切片和骰子维度。

然后为ORDER.>定义一个JetStream (即所有事件)。N可以在JetStream上创建多个消费者(短暂的或持久的),每个消费者在底层流的消息上都有一个可选的过滤器定义,以满足您的用例需求(例如ORDER.Store24.>)。JetStream保证消息(过滤的或未过滤的)按照接收的顺序传递。

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

https://stackoverflow.com/questions/68984906

复制
相关文章

相似问题

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