【问题标题】:Send message in specific partition of Topic在主题的特定分区中发送消息
【发布时间】:2020-10-22 21:54:46
【问题描述】:

生产者有什么方法可以将消息发送到代理中的特定主题分区?

截至目前,可以发送具有 2 个分区的主题,但无法控制在特定分区中发送。

Component
@EnableBinding(Source.class)
public class RsvpsKafkaProducer {
  
    private static final int SENDING_MESSAGE_TIMEOUT_MS = 10000;

    private final Source source;

    public RsvpsKafkaProducer(Source source) {
        this.source = source;
    }

    public void sendRsvpMessage(WebSocketMessage<?> message) {
        
         System.out.println("sendRsvpMessage");
         source.output()
                .send(MessageBuilder.withPayload(message.getPayload())
                        .build(),
                        SENDING_MESSAGE_TIMEOUT_MS);   
    }
}

application.properties

spring.cloud.stream.kafka.binder.zkNodes=localhost:2181
spring.cloud.stream.kafka.binder.brokers=localhost:9093

spring.cloud.stream.bindings.output.destination=meetupTopic
spring.cloud.stream.bindings.output.producer.partitionCount=2

spring.cloud.stream.bindings.output.content-type=text/plain
spring.cloud.stream.bindings.output.producer.headerMode=raw

有什么方法可以使用 spring cloud stream 来实现吗?我希望一些消息进入P1 分区,一些消息进入meetupTopic 内的P2 分区。

【问题讨论】:

  • 也许你应该考虑使用组?
  • @jr593,意思是?
  • 这个消息生成器类是什么?你能提供一些细节吗?来自 kafka 的 ProducerRecord 可以直接提供您要发送到的分区,因此 MessageBuilder 应该以某种方式公开相同的功能。

标签: java spring apache-kafka spring-cloud-stream


【解决方案1】:
MessageBuilder.withPayload(message.getPayload())
                        .setHeader(KafkaHeaders.PARTITION_ID, 23)
                        .build()

【讨论】:

【解决方案2】:

我还没有尝试过,但是从docs 看来,它可能会起作用。

spring.cloud.stream.bindings.output.producer.partitionSelectorExpression=headers['partitionKey']

然后在发送消息时添加标题partitionKey

【讨论】:

  • 这行得通,但它需要partitioned=true,它适用于更复杂的应用程序级分区——只需设置KafkaHeaders.PARTITION_ID 标头就更简单了。这是底层 spring-integration-messaging 基础设施使用的默认机制。
  • 不错的解决方案 Gary,我一直在寻找类似的东西,但找不到。
猜你喜欢
  • 2018-10-23
  • 2021-08-27
  • 1970-01-01
  • 2020-03-19
  • 2017-12-16
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
相关资源
最近更新 更多