【问题标题】:How to route requests to correct consumer in consumer group如何将请求路由到消费者组中的正确消费者
【发布时间】:2021-06-19 08:27:31
【问题描述】:

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

当外部请求带有更新数据的命令时,如何将该请求路由到组中的正确实例?如果数据按实体 ID 进行分区,奇数 ID 到消费者 1,偶数到消费者 2,如何与消费者沟通?或者,就此而言,负责将传入请求发送到正确实例的任何反向代理或服务网格?

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

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

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

我的想法是否正确?

谢谢

【问题讨论】:

    标签: apache-kafka event-sourcing


    【解决方案1】:

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

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

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

    • 让从 Kafka 摄取的实例解析实体的分片以及哪个实例拥有该分片,然后将请求路由到该实例。相同的模式还允许任何实例处理诸如对实体的 HTTP 请求之类的事情。通过这样做,您可以让服务以有状态的方式实现,并呈现给服务网格/容器调度程序/负载均衡器之类的东西,就像更无状态的服务一样。

    【讨论】:

    • 感谢您的回答。 Kafka 中是否有机制让组中的消费者确定它负责的实体 ID 的“分片”?还是仅仅基于使用的哈希函数?如果它是听起来像 Kafka 内部结构的散列函数,那么在给定特定 ID 的情况下,一个实例不会知道哪个其他实例可能拥有该数据?
    • 假设你基于实体ID的哈希作为key进行分区,你可以从消费者记录中的key中恢复实体ID,然后确定分片;或者,消费者记录应该包括主题分区号,它本身可能是一个足够的分片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多