JMS 和 AMQP
所属分类 architecture
浏览量 209
JMS Java Message Service
AMQP Advanced Message Queuing Protocol
JMS 主要有两个版本:1.1 2.0
后者主要是简化了收发消息的代码
JMS 支持两种消息模型
点对点或队列模型
发布/订阅模型
发布者和订阅者之间存在时间依赖性,发布者需要创建一个订阅(subscription),以便客户能够订阅;
订阅者必须保持在线状态以接收消息;
当然,如果订阅者创建了持久的订阅,那么在订阅者未连接时,消息生产者发布的消息将会在订阅者重新连接时重新发布。
JMS 的实现 主要有 ActiveMQ Kafka
ActiveMQ 也支持 AMQP
Message Queue 的需求由来已久,80 年代最早在金融交易中,高盛等公司采用 Teknekron 公司的产品,
当时的 Message Queue 软件叫做:the information bus(TIB)。
TIB 被电信和通讯公司采用,路透社收购了 Teknekron 公司。之后,IBM 开发了 MQSeries,微软开发了 Microsoft Message Queue(MSMQ)。
这些商业 MQ 供应商的问题是厂商锁定,价格高昂。2001 年,Java Message Service 试图解决锁定和交互性的问题,但对应用来说反而更加麻烦了。
于是 2004 年,摩根大通和 iMatrix 开始着手 Advanced Message Queuing Protocol (AMQP)开放标准的开发。
2006 年,AMQP 规范发布。2007 年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布
AMQP是一个Wire级的协议,它描述了在网络上传输的数据的格式,以字节为流。
因此任何遵守此数据格式的工具,其创建和解释消息,都能与其他兼容工具进行互操作。
AMQP 协议中的一些概念
Broker: 接收和分发消息的应用,我们日常所用的 RabbitMQ 就是一个 Message Broker。
Virtual host
出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。
当多个不同的用户使用同一个 RabbitMQ 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 中创建 exchange/queue 等,
Connection
publisher/consumer 和 broker 之间的 TCP 连接,
断开连接的操作只会在 client 端进行,Broker 不会断开连接,除非出现网络故障或 broker 服务出现问题。
Channel
如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。
Channel 是在 Connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 Thread 创建单独的 Channel 进行通讯,
AMQP method 包含了 Channel id 帮助客户端和 Message Broker 识别 Channel,所以 Channel 之间是完全隔离的。
Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP Connection 的开销
Exchange
Message 到达 Broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。
常用的类型有:direct (点对点), topic(发布订阅) 以及 fanout (广播)。
Queue
消息最终被送到这里等待 Consumer 取走,一个 Message 可以被同时拷贝到多个 queue 中
Binding
Exchange 和 Queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保存到 Exchange 中的查询表中,作为 Message 的分发依据。
JMS Vs AMQP
比较项目 / AMQP / JMS
定义 Wire级协议 JAVA-API
跨平台 是 否
跨语言 是 否
消息收发模型
direct/topic/fanout/header exchange
P2P PUB/SUB
消息类型
二进制数据
text/object/bytes/stream/map
消息流
producer 发消息到 exchange ,exchange将消息 路由到 queue ,consumer从 queue中消费消息
producer 发消息到 queue 或 topic ,consumer从 queue 或 topic 中消费消息
ActiveMQ 分为两个版本:ActiveMQ Classic 和 ActiveMQ Artemis ,
ActiveMQ Classic 就是原来的 ActiveMQ,而 ActiveMQ Artemis 是在 RedHat 捐赠的 HornetQ 服务器代码的基础上开发的,
两者代码完全不同,后者支持 JMS2.0,使用基于 Netty 的异步 IO,大大提升了性能,后者不仅支持 JMS 协议,还支持 AMQP 协议、STOMP 以及 MQTT
上一篇
下一篇
prometheus http_sd_config 基于http服务发现
简单家常菜
flink prometheus 监控指标
rabbitmq 管理页面
RabbitMQ 消息发送和消费过程
Flink JobManager与TaskManage 运行架构