消息中间件漫谈

1、前言

最近在回顾消息中间件相关的知识,碰巧有个技术和行销同事今天咨询我什么是消息中间件以及常见的种类和应用场景,我就给从功能到协议最后到现有的中间件给大致讲解了下,这加深了我的记忆。我感觉也许大概了解了消息中间件是个什么东西,所以就想趁着脑袋还热乎把这些记录下来。当以后回顾时可以给予灵感。

首先说明,这篇文件不具体介绍某个消息中间件的使用和原理,而是从整体上介绍消息中间件是什么,并随后介绍了当前市场上常用的中间件以及相互的对比。如果是初学者,该文章或文章中的思路可能会给你帮助。

2、什么是消息中间件,功能是什么

什么是消息中间件呢,百度上说“消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统”。简而言之,消息中间件是一个基于消息队列,实现生产和消费解耦的系统。下图可以直观展示出来:

æ¶æ¯ä¸­é´ä»¶çæ¦è¿°å¾

可以看到生产者和消费者并不属于消息中间件,所以消息中间件再简单的理解可以看作为一个消息队列。所以在考虑消息中间件的功能时,可以从消息队列的功能入手。消息队列能实现的功能大致有解耦、削峰、异步:

解耦:生产模块和消费模块的解耦,狭义来说,本来生产模块代码和消费模块代码要放在一块,关联性比较强。但是现在可以把生产和消费当作两个方法,中间通过消息队列协调;广义上来看,通过消息中间件可以把生产系统和消费系统分开,两者互不关联,可以有多个系统同时生产,也可以有多个系统同时消费。

削峰:即削去峰值,常用于某一时刻请求数特别多的场景,这个时候请求处理不过来就可以先把一部分请求放在消息中间件,后续再进行处理。这样可以保证项目的稳定性,不至于太多请求过来导致服务器崩溃或者丢弃的情况。

异步:原来生产消费是一个整体,现在则是生产不用等待消费,它只要放入了消息队列就可以返回执行结束,消费也是一样,不用等待生产,直接从消息中间件取就行。

3、对应的协议有哪些

知道了消息中间件的功能后,就可以直接生产产品吗,还不行。还需要有对应的协议规范,因为只有根据协议规范进行开发,才可以使得生产者、消费者能有依据进行对接,这也是大多产品想被尽可能多人使用所必不可少的。目前常用的协议有AMQP、MQTT、JMS、TCP:

AMQP(Advanced Message Queue 高级消息队列协议):具有独立于平台的底层消息传递协议、跨语言和平台的互用性、有5种交换类型direct,fanout,topic,支持长周期消息传递。

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议):一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。因为物联网领域大多设备资源有限,对于AMQP等重量级协议实现比较困难,所以目前其常用于物联网设备间的通信。不过它不支持长周期的数据存储以及事务也不具有很好的扩展性,所以它在设备通信外的领域使用较少。

JMS(java message service,java消息服务):由Sun公司早期提出的消息标准,它既是一个协议也是一个Java平台中关于面向消息中间件(MOM)的API(可异步使用),旨在为java应用提供统一的消息操作。所以它只能用于java平台中。java开发中,对于支持JMS协议的中间件,可以直接用JMS API进行对接。

TCP(Transmission Control Protocol,传输控制协议):TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的RFC 793定义。通过三次握手四次挥手以及拥塞控制保证数据传输的稳定行和安全性,其工作在网络协议较底层的传输层。大多其它协议都在基于TCP协议进行的传输,如AMQP、MQTT、JMS等都基于TCP传输。

4、市场上的中间件有哪些、支持的协议类型有哪些、相互之间的区别是什么

有了协议规范,各个公司就开始以此为基础进行各种中间件的开发,而为了使得产品的被更多的人使用,大多中间件也因此同时支持多种协议规范。目前常用中间件、支持的协议种类、应用场景、性能参数等我参考整理了一个表格,如下:

中间件名称支持协议种类性能参数特性应用场景
activemqOpenWrite、STOMP、AMQP、MQTT、JMS

单机吞吐量:万级 、时效性:ms级

支持主从、不支持分布式

支持各种协议、产品成熟、出问题有较多的参考文档小型产品、需求功能单一、可以直接使用activemq,其部署和对接都很简单
rabbitmqAMQP、MQTT、STOMP、HTTP and WebSockets

单机吞吐量:万级、时效性:us级

支持主从、不支持分布式

erlang语言开发,所以并发能力很强,延时很低,管理界面较丰富需求复杂,要实现多种功能的场合可以使用它,rabbitmq通过Exchange、Binding、Queue提供了多种功能供用户选择使用。
rocketmqTCP、JMS、OpenMessaging

单机吞吐量:十万级、时效性:ms级

支持分布式

支持分布式、扩展性好消息比较重要时可以选择它,经过参数优化配置,rocketmq可以做到0丢失。
kafkaTCP

单机吞吐量:十万级、时效性:ms级

支持分布式

支持分布式、极高的可用性以及可靠性大数据领域

5、总结

所以消息中间件是一个很实用的组件,能在多种场合使用。不同的中间件可能原理协议不同,但最本质的功能是一样的。当了解它的本质后,在学、用、查就可以有个大致的方向。不过消息中间件也不肯定是好的,要根据场景进行使用。首先如果项目中用不到,强行加进去只会增加项目的复杂度和不稳定性;另外如果项目是一个大数据项目,你用了activemq而不是kafka或rocketmq,activemq很有可能会成为整个项目的瓶颈与风险点。

参考链接:

百度 消息中间件 https://baike.baidu.com/item/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/5899771?fr=aladdin

菜鸟教程 MQTT https://www.runoob.com/w3cnote/mqtt-intro.html

博客园 rabbitmq、kafka、activemq、rocketmq之间对比区别 https://www.cnblogs.com/dreamitpossible/p/11459041.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值