如何实现TDMQ中的Pulsar 广播,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
Pulsar订阅模型分类
Pulsar 支持的几种模式如下,依次是 独占模式 / 高可用模式 / 分享模式 / 基于键值 的分享模式。
Pulsar 广播模式
Pulsar 的订阅模式和很多 MQ 不太一样。比如 RabbitMQ/Kafka 等,一般消费端(Consumer)是直接去对接 Topic 的,然后 Consumer 自己又有个组的概念在配置中心去设置 offset,以此来决定是一起分享 Topic 的数据,还是每个人都接收同样的数据。在 Pulsar 的消费订阅模型里,添加了一个 Subscription 的逻辑,Subscription 的 Type 决定了消费是独享还是分享。
于是广播模式可以用不同 Subscription 独享的模式来实现,具体架构可以参照下图:
代码实现
1. Full-mesh 的形创建 Java 项目(比如:Springboot - 这个应该是相对简单的 IDE 集成开发组件)
画重点
介绍链接:https://cloud.tencent.com/document/product/1179/44914
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.examble.demo</groupId> <artifactId>tdmq-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>tdmq-demo</name> <description>demo project to test tdmq</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.tencent.tdmq</groupId> <artifactId>tdmq-client</artifactId> <version>2.6.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.pulsar/pulsar-client-api --> <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-client-api</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
2. 创建一个 Component 用来全局使用 Producer 和 Consumers
这里创建了1个 Producer 和3个拥有 exclusive subscription 的 consumers(广播模式 - 我们期待他们3个每次都收到一样的信息)
package com.example.demo.tdmq.instance;import javax.annotation.PostConstruct;import org.apache.pulsar.client.api.AuthenticationFactory;import org.apache.pulsar.client.api.Consumer;import org.apache.pulsar.client.api.Message;import org.apache.pulsar.client.api.MessageListener;import org.apache.pulsar.client.api.Producer;import org.apache.pulsar.client.api.PulsarClient;import org.apache.pulsar.client.api.PulsarClientException;import org.apache.pulsar.client.api.SubscriptionType;import org.springframework.beans.factory.config.ConfigurableBeanFactory;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;@Component@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public class Global { PulsarClient client; public Producer<byte[]> producer; public Consumer<byte[]> consumer01; public Consumer<byte[]> consumer02; public Consumer<byte[]> consumer03; public Global() { } @PostConstruct public void init() { try { client = PulsarClient.builder().serviceUrl("pulsar://<Your TDMQ Pulsar Service URL>:6000/") .listenerName("custom:<TDMQ Pulsar Instance ID>/<TDMQ VPC ID>/<TDMQ Subnet ID>") .authentication(AuthenticationFactory.token( "<Your Credential Token from TDMQ>")) .build(); producer = client.newProducer().topic("persistent://<TDMQ Pulsar Instance ID>/<your name space>/<your topic>").create(); consumer01 = client.newConsumer().subscriptionType(SubscriptionType.Exclusive) .topic("persistent://<TDMQ Pulsar Instance ID>/<your name space>/<your topic>") .messageListener(new MessageListener<byte[]>() { /** * */ private static final long serialVersionUID = 1L; @Override public void received(Consumer<byte[]> consumer, Message<byte[]> msg) { System.out.println("Consumer01" + " - " + System.currentTimeMillis() + " - " + new String(msg.getData())); try { consumer.acknowledge(msg); } catch (PulsarClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).subscriptionName("my-subscription01").subscribe(); consumer02 = client.newConsumer().subscriptionType(SubscriptionType.Exclusive) .topic("persistent://<TDMQ Pulsar Instance ID>/<your name space>/<your topic>") .messageListener(new MessageListener<byte[]>() { /** * */ private static final long serialVersionUID = 1L; @Override public void received(Consumer<byte[]> consumer, Message<byte[]> msg) { System.out.println("Consumer02" + " - " + System.currentTimeMillis() + " - " + new String(msg.getData())); try { consumer.acknowledge(msg); } catch (PulsarClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).subscriptionName("my-subscription02").subscribe(); consumer03 = client.newConsumer().subscriptionType(SubscriptionType.Exclusive) .topic("persistent://<TDMQ Pulsar Instance ID>/<your name space>/<your topic>") .messageListener(new MessageListener<byte[]>() { /** * */ private static final long serialVersionUID = 1L; @Override public void received(Consumer<byte[]> consumer, Message<byte[]> msg) { System.out.println("Consumer03" + " - " + System.currentTimeMillis() + " - " + new String(msg.getData())); try { consumer.acknowledge(msg); } catch (PulsarClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).subscriptionName("my-subscription03").subscribe(); } catch (PulsarClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
3. 最外层的测试代码和简单的 Message 模型
public class MessageModel { private String messageText = null; public String getMessageText() { return messageText; } public void setMessageText(String messageText) { this.messageText = messageText; }}
跑起来测试一下,果然3个一起接收一样的消息
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4587289/blog/5006986