SpringCloud 用RabbitMQ Binder分区
RabbitMQ不支持本地分区。
有时,将数据发送到特定分区是有利的-例如,当您要严格订购消息处理时,特定客户的所有消息都应转到同一分区。
RabbitMessageChannelBinder
通过将每个分区的队列绑定到目标交换机来提供分区。
以下Java和YAML示例显示了如何配置生产者:
制片人。
@SpringBootApplication @EnableBinding(Source.class) public class RabbitPartitionProducerApplication { private static final Random RANDOM = new Random(System.currentTimeMillis()); private static final String[] data = new String[] { "abc1", "def1", "qux1", "abc2", "def2", "qux2", "abc3", "def3", "qux3", "abc4", "def4", "qux4", }; public static void main(String[] args) { new SpringApplicationBuilder(RabbitPartitionProducerApplication.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.destination producer: partitioned: true partition-key-expression: headers['partitionKey'] partition-count: 2 required-groups: - myGroup
前例中的配置使用默认分区(
key.hashCode() % partitionCount
)。根据键值,这可能会或可能不会提供适当的平衡算法。您可以使用partitionSelectorExpression
或partitionSelectorClass
属性覆盖此默认设置。仅当在部署生产者时需要提供消费者队列时,才需要
required-groups
属性。否则,发送到分区的所有消息都将丢失,直到部署了相应的使用者为止。
以下配置提供了主题交换:
该交换绑定了以下队列:
以下绑定将队列与交换关联:
以下Java和YAML示例继续了前面的示例,并显示了如何配置使用者:
消费者。
@SpringBootApplication @EnableBinding(Sink.class) public class RabbitPartitionConsumerApplication { public static void main(String[] args) { new SpringApplicationBuilder(RabbitPartitionConsumerApplication.class) .web(false) .run(args); } @StreamListener(Sink.INPUT) public void listen(@Payload String in, @Header(AmqpHeaders.CONSUMER_QUEUE) String queue) { System.out.println(in + " received from queue " + queue); } }
application.yml。
spring: cloud: stream: bindings: input: destination: partitioned.destination group: myGroup consumer: partitioned: true instance-index: 0
RabbitMessageChannelBinder
不支持动态缩放。每个分区至少必须有一个使用方。使用者的instanceIndex
用于指示使用了哪个分区。诸如Cloud Foundry之类的平台只能具有一个带有instanceIndex
的实例。
更多建议: