聊聊云计算:最简单易懂的消息中间件教程
   来源:微说互联网     2019年12月04日 14:11

各种世界知名消息引擎(图片来自于云栖社区)

云计算服务商除了提供云主机、云存储、云数据库这些最常用的服务外,通常也会提供一些软件服务,消息中间件(消息引擎)就是比较常用的一种基础软件。所谓中间件,在操作系统、网络、数据库之上,应用之下的软件,故此得名。

消息中间件对于分布式系统来说,是一个非常重要的组成部分,相当于系统的基础设施,主要解决的是分布式系统不同服务组件之间的数据通信问题。

消息中间件减少了分布式系统的耦合性

一般服务组件间进行通信,都是通过暴露数据接口的方式,这种通信方式比较直接,但系统之间的耦合度会比较高。如果系统的服务组件很多,互相调用起来,整个系统的接口调用关系会很复杂。通过消息中间件来通信的话,系统组件间的耦合度就大大降低。所以,消息中间件的最主要的作用是解耦。

另外每个服务组件的处理能力和承担的负载都是不同的,有些组件可能正忙得不亦乐乎,已经没法再接收新的请求,而有些组件现在可能根本就不在线,但不能让其他的组件都等着它。比较好的做法就是通知某个组件,你帮我干什么事情,干完了再回复我一下,也就是异步的方式。这样就不会因为某个服务组件出现问题,而影响到整个系统的性能。

消息中间件的另外一个好处是提高了分布式系统的可靠性, 服务组件通过消息中间件给别的组件发消息,别的组件即时当前没空处理,等到空闲时看到这个消息,就可以处理了。消息中间件的工作原理

消息中间件的核心是消息队列(MQ: Message Queue)。主要有两种工作模式:一种是生产者/消费者(Producer/Consumer)模式;另一种是发布/订阅(Pub/Sub)模式。

生产/消费模式中有两种角色,消息生产者(Producer)负责生产消息,并把消息发送到队列中,然后消息消费者(Consumer)从队列中取出并且消费消息。

消息被消费以后,队列中就不再存储,所以其他消费者不可能消费到已经被消费的消息。 换句话说,存在多个消费者的情况下,对一个消息而言,只会有一个消费者可以消费它,所以生产/消费模式又称为点对点(P2P)模式。

生产/消费模式是一种一对一的消息传递方式

在发布/订阅模式中,消息发布者(Publisher)将消息发布到某个主题(topic),同时有多个消息订阅者(Subscriber)会接收到该消息。和点对点方式不同,发布到主题的消息会被所有该主题的订阅者接收到,这是一种1对多的消息传递方式。

发布/订阅模式是一种一对多的消息传递方式有哪些消息中间件可以用

市场上出现过很多商用消息中间件产品,比如Sun的JMS等,还有很多开源消息引擎,比如ActiveMQ、Kafka等。另外像阿里、腾讯这样的大公司往往会开发自己的消息中间件,之所以要自己做,是因为这些大公司的业务场景相对固化,需要追求的是更高的性能。

中小公司一般没有能力造轮子,采用通用的开源产品是比较合适的。另外也可以使用阿里云、腾讯云这些云服务商的消息中间件产品。下面列举一些目前用的比较多的开源消息中间件。

(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协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

(4)RocketMQ

这是由阿里开源的一款高性能、高吞吐量的消息中间件。与Kafka类似,同样专为海量消息传递打造,主张使用拉模式,天然的集群、HA、负载均衡支持。可以说RocketMQ包含了阿里十年来在电商中间件架构设计上积累的最宝贵的经验。

性能与可靠性,鱼与熊掌不可兼得,面对不同的消息中间件产品如何抉择,要看各自的需求和定位。

消息 中间件 组件