我是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编写了以下代码以供发布:
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.1、ORDER.2、ORDER.3……ORDER.10
在发布端,我可以执行一个order-id%10+1来找到我想要发布的确切的流主题。因此,在这里,我们已经实现了同一orderId的所有更新事件每次都将转到同一个流主题。
现在,在订户端,我有10个消费者组(每个消费者组中有10个消费者),每个消费者组都来自一个特定的流主题,比如来自ORDER.1的consumerGroup-1消费,来自ORDER.2的consumerGroup-2消费等等。
比方说,对于order-id 111来了2个顺序更新事件,它将被映射到ORDER.1流主题,并且相应地consumerGroup-1将消费这2个事件。但是在这个consumerGroup中,两个更新事件可以转到不同的消费者,如果其中一个消费者有点忙或慢,那么在总体上,订单更新事件消耗可能不同步或失序。
Kafka使用分区键的概念解决了这个问题,因为消费者组的消费者被分配到特定的分区。因此,同一orderId的所有事件都由同一消费者消费,从而保持订单更新事件消费的顺序。如何在Jetstream中解决此问题?
发布于 2021-08-30 17:57:11
在NATS中,发布主题可以包含多个分隔标记。例如,您的Order事件可以发布到ORDER.{store}.{orderid},其中最后两个令牌特定于每个事件,并提供您的用例所需的任何切片和骰子维度。
然后为ORDER.>定义一个JetStream (即所有事件)。N可以在JetStream上创建多个消费者(短暂的或持久的),每个消费者在底层流的消息上都有一个可选的过滤器定义,以满足您的用例需求(例如ORDER.Store24.>)。JetStream保证消息(过滤的或未过滤的)按照接收的顺序传递。
https://stackoverflow.com/questions/68984906
复制相似问题