• rabbitmq

    • rabbitmq的消息可靠性
    • rabbitmq-幂等引出的性能分析
  • rocketmq
    • 从rabbitmq到rocketmq
  • kafka
    • 从rocketmq到kafka:集群、一致性与重平衡
  • pulsar
    • 本篇
  • 综合对比
    • 本篇

先来谈谈 pulsar

pulsar 可以简单的看做是 broker 集群 + bookkeeper集群 构成。broker 集群属于无状态集群,只处理业务逻辑;而 bookkeeper 集群属于有状态集群,负责处理数据存储。

这样的组合和我们平时的开发多么相似,无状态(业务)服务负责执行业务逻辑,有状态数据存储负责持久化数据。

那么,从这个角度理解,最起码我们对 pulsar 中为什么需要 broker 有了认识。最复杂的部分还是在于 bookkeeper。bookkeeper是什么呢?

A scalable, fault-tolerant, and low-latency storage service optimized for real-time workloads

pulsar 为什么选择 bookkeeper?对应我们日常开发中的存储方案选型,说明 bookkeeper 的某些特性非常适合pulsar定位的功能场景。至于特性是什么,在最后会推荐相关文章。

其实同理,当我们自研一款消息队列时,我们甚至可以用mysql来实现消息存储。为什么可以选择mysql呢?

前面已经学过,innodb也是顺序写入,支持WAL。innodb中也存在 Buffer Pool,可以批量缓存消息,并且消息本身不更新。总之,这些特性不会对性能造成太大影响。

而且可以将mysql单表看做是一个分区(队列),每个topic可以对应多张表。则这样也可以支持业务服务实现队列模型和发布-订阅模型。

经过这样的对比,现在我们就可以把关注点放到 bookkeeper。

bookkeeper是有状态服务,并且可以集群化。那么必然涉及到两个关键点:

  1. 数据写入磁盘的形式,以及数据存储形式

  2. 集群数据同步时,与CAP理论的博弈

我们先来看单机bookkeeper,也就是 bookie。如上图(引自Pulsar-Cloud Native Messaging & Streaming),先看蓝色部分,总共四个步骤:

  1. append entries(追加):顺序写入,类似mysql的日志写入

  2. 组提交:类似mysql中的组提交机制。bookie将数据写入磁盘同样采用同步刷盘机制,所以为了避免高并发写入时刷盘机制的影响,故可以利用组提交机制优化效果

  3. 写入缓存:类似Buffer Pool

  4. 响应给客户端:所以客户端收到成功ack,表示bookie的数据已经写入了磁盘

针对读取的执行路径:

  1. 缓存中数据会定期刷盘存储,存储前会进行排序等预处理。

  2. 并且同时增加一个索引存储,思想也类似于rocketmq中commitlog。

通过这样的设计实现了读写分离。接着看一下集群数据同步的设计。

在我们之前看过的raft等协议中,通常是领导者模型。只有领导者负责写入,这样的好处是避免并发写,将偏序变成了全序。但是缺点是领导者容易成为瓶颈,不过我们可以通过构建多个raft小集群的方式来缓解领导者压力。

而在 bookkeeper 中,在数据之上,又抽象出了 ledger 这个逻辑存储单元。那么显然的,一个 ledger对应的是多个数据条目,而这些数据条目可以来自于不同的 bookie。

ledger带来两大影响:

首先对于客户端来说(实际就是 pulsar 的broker),不关心数据实际如何存储,只关心和 ledger 的交互。

其次对于数据来说,被逻辑地划分为多个 ledger,所以同样可以看做是一种逻辑分区。有了逻辑分区,那么不同分区之间就不存在并发写入导致的偏序问题。并且,bookkeeper 规定一个ledger只能被一个客户端写入。这样也就解决了同一个逻辑分区中,多个客户端并发写入的问题,也就解决了偏序问题。

所以,bookkeeper(简称BK)中,每一个 bookie 都是平等的,并不需要有一个领导者bookie来维持全序关系。

到这里,我们可以看到,通过引入 ledger 这层抽象,系统设计也变得完全不同。所以抽象是多么的重要,编码、考虑问题、生活中也需要这样的抽象思维。

知道了 bookie 是平等的,那么肯定是客户端具有了领导者这样的意味。所以客户端是如何写入数据的呢?

这里 BK 采用了类似 NWR 机制,客户端可以灵活配置写入数量。比如有10个bookie(bookie平等,所以可以扩容),客户端可以决定一条消息需要同时发往n个bookie,并且当n个bookie中的m个bookie 返回成功后(m <= n),就认为写入成功。

客户端就是pulsar中的broker。当然,BK还有其他优化和特殊处理,这里不再做进一步对比。

以上是对 pulsar 的简要介绍,那么接着我们来对比一下 pulsar、rabbitmq、rocketmq、kafka 的选型问题。

先来看rabbitmq,基于erlang语言开发已经注定了rabbitmq在语言生态上的劣势,这就决定rabbitmq不会被用到高流量场景中,因为难以深度定制。当然,rabbitmq已支持丰富的客户端语言而出名,并且简单易用。多说一句,这就和最近的基金一样,机构抱团,强者越强。rocketmq、kafka、pulsar都是JVM生态,所以再次强调,社区非常重要。

对于rocketmq来说,最大的特点有两个:一是tag机制,可以定义子主题,这个机制就在很多场景下起到了关键作用;二是无缝支持canal等产品。基于这两个特点,就决定了rocketmq的应用场景。

然后是kafka,高性能就不说了,最关键的是kafka的定位不同,官网定义:

Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.

对比rocketmq:

