Use*_*yen 1 event-sourcing eventstoredb
我一直在探索 EventStoreDB 并试图了解更多有关消费者端消息排序的信息。请在此处阅读有关persistent订阅以及Pinned消费者策略的信息。
我有一个场景,其中库存更新被推送到 eventstore,并且库存事件中不同的唯一 inventoryId 创建不同的流。
我们有多个具有相同consumerGroup名称的消费者来读取这些库存事件。我们正在使用启用的固定持久订阅ResolveLinkTos。
我的问题:
该文档有一个警告,即不保证使用持久订阅进行有序消息处理。如果适用,任何策略都会以最大努力级别的排序保证来传递消息。
造成这种情况的原因有几个,其中一些是:
大多数基于事件日志的代理(如果不是全部的话)甚至不会尝试保证跨多个消费者的有序消息传递。我经常听到“但是 Kafka 做到了”,忽略了 Kafka 将消息从一个分区传递到一组中最多一个消费者的事实。由于完全相同的问题,多个消费者之间的一个分区没有负载平衡。话虽这么说,EventStoreDB 仍然不是一个代理,而是一个事件数据库。
所以,答案如下:
来自特定流的每条消息是否总是发送到消费者组的同一个消费者实例?
不。它可能在大多数情况下都有效,但最终会崩溃。
来自该特定流的每条消息是否会按照事件摄取的顺序到达特定的消费者实例?
大多数情况下,是的,但同样,如果重试消息,您可能会在上一条消息被确认之前收到下一条消息。
总体而言,对未在服务器上预先分区的消息进行负载平衡有序处理并不是一件容易的任务。最多,如果检查点在某个时刻无法持续存在,并且消费者重新启动,您会重新发送消息。