消息中间件

1 消息中间件(MOM)

消息中间件是指利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

消息中间件可以即支持同步方式,又支持异步方式。
异步中间件比同步中间件具有更强的容错性,在系统故障时可以保证消息的正常传输。
异步中间件技术又分为两类:广播方式和发布/订阅方式。
由于发布/订阅方式可以指定哪种类型的用户可以接受哪种类型的消息,更加有针对性,事实上已成为异步中间件的非正式标准。

当前使用较多的消息中间件产品有 OpenMQ、RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等,
而部分数据库如Redis、MySQL以及phxsql也可实现消息队列的功能。

2 消息中间件的传递模式

消息中间件一般有两种传递模式:点对点模式(P2P)和发布-订阅模式(Pub/Sub)。

3 消息中间件常用协议

3.1 AMQP协议

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

3.2 MQTT协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。
该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统。

3.3 STOMP协议

STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。
STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。
优点:命令模式(非topic\queue模式)。

3.4 XMPP协议

XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。
核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。
优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大。

3.5 其他基于TCP/IP自定义的协议

有些特殊框架(如:redis、kafka、zeroMq等)根据自身需要未严格遵循MQ规范,而是基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能。

4 JMS 规范

Java官方提供的一种希望各OMO厂商遵守的一个规范(API),以便开发者能够用一套API使用所有厂商的MQ。
它是一个与具体平台无关的API,目前绝大多数MOM提供商都对JMS提供支持。

JMS提供四组用于发送和接收消息的接口。
JMS1.0定义了两个域相关的API,一个用于点对点的消息处理(queue),一个用于发布订阅的消息处理(topic)。
尽管由于向后兼容的理由这些接口一直被保留在JMS中,但是在以后的API中应该考虑被废弃掉。
JMS1.1引入了一个新的统一的一组API,可以同时用于点对点和发布订阅消息模式。这也被称作传统API。
JMS2.0引入了一组简化API,它拥有传统API的全部特性,同时接口更少、使用更方便。
以上每组API提供一组不同的接口集合,用于连接到JMS提供者、发送和接收消息。因此,它们共享一组代表消息、消息目的地和其他各方面功能特性的通用接口。
所有的接口都在javaxjms包下。

4.1 JMS相关概念

提供者:实现JMS规范的消息中间件服务器。
客户端:发送或者接受消息的应用程序。
生产者/发布者:创建并发送消息客户端。
消费者/订阅者:接收并处理消息的客户端。
消息:应用程序之间传递数据内容。
消息模式:在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式。

4.2 JMS消息模式
  • 1 队列模型

客户端包括生产者和消费者
队列中的消息只能被一个消费者消费。
消费者可以随时消费队列中的消息。
队列模型中,消费者的每个连接会依次接收JMS队列中的消息。每个连接接收到的是不同的消息。分配的感觉。

  • 2 主题模型

客户端包括发布者和订阅者
主题中的消息被所有订阅者消费

消费者不能消费订阅之前就发送到主题中的消息,每个消费者收到的是全部的消息。

4.3 JMS编码接口

ConnectionFactory:用于创建连接到消息中间件的连接工厂。
Connection:代表了应用程序和消息服务之间的通讯链路。
Destination:目的地,指消息发布和接收的地点,包括队列和主题。
Session:表示一个单线程的上下文,用于发送和接收消息。
MessageConsumer:由会话创建,用于接收发送到目标的主题和消息。
MessageProducer:由会话创建,用于发送消息到目标。
Message:是消息体,是在生产者和消费者之间传递的对象,由消息头(必须存在),消息属性,消息体组成。

4.4 JMS编程模型

一般开发基于JMS协议的客户端需进行如下步骤:

  1. 用JNDI 得到ConnectionFactory对象;
  2. 用JNDI 得到目标队列或主题对象,即Destination对象;
  3. 用ConnectionFactory创建Connection 对象;
  4. 用Connection对象创建一个或多个JMS Session;
  5. 用Session 和Destination 创建MessageProducer和MessageConsumer;
  6. 通知Connection 开始传递消息。

5 各类消息队列简述

5.1 ActiveMQ

ActiveMQ 是 Apache 出品的、采用 Java 语言编写的完全基于 JMS1。1 规范的面向消息的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。不过由于历史原因包袱太重,目前市场份额没有后面三种消息中间件多,其最新架构被命名为 Apollo,号称下一代 ActiveMQ,有兴趣的同学可行了解。

5.2 RabbitMQ

RabbitMQ 是采用 Erlang 语言实现的 AMQP 协议的消息中间件,最初起源于金融系统,用于在分布式系统中存储转发消息。RabbitMQ 发展到今天,被越来越多的人认可,这和它在可靠性、可用性、扩展性、功能丰富等方面的卓越表现是分不开的。

5.3 Kafka

Kafka 起初是由 LinkedIn 公司采用 Scala 语言开发的一个分布式、多分区、多副本且基于 zookeeper 协调的分布式消息系统,现已捐献给 Apache 基金会。它是一种高吞吐量的分布式发布订阅消息系统,以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、Apache Storm、Spark、Flink 等都支持与 Kafka 集成。

5.4 RocketMQ

RocketMQ 是阿里开源的消息中间件,目前已经捐献个 Apache 基金会,它是由 Java 语言开发的,具备高吞吐量、高可用性、适合大规模分布式系统应用等特点,经历过双 11 的洗礼,实力不容小觑。

5.5 ZeroMQ

ZeroMQ 号称史上最快的消息队列,基于 C 语言开发。ZeroMQ 是一个消息处理队列库,可在多线程、多内核和主机之间弹性伸缩,虽然大多数时候我们习惯将其归入消息队列家族之中,但是其和前面的几款有着本质的区别,ZeroMQ 本身就不是一个消息队列服务器,更像是一组底层网络通讯库,对原有的 Socket API 上加上一层封装而已。

5.6 其他

目前市面上的消息中间件还有很多,比如腾讯系的 PhxQueue、CMQ、CKafka,又比如基于 Go 语言的 NSQ,有时人们也把类似 Redis 的产品也看做消息中间件的一种,当然它们都很优秀,但是本文篇幅限制无法穷极所有,下面会针对性的挑选 RabbitMQ 和 Kafka 两款典型的消息中间件来做分析,力求站在一个公平公正的立场来阐述消息中间件选型中的各个要点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值