Apache RocketMQ™ is a unified messaging engine, lightweight data processing platform.

再看一下rabbitmq的定义:

RabbitMQ is the most widely deployed open source message broker.

这样就没必要继续比较了,kafka不光是消息队列,更是流计算平台。所以要往流计算、大数据考虑,kafka肯定适合。

最后看看pulsar的定义:

Apache Pulsar is a cloud-native, distributed messaging and streaming platform

全面对标kafka,采用全新的架构,解决kafka中让人头疼的重平衡。但是pulsar真的是未来的主流吗?这句话不一定对,不过可以预见,未来新涌现的消息队列中,会有相当一部分采用pulsar类似的架构思想:存储和计算分离。

关于消息队列的内容本篇就全部完结。本系列针对消息队列的文章,更多的是为了联系之前学过的知识,加深印象,并从已有知识中分析新的知识,这也符合费曼学习法。Over!

pulsar分析以及各消息队列对比相关推荐

  1. 常见消息队列对比(ActiveMQ、ZeroMQ、kafka、RabbitMQ)?

    常见消息队列对比? 消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走. 通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息, ...

  2. Redis、Kafka 和 Pulsar 消息队列对比

    点击关注公众号,Java干货及时送达 导语 | 市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该 ...

  3. Redis、Kafka 和 Pulsar 消息队列对比,写得太好了!

    市面上有非常多的消息中间件,rabbitMQ.kafka.rocketMQ.pulsar. redis等等,多得令人眼花缭乱.它们到底有什么异同,你应该选哪个? 本文尝试通过技术演进的方式,以redi ...

  4. 千亿级金融场景下,基于Pulsar的云原生消息队列有怎样的表现?

    导语 | 云原生场景,多语言.多种协议兼容,任意多的消息 Topic.任意多的消费者,性能的按需快速扩展成为消息队列基本的要求.本文是对腾讯TEG技术委员会专家工程师刘德志老师在云+社区沙龙 onli ...

  5. win7系统中的消息队列服务器,高手分析win7系统安装消息队列的详细

    win7系统是计算机学员最喜欢使用的电脑系统,却有一些学员在操作过程中应该会面临对win7系统安装消息队列进行布置的情景.几乎所有的初学者计算机知识还很薄弱,关于win7系统安装消息队列的情况,仍旧一 ...

  6. 深入理解消息队列(场景,对比,原理和设计思想)

    导语 | 消息队列也通常称为消息中间件,提到消息队列,大部分互联网人或多或少都听过该名词.对于后端工程师而言,更是日常开发中必备的一项技能.随着大数据时代的到来,apache旗下的Kafka一度成为消 ...

  7. 关于消息队列ActiveMQ、RocketMQ、RabbitMQ、Kafka原理机制以及优劣势的分析

    复习要点 本文大概围绕如下几点进行阐述: 为什么使用消息队列? 使用消息队列有什么缺点? 消息队列如何选型? 如何保证消息队列是高可用的? 如何保证消息不被重复消费? 如何保证消费的可靠性传输? 如何 ...

  8. 大数据-消息队列:Pulsar

    这两年pulsar发展比较快,有好多大公司引入了pulsar,相关的资料和课程也多了,今天一起来了解一下pulsar这款中间件. Pulsar官网:Hello from Apache Pulsar | ...

  9. PHP消息队列用法实例分析

    这篇文章主要介绍了PHP消息队列用法,结合实例形式分析了PHP消息队列用于Linux下进程间通信的相关技巧,需要的朋友可以参考下 该消息队列用于linux下,进程通信 队列状态信息:具体参考手册 转载 ...

最新文章

  1. Qt 不再使用 LGPLv2.1 授权
  2. zabbix 监控CDN带宽
  3. 我要做 Android 之面笔试总结
  4. Java 中浮点数---------BigDecimal和double(初探)
  5. mysql deadlock found when trying to get lock暴力解决
  6. openmv集成应用_使用OpenMV引导无人机飞行
  7. Spring-framework应用程序启动loadtime源码分析笔记(二)——@Transactional
  8. android最新设计规范,Android应用未来的设计规范
  9. 解决jQuery与其他库冲突的方法
  10. ubuntu无法登陆mysql_ubuntu11.04mysql报错、无法正常工作、无法登陆mysql
  11. 计算机注销之后一直黑屏,win7系统注销出现黑屏怎么办_win7系统注销出现黑屏的修复办法...
  12. ES6 Set结构和Map结构(上)
  13. android为APK新建SELINUX权限域seapp_contexts
  14. tfidf算法 python_Python TFIDF计算文本相似度
  15. 在同一窗口能显示多个幻灯片_如何让两个PPT文件在电脑屏幕中同时显示
  16. 句子迷,语录,俞凌雄
  17. 完美卸载office
  18. ArcEngine实现要素类排序的四种方法
  19. python二级证书考试难度_全国计算机等级考试 python二级考试体验及小技巧总结...
  20. 什么是物联网 (IoT)?

热门文章

  1. xp任务栏不显示任务 vbs脚本
  2. 整流线性单元(Relu)及其变种(Leaky Relu、PRelu、ELU、SELU、CRelu、RRelu)
  3. 怎样恢复文件默认打开方式
  4. 黑马程序员——java基础---网络编程
  5. 让人爱不释手的工具,每款都是高质量工具分享
  6. QQ群文件更改默认下载路径方法
  7. 大数据毕业设计_计算机专业如何才能更好的完成毕业设计呢?
  8. CentOS7 NVIDIA显卡驱动安装教程(亲测有效)
  9. 计算机网络基础【2】
  10. spring定时任务的应用