MOM异步通信

在微服务架构中,使用REST和RPC的方式最大的问题就是请求/响应模式的通信模式可能导致服务之间调用的可用性降低,客户端与服务端需要同时在线,双方都需要知道对方的URL地址,或者服务消费者需要通过某种发现机制来定位服务实例的地址。

MOM(Message Oriented Middleware)是面向消息的中间件,使用消息提供者来协调消息传送操作。这种松耦合的通信机制有助于降低客户端和远程服务之间的依赖性。

消息中间件概述

消息中间件通常也被称为消息队列,是系统内部通信的核心机制。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列优势。

消息中间件的常用概念

● Broker:消息服务器,作为Server提供消息核心服务。

● Producer:消息生产者,业务的发起方,负责生产消息并传输给Broker。

● Consumer:消息消费者,业务的处理方,负责从Broker获取消息并进行业务逻辑处理。

● Topic:主题,它是发布订阅模式下的消息统一汇集地。不同生产者向Topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播。

● Queue:队列,在点对点模式下,特定生产者向特定Queue发送消息,消费者订阅特定的Queue完成指定消息的接收。

● Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,可以用它来封装业务数据,实现消息的传输。

消息中间件模式

● 点对点模式:使用Queue作为通信载体,消息生产者生产消息后发送到Queue中,然后消息消费者从Queue中取出并且消费消息。

● 发布订阅(广播)模式:使用Topic作为通信载体。消息生产者(发布者)将消息发布到Topic中,同时有多个消息消费者(订阅者)消费该消息。和点对点方式不同,发布到Topic的消息会被所有订阅者消费。

消息中间件流派

当 前 , 市 面 上 流 行 的 消 息 中 间 件 有 RabbitMQ 、 RocketMQ 、ActiveMQ、Kafka、ZeroMQ等。它们有各自擅长的领域,分属不同的流派。下面我们通过不同消息队列的流派来了解不同消息中间件的世界观。

● 基于标准规范的消息队列

JMS(Java Message Service)是一套JMS API标准规范。JMS是由Sun公司提出的早期的消息标准,旨在为Java应用提供统一的消息操作,使用Java的世界观通过定制标准来达到统一规范的效果。JMS已经成为Java Enterprise Edition的一部分。从使用的角度看,JMS和JDBC扮演着差不多的角色,用户都可以根据相应的接口与实现了JMS的服务进行通信。

ActiveMQ是Apache的开源项目,是基于JMS规范开发的一个典型的消息队列,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。在中小型项目中用于解耦和异步操作时,可考虑ActiveMQ,简单易用,对队列数较多的情况支持不好。

● 基于标准协议的消息队列

RabbitMQ是这一流派的典型代表,它是使用Erlang编写的开源的消息队列,本身支持很多协议:AMQP、XMPP、SMTP、STOMP,也正因如此,使得它变得非常重量级,更适合于企业级的开发。它同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由、负载均衡、数据持久化都有很好的支持。

AMQP的全称为Advanced Message Queuing Protocol,它是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端和中间件不同产品、不同开发语言等条件的限制。这种模式的消息中间件的主要优点是标准、可靠、通用。

在AMQP中,消息路由和JMS存在一些差别,在AMQP中增加了Exchange(交换机)和Binding(绑定)的角色。生产者将消息发送给Exchange,Binding决定Exchange的消息应该发送到哪个队列,而消费者直接从队列中消费消息。队列和Exchange的绑定关系由消费者来决定。AMQP逐渐成为消息队列的一个标准协议。

● 基于TCP的私有二进制的消息队列

这个流派最典型的代表就是Kafka了,Kafka遵循了一般消息队列的结构。它简化了消息队列功能模型,仅仅提供了一些最基础的消息队列相关功能,但是大幅度优化和提升了吞吐量。这个流派有一个Broker(消息代理)角色,也就是说,Kafka需要部署一套服务器集群,每台机器上都有一个Kafka Broker进程,这个进程负责接收请求、存储数据、发送数据。Kafka的生产消费采用简单的数据流模型。

相比RabbitMQ,Kafka强调的不是提升性能和吞吐量,它关注的还是提供非常强大、复杂而且完善的消息路由功能。

RocketMQ也可以归为这个流派,RocketMQ是阿里巴巴参照Kafka设计思想使用Java实现的一套消息队列。