SpringCloud 用Kafka Binder进行分区
2023-11-28 16:33 更新
Apache Kafka本机支持主题分区。
有时,将数据发送到特定的分区是有好处的-例如,当您要严格订购消息处理时(特定客户的所有消息应转到同一分区)。
以下示例显示了如何配置生产方和消费者方:
@SpringBootApplication @EnableBinding(Source.class) public class KafkaPartitionProducerApplication { private static final Random RANDOM = new Random(System.currentTimeMillis()); private static final String[] data = new String[] { "foo1", "bar1", "qux1", "foo2", "bar2", "qux2", "foo3", "bar3", "qux3", "foo4", "bar4", "qux4", }; public static void main(String[] args) { new SpringApplicationBuilder(KafkaPartitionProducerApplication.class) .web(false) .run(args); } @InboundChannelAdapter(channel = Source.OUTPUT, poller = @Poller(fixedRate = "5000")) public Message<?> generate() { String value = data[RANDOM.nextInt(data.length)]; System.out.println("Sending: " + value); return MessageBuilder.withPayload(value) .setHeader("partitionKey", value) .build(); } }
application.yml。
spring: cloud: stream: bindings: output: destination: partitioned.topic producer: partitioned: true partition-key-expression: headers['partitionKey'] partition-count: 12
必须为该主题提供足够的分区,以实现所有消费者组所需的并发性。上面的配置最多支持12个使用者实例(如果
concurrency
为2,则为6;如果并发值为3,则为4,依此类推)。通常最好“ 过量供应 ”分区,以使将来的使用者或并发性增加。
前面的配置使用默认分区(
key.hashCode() % partitionCount
)。根据键值,这可能会或可能不会提供适当的平衡算法。您可以使用partitionSelectorExpression
或partitionSelectorClass
属性覆盖此默认设置。
由于分区是由Kafka本地处理的,因此在使用者端不需要特殊配置。Kafka在实例之间分配分区。
以下Spring Boot应用程序侦听Kafka流,并打印(到控制台)每条消息去往的分区ID:
@SpringBootApplication @EnableBinding(Sink.class) public class KafkaPartitionConsumerApplication { public static void main(String[] args) { new SpringApplicationBuilder(KafkaPartitionConsumerApplication.class) .web(false) .run(args); } @StreamListener(Sink.INPUT) public void listen(@Payload String in, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) { System.out.println(in + " received from partition " + partition); } }
application.yml。
spring: cloud: stream: bindings: input: destination: partitioned.topic group: myGroup
您可以根据需要添加实例。Kafka重新平衡分区分配。如果实例计数(或instance count * concurrency
)超过了分区数,则某些使用者处于空闲状态。
以上内容是否对您有帮助:
更多建议: