如何将请求路由到使用者组中的正确使用者



从事件源/CQRS的角度来看:假设我有一个由2个实例组成的消费者组,该组订阅了一个主题。在启动/订阅时,每个实例处理其在事件流中的共享,并构建数据的本地视图。

当外部请求带有更新数据的命令时,如何将该请求路由到组中的正确实例?如果数据是按实体ID划分的,那么奇数ID到消费者1,偶数到消费者2,那么如何将其传达给消费者?或者,就这一点而言,无论哪个反向代理或服务网格负责将传入请求发送到正确的实例?

当消费者群体由于消费者的增加或减少而重新平衡时,会发生什么?这是不是以某种方式自动传达了路由机制?

当消费者都从给定主题的一组新事件中重建他们的本地模型时,服务是否存在差距?

这似乎适用于命令端和查询端,如果它们都被划分在具有分区数据的多个实例之间。。。

我想得对吗?

谢谢

Kafka分区非常适合按命令和事件所影响的实体对命令和事件流进行分片,但不适合以其他方式使用这种分片(例如用于路由请求(。

我建议对实体状态进行分片的广泛技术是不依赖Kafka分区(只使用主题分区来确保实体的命令/事件的顺序,即通过将给定实体的所有命令/事件都放在一个分区中(,而是使用外部的东西来协调这些碎片(候选包括zookeeper/etcd/consul中的租约,或者来自akka(JVM(、akka.net或cloudstate/akka-serverless(更多语言(的集群碎片(。从那里,你可以采取两种广泛的方法:

  • (如果用于状态和处理的实体碎片的数量恰好等于Kafka分区的数量,则最适用(将消费者组协议的一部分移动到应用程序中,并让拥有特定碎片的实例使用特定分区

  • 让从Kafka获取的实例解析实体的碎片以及哪个实例拥有该碎片,然后将请求路由到该实例。同样的模式也允许任何实例处理对实体的HTTP请求之类的事情。通过这样做,您可以使以有状态的方式实现的服务呈现给服务网格/容器调度程序/负载均衡器等事物,作为一个更无状态的服务。

相关内容

最新更新