你知道消息中间件对云计算的重要性吗?
云计算服务商除了提供云主机、云存储、云数据库这些最常用的服务外,通常也会提供一些软件服务,消息中间件就是比较常用的一种基础软件。消息中间件对于分布式系统来说,是一个非常重要的组成部分,相当于系统的基础设施,主要解决的是分布式系统不同服务组件之间的数据通信问题。其已成为在业务层和IaaS层之间的支撑桥梁,PaaS和中间件及服务变得越来越受关注,成为云计算的关键所在。
消息中间件的作用
一般服务组件间进行通信,都是通过暴露数据接口的方式,这种通信方式比较直接,但系统之间的耦合度会比较高。如果系统的服务组件很多,互相调用起来,整个系统的接口调用关系会很复杂。通过消息中间件来通信的话,系统组件间的耦合度就大大降低。所以,消息中间件的最主要的作用是解耦。
消息中间件的核心是消息队列(MQ: Message Queue)。消息队列是大型分布式系统中不可或缺的重要组成部分,主要解决了应用解耦,异步处理,流量削峰,消息通讯等问题,支撑实现分布式系统的高并发,高和最终一致性。
消息中间件的另外一个好处是提高了分布式系统的可靠性, 服务组件通过消息中间件给别的组件发消息,别的组件即时当前没空处理,等到空闲时看到这个消息,就可以处理了。
消息中间件的工作原理
消息中间件主要有两种工作模式:
(1) 一种是生产者/消费者(Producer/Consumer)模式;
(2) 另一种是发布/订阅(Pub/Sub)模式。
生产/消费模式中有两种角色,消息生产者(Producer)负责生产消息,并把消息发送到队列中,然后消息消费者(Consumer)从队列中取出并且消费消息。生产/消费模式是一种一对一的消息传递方式。
消息被消费以后,队列中就不再存储,所以其他消费者不可能消费到已经被消费的消息。 换句话说,存在多个消费者的情况下,对一个消息而言,只会有一个消费者可以消费它,所以生产/消费模式又称为点对点(P2P)模式。
P2P的特点:
每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中);
生产者和消费者之间在时间上没有依赖性,也就是说当生产者发送出消息之后,不管消费者有没有正在运行它不会影响到消息被发送到队列;
消费者在成功接收消息之后需向队列应答成功;
如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式;
在发布/订阅( Pub/Sub)模式中,包含三个角色主题(Topic),消息发布者(Publisher),消息订阅者(Subscriber) 。消息发布者(Publisher)将消息发布到某个主题(topic),同时有多个消息订阅者(Subscriber)会接收到该消息。和P2P方式不同,发布到主题的消息会被所有该主题的订阅者接收到,这是一种1对多的消息传递方式。
Pub/Sub的特点:
· 每个消息可以有多个消费者
· 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
· 为了消费消息,订阅者必须保持运行的状态。
· 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型。
常用的消息中间件
市场上出现过很多商用消息中间件产品,比如Sun的JMS等,还有很多开源消息引擎,比如ActiveMQ、Kafka等。另外像阿里、腾讯这样的大公司往往会开发自己的消息中间件,比如RocketMQ。下面介绍几种在生产环境中使用较多的消息队列。
(1)ActiveMQ/ApolloMQ
ActiveMQ是Apache出品的最流行的开源消息总线,同时也是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,使用Java语言编写。作为老牌消息队列,可谓历史悠久,但历史包袱也比较多。最新架构的产品为ApolloMQ。
(2)Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,设计目标就是用于日志收集和传输。
Kafka生态完善,其代码是用Scala语言编写,并且有很多不同编程语言的接口,尤其适合海量消息传递。
(3)RabbitMQ
RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。由Erlang语言编写。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
RabbitMQ比Kafka可靠,kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。
(4)RocketMQ
RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
性能与可靠性,鱼与熊掌不可兼得,面对不同的消息中间件产品如何抉择,要看各自业务场景的需求和定位。
小结
从中间件的常规定义来看,其可以包括各种软件方案,API、应用服务器、数据整合、对象请求代理等等,任何位于内核和用户应用之间的软件都可以理解为中间件。中间件如同IT 基础架构的输水管,使得数据能从一个应用流动到另一个中。
当中间件走上云端,大家突然发现可以不再围绕SOAP/XML来构建标准化的方案,微服务架构带来了新的思路,企业用户能够使用云中间件将业务流程逐步迁移到云集成服务上,最终实现灵活扩展和降本增效,进而推动了平台现代化标准的构建。
启迪云-高级测试工程师 黄冬琪
最新活动更多
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
即日-2025.8.1立即下载>> 《2024智能制造产业高端化、智能化、绿色化发展蓝皮书》
-
精彩回顾立即查看>> 2024先进激光技术博览展
-
精彩回顾立即查看>> 全数会2024中国深圳智能制造与机器人展览会
-
精彩回顾立即查看>> 2024(第五届)全球数字经济产业大会暨展览会
-
精彩回顾立即查看>> 维科杯·OFweek2024中国工业自动化及数字化行业年度评选
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论