您可以使用客户端中的多个生产者发布到单个客户端中的多个主题。但是,生产者和主题之间存在一对一的关系。从Pulsar 二进制协议的文档中,Pulsar 首先建立了生产者和单个主题(在特定租户/命名空间中)之间的关系:
message CommandProducer {
"topic" : "persistent://my-property/my-cluster/my-namespace/my-topic",
"producer_id" : 1,
"request_id" : 1
}
当它发送消息时,它会引用生产者 ID:
message CommandSend {
"producer_id" : 1,
"sequence_id" : 0,
"num_messages" : 1
}
由于生产者和主题之间存在这种关系,因此要发送到多个主题,您需要多个生产者。
此图说明了设置生产者和发送消息:
下面是一些 Java 代码,说明了客户端中的多个生产者发送到多个主题:
// Create client object
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar+ssl://useast2.aws.kafkaesque.io:6651")
.authentication(
AuthenticationFactory.token("eyJhbGciOiJS...")
)
.build();
// Create producer on a topic
Producer<byte[]> producer1 = client.newProducer()
.topic("persistent://tenant/local-useast2-aws/test-topic4")
.create();
// Create another producer on a different namespace/topic
Producer<byte[]> producer2 = client.newProducer()
.topic("persistent://tenant/namespace2/test-topic5")
.create();
// Send messages on the producers
producer1.newMessage().value("ping from producer1".getBytes()).send();
producer2.send("ping".getBytes());
// Send close the producers
producer1.close();
producer2.close();
在消费者方面,就像生产者一样,您可以在客户端中使用多个消费者来消费多个主题。或者,您可以使用正则表达式将单个使用者与多个主题相关联。但是,是的,您将收到来自与该消费者的正则表达式匹配的所有主题的消息。顺便说一句,您可以在此处阅读 Jack Vanlightly 对使用正则表达式订阅多个主题的精彩分析。