JMS 全称 Java Message Service,类似于 JDBC不同于 JDBC,JMS 是 JavaEE的消息服务接口,JMS 主要有两个版本:
1.1
2.0
1.两者相比,后者主要是简化了收发消息的代码。
2.考虑到消息中间件是一个非常常用的工具,所以 JavaEE此制定了专门的规范JMS。
3.不过和 JDBC 一样JMS 为规范,他只是一套接口,并不包含具体的现,如果们要使用 JMS,那么一般还需要对应的现,这就像使用JDBC 需要对应的驱动一样.
JMS 消息服务支持两种消息模型:
1.点对点或队列模型
2.发布/订阅模型
在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。里,生产者知道消费者的队列,并直接将消息发送到对应的队列。这是一种点对点的消息模型,这种模式被概括为:
1.只有一个消费者将获得消息。
2.生产者不需要在消费者消费该消息期间处于运行状态,消费者也同样不需要在消息发送时处于运行状态,即消息的生产者和消费者是完全解耦的。
3.每一个成功处理的消息都由消息消费者签收。
发布者/订阅者模型支持向一个特定的消息主题发布消息,消费者则可以定义自己感兴趣的主题,这是一种点对面的消息模型,这种模式可以被概括为:
1.多个消费者可以消费消息。
2.在发布者和订阅者之间存在时间依赖性,发布者需要创建一个订阅(subscription),以便客户能够订阅;订阅者必须保持在线状态以接收消息;当然,如果订阅者创建了持久的订阅,那么在订阅者未连接时,消息生产者发布的消息将会在订阅者重新连接时重新发布。
开源的支持 JMS 的消息中间件有:
Kafka
Apache ActiveMQ
JBoss 社区的 HornetQ
Joram
Coridan 的 MantaRay
OpenJMS
一些商用的支持 JMS 的消息中间件有:
WebLogic Server JMS
EMS
GigaSpaces
iBus
IONA JMS
IQManager(2005 年 8 月被Sun Microsystems并购)
JMS+
Nirvana
SonicMQ
WebSphere MQ
日常开发接触较多的,可能就 是 Kafka 和 ActiveMQ。
支持 AMQP、XMPP、SMTP、STOMP 等多种协议,功能强大,适用于企业级开发。
1.保证严格的消息顺序。
2.提供针对消息的过滤功能。
3.提供丰富的消息拉取模式。
4.高效的订阅者水平扩展能力。
5.实时的消息订阅机制。
6.亿级消息堆积能力
安装 RabbitMQ 直接用Docker,
1.进入官网
https://hub.docker.com/
2.搜索
3.
4.
5.更改配置
#有两个默认端口
15672管理界面
5672通信
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
Kafka 是 Apache 下的一个开源流处理平台,由Scala 和 Java 编写。Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作(网页浏览,搜索和其他用户的行动)流数据。Kafka 的目的是通过 Hadoop 的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
1.快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化。
2.高吞吐:在一台普通的服务器上既可以达到10W/s 的吞吐速率。
3.高堆积:支持 topic 下消费者较长时间离线,消息堆积量大。
4.完全的分布式系统:Broker、Producer,Consumer 都原生自动支持分布式,通过 Zookeeper 可以自动实现更加复杂的负载均衡。
5.支持 Hadoop 数据并行加载。
ZeroMQ 号称最快的消息队列系统,它专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常使用,偏重于实时数据通信场景。ZeroMQ 不是单独的服务,而是一个嵌入式库,它封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的 API,应用程序通过加载库文件,调用 API 函数来实现高性能网络通信。
ZeroMQ 的特性:
1.无锁的队列模型:对于跨线程间的交互(用户端和 session)之间的数据交换通道 pipe,采用无锁的队列算法 CAS,在 pipe 的两端注册有异步事件,在读或者写消息到 pipe 时,会自动触发读写事件。
2.批量处理的算法:对于批量的消息,进行了适应性的优化,可以批量的接收和发送消息。
3.多核下的线程绑定,无须 CPU 切换:区别于传统的多线程并发模式,信号量或者临界区,ZeroMQ 充分利用多核的优势,每个核绑定运行一个工作者线程,避免多线程之间的 CPU 切换开销。