在工作中,大家比较熟悉的消息中间件主要有:rabbitmq,kafka,rocketmq等。今天主要给大家介绍下号称下一代标准的消息中间件 - apache pulsar 是什么?
其实pulsar对于很多只会基本使用消息中间件的朋友来说,他没有什么心仪的地方,他和kafka,rocketmq等都是差不多使用的,都统一是producer,consumer,broker 3大套间组成。但是为什么他又号称是下一次的消息中间件呢? 其实他主要的不同主要是架构的不同和一些细节性的不同。下面我们挨个来介绍下。
一、什么是apache pulsar
官方的解释是:Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。
看到了吧,他最大的不同主要是架构上的不同,他支持的主要是存算分离,在kafka和rocketmq上存算是一体的,pulsar是存算分离的。同时pulsar也支持在broker端进行小型的function etl计算,所以在实际的应用中有很大的价值,例如我们在发送消息的时候,制作一个规则引擎方法放到function里面,是不是就可以极大的简化我们的业务了呢?
二、apache pulsar的架构
上诉的架构图就是整个pulsar的架构图,它主要由两部分主城,broker和bookie,这里的broker主要作为client端进行转发或者function计算的作用,真正存储的是bookie。所以这个时候,我们可以想象一下,在部署的时候broker是不是可以放在高配cpu和内存,低配磁盘的服务器上,Bookie是不是可以部署在低配cpu和内存,大容量磁盘的服务器上呢?对于消息存储服务器来说,大容量的存储是一个刚需,拓展的时候是不是就很方便了呢?
三、架构讲解之producer
刚才我们提到pulsar的主要构成也需要producer,所有的消息队列服务器都需要producer,不然消息怎么放到消息队列来呢?是吧?所以在这里我们介绍下producer。
使用producer的话,这里和kafka是一样的,
1、首先需要一个对应的topic,在kafka的api中我们直接提供一个topic就可以了,但是在pulsar中,我们提供的topic样式是:
{persistent|non-persistent}://tenant/namespace/topic
这个样式看起来就像是一个URI一样。挨个介绍下。
第一个参数persistent/non-persistent 这里主要代表的是当前的队列是否需要进行消息存储,如果选择persistent,则消息会被存储到磁盘,遇到pulsar重启的时候,数据也不会丢失,如果选择non-persistent的话,topic的数据只会被存储到内存里面,遇到pulsar重启的时候,数据就会丢失掉。
第二个参数tennant,这里主要代表的就是一个租户,在业务中,我们可以自定义,例如数据中台的租户,电商系统的租户,用户系统的租户等
第三个参数namespace,这里大家应该都很熟悉的,现在java大部分的第三方组件都需要命名一个namespace,所以自定义即可,例如数据中台项目中可能存在多个线,这些线里面由于命名好记,可能存在多个相同名称的topic,那么这里就需要使用namespace进行隔离。
第四个参数topic,这里主要代表的是对应的topic,和其他消息队列的topic是一个层面的意思。
2、发送方式的支持
在pulsar中,发送消息的方式支持同步和异步,这个和kafka和rocketmq是一样的,但是有一些小细节是不一样的,pulsar和kafka支持的同步其实是一个伪异步,这个伪异步在api代码里面看不出来,是在pulsar broker或者kafka broker层的源码做的。rocket呢,是一个真的同步,会连接所有的broker服务器,并且得到ack确认。
3、单个发送和批量发送的支持
pulsar和kafka这点上也是差不多的,都是批量的向服务器发送,发送的时候需要设置时间间隔和max number。
三、架构讲解之consumer
刚才我们提到pulsar的主要构成也需要consumer,因为所有进入到pulsar消息队列的消息始终是需要被消费的,不然数据会一直被存储在消息队列里面,日积月累越来越多很麻烦。所以在这里我们介绍下consumer。
1、首先还是一样,需要一个对应的topic,在kafka的api里面,我们只需要提供一个topic加一个消费的consumer名称。但是在pulsar里面添加topic是不一样的。在这里我们提供的topic样式是:
{persistent|non-persistent}://tenant/namespace/topic
和producer的uri是一样的。这里就不再介绍了。
2、consumer消费模式
在pulsar里面,消费者的消费模式是:独占、灾备、共享、键共享。独占和灾备模式都是只允许同时存在一个consumer进行消费,不能多个consumer,多个consumer的话会直接报错:注册失败。如果想要增大消费数量的话,可以选择共享。独占的模式一般来源于顺序性的消费。
还有这里的consumer消费模式和kafka也是不一样的。
1)、consumer的消费数量不由broker绝对,就像kafka,比如我们有10个broker,那么最多10个同group的consumer启动后能消费消息,多余的consumer都没用,pulsar呢,如果有10个broker,启动1000个consumer都能保证这1000个consumer能消费到数据。
2)、kafka的consumer是客户端直接去拉取的,pulsar呢,主要是服务器端主动推送的。
四、架构讲解之broker
在pulsar中broker主要是用于做路由和计算的节点。这里就不多解释了。
五、架构讲解之bookeeper
在pulsar中bookeeper主要作为数据存储的节点。这里就不多解释了。
还没有评论,来说两句吧...