200 行代码告诉你 TDMQ 中 Pulsar 广播如何实现
导读
Pulsar 作为 Apache 社区的相对新的成员,在业界受到非常大量的关注。新产品的文档相对不齐全也是非常能够理解的。今天客户问过来广播怎么实现的,我解释了半天,又找了很多介绍产品的 PPT,最终也没有找到“官方”的文档说明这个事情。于是我就写了这篇文章,方便大家 copy/paste 。
作者介绍
徐为
腾讯云微服务团队高级解决方案构架师
毕业于欧盟 Erasmus Mundus IMMIT,获得经济和IT管理硕士学位
自2006年以来,曾就职于SonyEricsson、SAP等多家公司,历任软件开发工程师,数据开发工程师,解决方案架构师
Pulsar订阅模型分类
Pulsar 原文支持的几种模式如下,依次是 独占模式 / 高可用模式 / 分享模式 / 基于键值 的分享模式。
如果这几个模式还没有理解的,可以去官网先看一下,我个人觉得看过应该是可以理解的:
https://pulsar.apache.org/docs/en/concepts-messaging/#subscriptions
Pulsar 广播模式
Pulsar 的订阅模式和很多 MQ 不太一样。比如 RabbitMQ/Kafka 等,一般消费端(Consumer)是直接去对接 Topic 的,然后 Consumer 自己又有个组的概念在配置中心去设置 offset,以此来决定是一起分享 Topic 的数据,还是每个人都接收同样的数据。在 Pulsar 的消费订阅模型里,添加了一个 Subscription 的逻辑,Subscription 的 Type 决定了消费是独享还是分享。
于是广播模式可以用不同 Subscription 独享的模式来实现,具体架构可以参照下图:
代码实现
1. Full-mesh 的形创建 Java 项目(比如:Springboot - 这个应该是相对简单的 IDE 集成开发组件)
画重点
-
pulsar-client-api 和 tdmq-client 需要2.6.0 -
tdmq-client 需要在腾讯的repo里才能拿到,需要使用介绍链接介绍的方式进行maven的配置(gradle方法类似) 介绍链接:https://cloud.tencent.com/document/product/1179/44914
<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;
(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() {
}
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;
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;
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;
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个一起接收一样的消息
话不多说,赶紧跑起来玩玩吧!
有相关需求的读者欢迎留言告诉我们你的想法!
往期
推荐
扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!
解锁超多鹅厂周边!
本文分享自微信公众号 - 腾讯云中间件(gh_6ea1bc2dd5fd)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
openGauss 首个城市用户组正式成立
26/03/2021 国际开源谷 | 深圳 3月26日,由openGauss社区和海量数据共同举办的openGauss Meetup在深圳国际开源谷顺利举行,同时openGauss首个城市用户组也正式成立。 深圳城市用户组人员名单: 角色 姓名 公司 职位 Organizer 李景娥 海量数据 大湾区企业客户部总经理 Ambassador 林根 海量数据 大湾区技术总监 田文罡 华为 openGauss架构师 李思昊 华为 CCF委员 熊小军 华为 openGauss布道师 周俊 视源股份 数据运维部门经理 Member 朱彬 华为 深圳产品经理 王铭玥 海量数据 产品发展部 *此表名单于2021年3月26日更新 openGauss城市用户组,英文名称:openGauss User Group,简称oGUG. 是openGauss用户发起的以城市为组织单位的社群组织,聚集对开源关系型数据库管理系统openGauss认同或使用的企事业单位、社会组织、个人开发者。 oGUG致力于构建一个开放、多元、包容的openGauss城市用书交流社区,鼓励当地任何企事业单位、社会组织、个人开发者在该社...
- 下一篇
云计算对医疗保健行业的影响
云计算提供了增强的数据安全性,简化了数据处理,提供了高质量的医疗护理,并提供了经济高效的解决方案。云计算带来了诸多好处,它已经涉足医疗保健行业,并且正在不断增长。英国广播公司日前发布的一份研究报告指出,到2022年,全球医疗领域在云计算方面的支出预计将达到350亿美元,复合年增长率将提高15%。到2025年,云计算医疗市场的规模预计将达到550亿美元。 以下将深入了解什么是基于云计算的医疗保健系统以及它是如何工作的。 什么是基于云计算的医疗保健系统? 云计算提供了计算资源(如数据存储)的按需可用性。云平台作为互联网上可用的数据中心,分布在多个位置并由中央服务器控制。它可以轻松存储数据,并可以随时从任何设备进行访问。 医疗保健行业中的云服务是指集成云计算技术以开发和管理基于云计算的医疗保健解决方案。基于云计算的解决方案通过按需访问提供了巨大的存储资源,这是传统医疗保健系统无法实现的。它还支持医院人力资源系统(HER)、图像和基因组数据分载的大型数据集。云服务还提供了医生和其他医疗保健提供者之间的轻松数据共享,并允许他们远程访问数据。此外,它提供了有关诊断信息的分析和监视,并提高了整体性能...
相关文章
文章评论
共有0条评论来说两句吧...