Apache kafka 配置AggregatingReplyingKafkatTemplate以获取来自多个主题和多个使用者实例的响应
这是我贴出的另一个问题的继续。 以下是前面问题的链接: 我有一个需求,我已经尝试创建一个图表 我的要求是确保节点1应接收响应R1M1和R1M2,节点2应接收响应R2M1和R2M2。Apache kafka 配置AggregatingReplyingKafkatTemplate以获取来自多个主题和多个使用者实例的响应,apache-kafka,kafka-consumer-api,spring-kafka,Apache Kafka,Kafka Consumer Api,Spring Kafka,这是我贴出的另一个问题的继续。 以下是前面问题的链接: 我有一个需求,我已经尝试创建一个图表 我的要求是确保节点1应接收响应R1M1和R1M2,节点2应接收响应R2M1和R2M2。 consumerConfigProps.put(ConsumerConfig.GROUP_ID_CONFIG, "xxxx.yyyyy.zzzz"); 实施的事项: 在两个节点的生产者记录中设置KafkaHeaders.CORRELATION\u ID KafkCamessageListe
consumerConfigProps.put(ConsumerConfig.GROUP_ID_CONFIG, "xxxx.yyyyy.zzzz");
实施的事项:
- 在两个节点的生产者记录中设置KafkaHeaders.CORRELATION\u ID
- KafkCamessageListenerContainerBean使用容器属性中的两个响应主题创建。 ContainerProperties ContainerProperties=新的containerProperty(output-message-topic1,output-message-topic2)强>
- 聚合回复kafkatemplate.setSharedReplyTopic(true)强>
- consumerFactory配置了单个groupId。
consumerConfigProps.put(ConsumerConfig.GROUP_ID_CONFIG, "xxxx.yyyyy.zzzz");
- 我能够用一个节点实现多个响应消息的聚合
- 由于infra的限制,无法为每个使用者(节点)创建单独的主题
group.id
,以便向这两个实例发送回复(并被未发出请求的实例丢弃)
使用单个回复TopicPartitionOffset
进行配置时,只要每个实例侦听不同的分区,就可以对多个模板使用相同的回复主题。配置单个回复主题时,每个实例必须使用不同的group.id
。在这种情况下,所有实例都会收到每个回复,但只有发送请求的实例才能找到相关ID。这可能有助于自动缩放,但会带来额外网络流量的开销和丢弃每个不需要的回复的小成本。使用此设置时,我们建议您将模板的sharedReplyTopic
设置为true,这将降低要调试的意外回复的日志记录级别,而不是默认错误
如果您有多个客户端实例,并且没有按照前面的讨论配置它们,那么每个实例都需要一个专用的回复主题。另一种方法是设置KafkaHeaders.REPLY\u分区
,并为每个实例使用专用分区。标头包含一个四字节的整数(大端)。服务器必须使用此标头将应答路由到正确的分区(@KafkaListener
执行此操作)。但是,在这种情况下,应答容器不能使用Kafka的组管理功能,必须配置为在固定分区上侦听(通过在其containerProperty
构造函数中使用TopicPartitionOffset
)
拉塞尔:我想我需要创建2个回复主题PartitionOffset。下面是我配置KafkCamessageListenerContainerBean的方式<代码>TopicPartitionOffset Topic1偏移=新的TopicPartitionOffset(响应-topic-1,0);TopicPartitionOffset topic2offset=新的TopicPartitionOffset(响应-topic-2,0);ContainerProperties ContainerProperties=新的ContainerProperty(Topic1偏移,Topic2偏移)代码>并且我的实现确实有多个客户端实例。这是否意味着我必须使用第二种方法使用KafkaHeaders.REPLY_分区?对于2个主题,每个实例应该只侦听一个主题。一个关于主题1,另一个关于主题2。这样,模板就可以自动设置回复标题,您无需担心它们。您也可以通过这种方式在一个主题中使用两个分区。