首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我是否可以使用单个Pulsar客户端发布/消费Apache pulsar的多个命名空间和主题?

我是否可以使用单个Pulsar客户端发布/消费Apache pulsar的多个命名空间和主题?
EN

Stack Overflow用户
提问于 2020-01-29 19:56:24
回答 1查看 705关注 0票数 4

我正在尝试使用Apache Pulsar编写一个多租户(多名称空间)系统。我似乎无法实现的是使用单个客户端/连接发布到这些命名空间中的多个命名空间和主题。消费者方面也是如此。从本质上讲,我希望使用单个应用程序实例能够发布到多个名称空间和主题,而使用一个消费者应用程序能够在消费时做到这一点。我只是想知道这是否可能。

我不想为M个命名空间和每个命名空间的N个主题维护M*N个连接。我看到pulsar中支持正则表达式,但是如果我想单独使用每个主题,那么在消费者端这意味着什么(我会从匹配正则表达式的所有主题得到混合的消息吗?)

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 06:42:06

您可以使用客户端中的多个生产者在单个客户端中发布到多个主题。但是,生产者和主题之间存在一对一的关系。根据Pulsar binary protocol的文档,Pulsar首先在生产者和单个主题(在特定的租户/名称空间中)之间建立关系:

代码语言:javascript
代码运行次数:0
运行
复制
message CommandProducer {
  "topic" : "persistent://my-property/my-cluster/my-namespace/my-topic",
  "producer_id" : 1,
  "request_id" : 1
}

当它发送消息时,它引用生产者ID:

代码语言:javascript
代码运行次数:0
运行
复制
message CommandSend {
  "producer_id" : 1,
  "sequence_id" : 0,
  "num_messages" : 1
}

由于生产者和主题之间的这种关系,因此要发送到多个主题,您需要多个生产者。

下图说明了如何设置生产者并发送消息:

下面是一些Java代码,演示了一个客户端中的多个生产者,以发送到多个主题:

代码语言:javascript
代码运行次数:0
运行
复制
       // 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 here关于使用正则表达式订阅多个主题的很好的分析。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59966588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档