如何实现TDMQ中的Pulsar广播

如何实现TDMQ中的Pulsar 广播,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

10年积累的网站建设、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有汪清免费网站建设让你可以放心的选择与我们合作。

Pulsar 作为 Apache 社区的相对新的成员,在业界受到非常大量的关注。新产品的文档相对不齐全也是非常能够理解的。今天客户问过来广播怎么实现的,我解释了半天,又找了很多介绍产品的 PPT,最终也没有找到“官方”的文档说明这个事情。于是我就写了这篇文章,方便大家 copy/paste 。

Pulsar订阅模型分类

Pulsar 支持的几种模式如下,依次是 独占模式 / 高可用模式 / 分享模式 / 基于键值 的分享模式。

如何实现TDMQ中的Pulsar 广播  

 

Pulsar 广播模式

Pulsar 的订阅模式和很多 MQ 不太一样。比如 RabbitMQ/Kafka 等,一般消费端(Consumer)是直接去对接 Topic 的,然后 Consumer 自己又有个组的概念在配置中心去设置 offset,以此来决定是一起分享 Topic 的数据,还是每个人都接收同样的数据。在 Pulsar 的消费订阅模型里,添加了一个 Subscription 的逻辑,Subscription 的 Type 决定了消费是独享还是分享。

于是广播模式可以用不同 Subscription 独享的模式来实现,具体架构可以参照下图:

如何实现TDMQ中的Pulsar 广播  

 

代码实现

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

<?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个一起接收一样的消息

如何实现TDMQ中的Pulsar 广播    

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。

新闻标题:如何实现TDMQ中的Pulsar广播
URL链接:https://www.cdcxhl.com/article26/pdgejg.html

成都网站建设公司_创新互联,为您提供网站导航面包屑导航企业网站制作品牌网站设计手机网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都做网站