因为要引入Notification机制和log的监控和查看,大概率是需要MQ这类工具,所以研究了下目前比较火热的开源的MQ软件:

Rabbit MQ, Kafka还有Pulsar.

其实这三个软件虽说都适合MQ的场景,但是其实侧重点有很大的不同.

RabbitMQ: 是AMQP(Advance Message Queuing protocol)的实现,是典型的消息中间件产品。它的特点是富broker端,傻消费者,并且对消息路由支持的很好。

缺点是消息存储功能弱,在RabbitMQ中存储大量的消息是个典型的反模式,相应的,也不支持消息的回看。

Kafka: 不是典型的消息中间件产品,其实更像是流数据处理软件,但是pub-sub或者queue也能实现。特点是刹broker端,富消费者。优点是带数据存储的功能,支持消息回看,并且由Kafka stream用于在Topic之间进行数据的二次处理。缺点是消息路由功能弱。另外还要引入zookeeper。

Pulsar: 非常新,好像去年才进入Apach顶级项目的,目的是取代Kafka, Kafka支持的它全都支持,并且多了一个概念叫Subscription,增加了几种模式,比如独占,failover还有共享。我觉得,如果subscription能支持消息过滤,就在一定程度上实现了消息路由,目前还不支持这个功能,比较遗憾, https://github.com/apache/pulsar/issues/3302。它缺点也很明显,新玩家,在google上很难找到问题解答和有价值的讨论,但是我还是比较喜欢这个项目,java写的。

当然,他们都支持扩展,高吞吐,分布式部署等等高可用方面的功能,这个不是本文的重点。

本文想基于一个真实的案例,分别用RabbitMQ, Kafka和Pulsar进行设计,来观察他们的异同。

案例:

有两个主要的需求:

  1. Notification, 希望client端(GUI)能直接使用Websocket接口和MQ通信,并且client端只能获取到跟在client端登录的用户相关的消息(不能是把所有消息都介入到client然后再做过滤)。
  2. Log,要支持log的回看以及log的trace

这样看起来好像对RabbitMQ不是太公平,因为天生不支持消息存储,更不要说回看了,没关系,我们一步一步来,且看它能支持到多少。

RabbitMQ

之前提到RabbitMQ对消息路由支持的很好,所以对第一个需求能很好的满足。

RabbitMQ有几个概念:

  • Producer: 消息生产者
  • Exchange:交换器
  • queue:队列
  • Consumer: 消息消费者

基本流程是Producer产生消息并发往Exchange, Exchange其实是个路由器,负责将消息路由到不同的queue中,而consumer则从queue中取走消息。

Exchange和queue之前是通过一个叫做binding的东西联系到一起的,bind的时候会有一个参数:binding key,这很关键,它和Exchange的路由方式一起决定了message的走向。

上面第一个代码块生成了一个Exchange,注意”exchange_type“, 在RabbitMQ中,有四种exchange_type:

  • fanout: 无视”router key“,把每一个消息无差别的路由到每一个binding到它上的queue
  • direct:将message路由到router key跟message完全匹配的queue
  • topic: 这种类型的Exchange对router key有格式上的要求:xxx.xxx.xxxxx, 而binding时候queue提供的router key可以包含通配符,如:*(匹配一个字符), #(匹配0或者多个字符)。规则是一样的,Exchange会吧message路由到所有匹配的queue
  • Headers: 这种类型会无视router key了,转而用一个message中的数组参数:headers,在binding的时候queue要指定路由的规则。比如message中headers长这样:{type: error, from: security}, bing的时候指定可以指定”type = error or from = security“或者”type = error and from = security“。这样的多条件组合基本上可以搞定任何复杂的路由规则。

