我应该在每个服务 spring kafka 中创建 NewTopics 吗?
Posted
技术标签:
【中文标题】我应该在每个服务 spring kafka 中创建 NewTopics 吗?【英文标题】:Should i create NewTopics in each service spring kafka? 【发布时间】:2021-10-18 10:42:06 【问题描述】:我正在使用 Kafka 在服务之间发送消息。我使用 NewTopic bean 来配置分区数,例如:
@Bean
fun kafkaTopic(kafkaProperties: KafkaProperties): NewTopic = NewTopic(
kafkaProperties.topics.schedulerCalculationTopic.name,
kafkaProperties.topics.schedulerCalculationTopic.partitions,
1
)
我的问题很简单,我应该将此 bean 添加到消费者服务和生产者服务中还是只添加其中一个?
【问题讨论】:
您也可以使用 Terraform 或其他工具在 cicd 管道中创建主题,而不是将其捆绑为应用程序代码的一部分 【参考方案1】:我会将它放在生产者服务中,然后将生产者视为这些主题的“所有者”。
但是如果你有一个场景,如果你有多个生产者来处理同一个主题,那就有点复杂了。
【讨论】:
我会有 2 个或更多的生产者实例和一些消费者实例,在这种情况下是否有问题? 哦,还有一个问题。在一种情况下,消费者和生产者将在 1 个应用程序中,该应用程序将具有 2 个或更多实例 同一服务(生产者)的多个实例我不认为有问题,但如果您有不同的服务都针对同一主题生产 - 那么说哪个可能是个问题他们是主题的“主人/所有者”:-)【参考方案2】:如果您不是即时创建主题,最佳做法是在读取/写入主题之前创建主题。
基本原理是防止代理在收到元数据获取请求或使用相同主题名称的消费请求时创建主题。否则,如果消费者在生产者之前启动,您可能会得到错误的分区数。 (Broker 将使用默认分区数设置创建您的主题。)
【讨论】:
以上是关于我应该在每个服务 spring kafka 中创建 NewTopics 吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring JMS 在 ActiveMQ 中创建多个侦听器
如何在@TestFactory 的每个测试中创建不同的 Spring 上下文?