(一) 初识消息中间件

引题

消息中间件是什么,是一种标准,还是一种具体的工具?为什么叫消息中间件,带着这些疑问,笔者开始走进消息中间件的世界。

消息中间件的定义

通俗来说,就是可以对数据信息进行异步传递的中介。从编程的角度来说,这里的消息就是我们通常意义上的数据,中间件是某种软件或者程序,接收我们的消息并分发给指定的目标程序,中间件并不关注参数本身的意义,但是其需要遵循一定的标准,比如平台特性、消息传递方式、消息传递可靠性等。(叫做数据中转站怎么样?)

消息中间件出现的背景

伴随着分布式系统的出现,各系统之间的交互越来越复杂,一次业务处理需要调用的 API 越来越多,系统耦合性在加大,处理效率却在急剧下降。再一个,系统存在高峰调用和低峰调用,高峰调用所需的性能超过了系统的承受能力,而低峰时段系统的性能却白白浪费了。这个时候,人们就开始思考解决这个问题了,伴随着一些列的努力和探索,消息中间件终于出现了,并且呈现出了一种百花齐放的局面。

消息中间件解决了什么问题?

业务解耦:相比于传统 RPC 调用,消息中间件对数据的处理是异步的,这意味着客户端无需等待消息处理结束,而只需要关注消息是否成功投送给消息中间件,至于结果的处理则由后面的环节去负责。客户端通过消息中间件传递数据给服务端,业务解耦了,从而降低了系统的耦合度,有利于系统扩展和报错时的问题排查。
系统效率提升:将紧迫程度较高的业务使用传统同步调用的方式处理,对紧迫程度较低的业务通过异步的消息中间件传递给下游服务端处理,同步调用所耗费的时间较少了,从而提升了系统效率。当然,随着业务的发展和人们孜孜不倦的探索,消息中间件已经可以用于对时效性要求较高的场景了。
系统综合可用性提升:从系统解耦的角度来说,串行的调用100个接口和并行的调用100个接口,其中一个接口出现问题对系统总体可用性的影响度是显而易见的。再一个,消息中间件异步处理消息的模式,可以对系统起到“削峰填谷”的作用,当客户端访问量大于服务端的时候,可以先将过量的服务存储在消息队列中,待到服务端有富余的性能时再对消息队列中的业务数据进行处理,从而提升了系统的综合可用性。

消息中间件的标准JMS 和 AMQP

需要强调的是,消息中间件并非只有 JMS 和 AMQP 两种标准。
以下内容摘自《Spring 实战第4版》
JMS( Java消息服务,Java Message Service ) 是一个Java标准, 定义了使用消息代理的通用API。 在JMS出现之前, 每个消息代理都有私有的API, 这就使得不同代理之间的消息代码很难通用。 但是借助JMS, 所有遵从规范的实现都使用通用的接口, 这就类似于JDBC为数据库操作提供了通用的接口一样。
在JMS中, 有三个主要的参与者: 消息的生产者消息的消费者以及在生产者和消费者之间传递消息的通道( 队列或主题)
AMQP( 高级消息队列协议 Advanced Message Queuing Protocol )。AMQP的线路层协议规范了消息的格式, 消息在生产者和消费者间传送的时候会遵循这个格式。 这样AMQP在互相协作方面就要优于JMS——它不仅能跨不同的AMQP实现, 还能跨语言和平台。相比JMS, AMQP另外一个明显的优势在于它具有更加灵活和透明的消息模型。 使用JMS的话, 只有两种消息模型可供选择: 点对点和发布-订阅。 这两种模型在AMQP当然都是可以实现的, 但AMQP还能够让我们以其他的多种方式来发送消息, 这是通过将消息的生产者与存放消息的队列解耦实现的。

常见的消息中间件

下面内容摘自 https://mp.weixin.qq.com/s/Zwd1USlOCkQvsG96eSwvpg#%23
ActiveMQ是Apache出品的、采用Java语言编写的完全基于JMS1.1规范的面向消息的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。不过由于历史原因包袱太重,目前市场份额没有后面三种消息中间件多,其最新架构被命名为Apollo,号称下一代ActiveMQ,有兴趣的同学可行了解。
RabbitMQ是采用Erlang语言实现的AMQP协议的消息中间件,最初起源于金融系统,用于在分布式系统中存储转发消息。RabbitMQ发展到今天,被越来越多的人认可,这和它在可靠性、可用性、扩展性、功能丰富等方面的卓越表现是分不开的。
Kafka起初是由LinkedIn公司采用Scala语言开发的一个分布式、多分区、多副本且基于zookeeper协调的分布式消息系统,现已捐献给Apache基金会。它是一种高吞吐量的分布式发布订阅消息系统,以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark、Flink等都支持与Kafka集成。
RocketMQ是阿里开源的消息中间件,目前已经捐献个Apache基金会,它是由Java语言开发的,具备高吞吐量、高可用性、适合大规模分布式系统应用等特点,经历过双11的洗礼,实力不容小觑。
ZeroMQ号称史上最快的消息队列,基于C语言开发。ZeroMQ是一个消息处理队列库,可在多线程、多内核和主机之间弹性伸缩,虽然大多数时候我们习惯将其归入消息队列家族之中,但是其和前面的几款有着本质的区别,ZeroMQ本身就不是一个消息队列服务器,更像是一组底层网络通讯库,对原有的Socket API上加上一层封装而已。
目前市面上的消息中间件还有很多,比如腾讯系的PhxQueue、CMQ、CKafka,又比如基于Go语言的NSQ,有时人们也把类似Redis的产品也看做消息中间件的一种,当然它们都很优秀,但是本文篇幅限制无法穷极所有,下面会针对性的挑选RabbitMQ和Kafka两款典型的消息中间件来做分析,力求站在一个公平公正的立场来阐述消息中间件选型中的各个要点。

参考链接

文献很丰富,网络让知识自由流动

[1].《Spring 实战 第4版》
[2].https://blog.csdn.net/winter_chen001/article/details/78409125
[3].https://blog.csdn.net/u013123635/article/details/78362360
[4].https://www.cnblogs.com/Peter2014/p/8080192.html
[5].https://blog.csdn.net/wowwilliam0/article/details/81110943
[6].https://blog.csdn.net/lsj960922/article/details/79926947
[7].https://blog.csdn.net/wangfengwf/article/details/78966704
[8].https://blog.csdn.net/hpttlook/article/details/23391967

猜你喜欢

转载自blog.csdn.net/bestcxx/article/details/81266926