好的,言归正传,我们基于RabbitMQ看看我们的需求:

  1. 基于client logon的消息通知。
    这个需求是希望user登录client之后会从MQ得到并仅仅得到这个user权限允许的message,这个filter/router要在server(MQ或者后台service)端就完成。
    在RabbitMQ晚上router机制的支持下,这个还是很容易满足的:
    a. 建立一个direct类型的Exchange,Message中的router key是”user_id“, 则Exchange会将router key匹配的消息路由到相应的 queue中。但是因为user众多,不会在开始就为所有的user建立queue, 当Exchange发现要路由到的queue不存在,就会对消息做丢弃处理。
    b. User登录后通知后台service,service会在RabbitMQ上为该用户建立专用的queue,这样Exchange就开始向改queue路由消息,不再丢弃。
    c. Client建立跟它专用的queue的连接,开始接受消息
    d. 当User登出或者session过期,跟queue的连接中断以后,queue会根据RabbitMQ中”auto-delete“的配置自动销毁。
    这就满足了第一个需求,很完美。
  2. Log的回看和trace
    这个就难度大发了,基本上不是RabbitMQ的使用场景,如果必须用它,就得引入一个DB之类的东西,基本流程如下:
    a. 建立两个Exchange。 一个用于接受正常log Producer的输入(编号为#1);另外一个接受Log回看需求的输入(编号为#2)。
    b. 在server端(也许是GUI的rest层)建立一个特殊的consumer和它的queue,用于从Exchange #1中接受所有的message并存入DB
    c. 当正常的log trace功能是,client建立到跟Exchange #1 binding的queue,获取实时的log
    d. 当log回看时:
        # 1. client通知server端,server端会根据client端request的参数,如start_time, 从DB中查出相应的log,并作为producer将消息feed到#2 Exchange中
        # 2. client端建立到Exchange #2binding的queue中接受回看消息。

    非常牵强,但也能实现,下次我们在用Kafka试试看。

RabbitMQ, Kafka和Pulsar (一)相关推荐

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

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

  2. 事务消息大揭秘!RocketMQ、Kafka、Pulsar全方位对比

    导语 | 事务是一个程序执行单元,里面的所有操作要么全部执行成功,要么全部执行失败.RocketMQ.Kafka和Pulsar都是当今业界应用十分广泛的开源消息队列(MQ)组件,笔者在工作中遇到关于M ...

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

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

  4. 浅谈 RocketMQ、Kafka、Pulsar 的事务消息

    作者:ruoyuliu刘若愚,腾讯 WXG 后台开发工程师 导语 事务是一个程序执行单元,里面的所有操作要么全部执行成功,要么全部执行失败.RocketMQ.Kafka 和 Pulsar 都是当今业界 ...

  5. 最新性能测试:Kafka、Pulsar 和 Pravega 哪个最强?

    本文会对 Pravega 进行性能评估,重点关注读写性能. 1 简介 为了对比不同的设计选择,我们还额外展示了来自其它系统的性能结果:Apache Kafka 和 Apache Pulsar.Puls ...

  6. 面试官:请你从架构演进的角度讲讲redis、kafka和 pulsar消息队列

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

  7. kafka和pulsar的区别

    Pulsar是一款分布式发布/订阅消息平台,近两年非常火,被称为下一代的消息流平台,大有取代Kafka的势头.今天我们就来比较一下Pulsar跟Kafka. 历史背景 Pulsar源自Yahoo,于2 ...

  8. 对 Kafka 和 Pulsar 进行性能测试后,拉卡拉将消息平台统一换成了 Pulsar

    拉卡拉支付成立于 2005 年,是国内领先的第三方支付企业,致力于整合信息科技,服务线下实体,从支付切入,全维度为中小微商户的经营赋能.2011 年成为首批获得<支付业务许可证>企业的一员 ...

  9. ActiveMQ RabbitMQ KafKa对比

    前言: ActiveMQ和 RabbitMq 以及Kafka在之前的项目中都有陆续使用过,当然对于三者没有进行过具体的对比,以下摘抄了一些网上关于这三者的对比情况,我自己看过之后感觉还 是可以的,比较 ...

  10. 消息队列ActiveMQ, RabbitMQ, Kafka, MSMQ等对比介绍

    ActiveMQ和RabbitMQ的区别? 关于文章没多少内容,请进链接:https://blog.csdn.net/qq_30764991/article/details/80573352, htt ...

最新文章

  1. 【注意事项】论文/申报书格式
  2. 习题10-2 递归求阶乘和 (15 分)
  3. vs2017 cmake android,CMake构建VS2017工程
  4. 意境级讲解二分查找算法、python
  5. SPOJ Qtree系列
  6. 程序员入门编程,看这10本书,少走10年弯路
  7. linux 安装萍方字体,苹方字体大全-苹果苹方字体全套打包下载【windows完整免费版】-西西软件下载...
  8. python爬虫简单示例
  9. 微录音--Android通话录音(vluyin-callrecorder)一款安卓通话录音软件
  10. 【社招】量化研究员(机器学习)-Akuna Capital -上海
  11. nas 和 远程文件夹同步_我应该如何使用Qsync来同步我计算机和NAS上的档案?
  12. 【NDN基础】Networking Named Content 全文翻译
  13. 打印机 linux 共享文件夹,linux 连接windows打印机
  14. java查看端口号被占用的命令_linux下怎么查看哪些端口被占用
  15. SpringBoot--SpringBoot 读取Properties文件(结合JDBC)
  16. php html 字符串 转 数组 用于小程序转换
  17. 用计算机写试卷反思,“我的试卷,我分析,我反思1——学生写试卷分析及反思的收获...
  18. 浅谈PLC电力线载波技术
  19. python中right是什么意思_Python turtle.right方法代码示例
  20. 前端学习日志(Vue)

热门文章

  1. 【渝粤教育】电大中专跨境电子商务理论与实务 (17)作业 题库
  2. 系统开发方法和开发模型
  3. 在数组后面添加指定元素
  4. brew安装nvm报nvm command not found解决方案
  5. 代理模式——保护代理(三)
  6. 石油大学个人训练赛(一)补题----问题 D: 卡片
  7. html文件怎么可以查错,CSS_CSS 网页布局中易犯的10个小错误小结,1. 检查HTML元素是否有拼写错误 - phpStudy...
  8. jQuery水平手风琴图片轮播切换
  9. 解决Connection error: (‘Unable to connect to any servers‘, {‘192.168.193.136‘: OperationTimedOut。。。。
  10. 联发科:上半年营收2980亿台币,下半年全面发力5G芯片,并布局6G