Geo*_*arz 6 scalability event-driven-design apache-kafka microservices
我想了解我需要如何设计微服务的消息传递以使其仍然具有弹性和可扩展性。
a.entity.created包括id在消息正文中创建的实体的信息。a.entity.created作为消费群体订阅该主题b-consumers。这导致 B 的实例之间的负载分布。问题:
a.entity.created.{entityId}导致许多不同主题的主题下发布事件。a.entity.created.*使用通配符作为消费者组订阅主题b-consumers。这导致 B 的实例之间的负载分布。问题:
a.entity.created和partition key下发布事件。a.entity.created作为消费群体订阅该主题b-consumers。这导致 B 实例之间的负载分布。由于分区键,关于同一实体的事件将按顺序传递。问题:
您不需要每个实体有一个单独的主题来确保消息的传递顺序。
相反,根据实体 ID(或实体的其他不可变标识符)为每条消息分配分区键,以确保涉及同一实体的事件始终传递到每个主题的同一分区。
即使多个生产者实例为同一实体发布消息,通常也会保留分区上消息的时间顺序(例如,如果 A1 和 A2 都为实体 E1 发布消息,则 E1 的分区键将确保所有 E1 消息均已传递)到同一分区,P1。)。在某些边缘情况下,排序不会被保留(例如,生产者的连接丢失),在这种情况下,您可能会考虑启用幂等性。
你是对的,在任何时候,消费者组中最多一个消费者将订阅单个主题分区,尽管一个消费者可以被分配到多个分区。例如,消费者 B2 可能会处理来自分区 P1(按顺序)以及来自另一个分区的所有消息。如果一个消费者死亡,那么另一个消费者将被分配到该分区(转换可能需要几秒钟)。
当消息上提供分区键时,默认情况下,消息到分区的分配是基于分区键的哈希完成的。在极少数情况下(例如,实体分区键非常少),这可能会导致分区上的消息分布不均匀,在这种情况下,如果您发现吞吐量受到不平衡的影响,您可以提供自己的分区策略。
综上所述,在为您的场景配置适当数量的分区后,您应该能够使用一致的分区键来满足您的设计目标,而无需对 Kafka 进行太多定制。