RabbitMQ复习<一>基本概念
一.什么是MQ
-
MQ全称MessageQueue,主要是用于程序和程序直接通信,异步+解耦
-
使用场景:
- 核心应用
- 解耦:订单系统-》物流系统
- 异步:用户注册-》发送邮件,初始化信息
- 削峰:秒杀、日志处理
- 跨平台 、多语言
- 分布式事务、最终一致性
- RPC调用上下游对接,数据源变动->通知下属
- 核心应用
二.AMQP和JMS消息服务
JMS
-
JMS: Java消息服务(Java Message Service),Java平台中关于面向消息中间件的接口
- JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API
- 是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操作,包括create、send、receive
- JMS是针对java的,就像微软开发了NMS(.NET消息传递服务)
-
特性
- 面向Java平台的标准消息传递API
- 在Java或JVM语言比如Scala、Groovy中具有互用性
- 无需担心底层协议
- 有queues和topics两种消息传递模型
- 支持事务、能够定义消息格式(消息头、属性和内容)
-
常见概念
- JMS提供者:连接面向消息中间件的,JMS接口的一个实现,RocketMQ,ActiveMQ,Kafka等等
- JMS生产者(Message Producer):生产消息的服务
- JMS消费者(Message Consumer):消费消息的服务
- JMS消息:数据对象
- JMS队列:存储待消费消息的区域
- JMS主题:一种支持发送消息给多个订阅者的机制
- JMS消息通常有两种类型:点对点(Point-to-Point)、发布/订阅(Publish/Subscribe)
-
基础编程模型
- MQ中需要用的一些类
- ConnectionFactory :连接工厂,JMS 用它创建连接
- Connection :JMS 客户端到JMS Provider 的连接
- Session: 一个发送或接收消息的线程
- Destination :消息的目的地;消息发送给谁.
- MessageConsumer / MessageProducer: 消息消费者,消息生产者
AMQP
由于JMS或者NMS都没有标准的底层协议,API是与编程语言绑定的,每个消息队列厂商就存在多种不同格式规范的产品,对使用者就产生了很多问题, AMQP解决了这个问题,它使用了一套标准的底层协议。(制定了MQ规范)
-
AMQP:全称(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题,就是是一种协议,兼容JMS
-
更准确说的链接协议 binary- wire-level-protocol 直接定义网络交换的数据格式,类似http
-
具体的产品实现比较多,RabbitMQ就是其中一种
-
特性
- 独立于平台的底层消息传递协议
- 消费者驱动消息传递
- 跨语言和平台的互用性、属于底层协议
- 有5种交换类型direct,fanout,topic,headers,system
- 面向缓存的、可实现高性能、支持经典的消息队列,循环,存储和转发
- 支持长周期消息传递、支持事务(跨消息队列)
AMQP和JMS的主要区别
- AMQP不从API层进行限定,直接定义网络交换的数据格式,这使得实现了AMQP的provider天然性就是跨平台(**JMS也可以实现跨平台,但需要针对不同语言进行规范的制定,相对AMPQ天然性而言麻烦一些 **)
- 比如Java语言产生的消息,可以用其他语言比如python的进行消费
- AQMP可以用http来进行类比,不关心实现接口的语言,只要都按照相应的数据格式去发送报文请求,不同语言的client可以和不同语言的server进行通讯
- JMS消息类型:TextMessage/ObjectMessage/StreamMessage等
- AMQP消息类型:Byte[]
三.MQTT
- MQTT: 消息队列遥测传输(Message Queueing Telemetry Transport )
- 作用场景
- 计算性能不高的设备不能适应AMQP上的复杂操作,MQTT它是专门为小设备设计的
- MQTT主要是是物联网(IOT)中大量的使用
- 主要面对智能家居(智能开关,智能窗帘…)
- 特性
- 内存占用低,为小型无声设备之间通过低带宽发送短消息而设计
- 不支持长周期存储和转发,不允许分段消息(很难发送长消息)
- 支持主题发布-订阅、不支持事务(仅基本确认)
- 消息实际上是短暂的(短周期)
- 简单用户名和密码、不支持安全连接、消息不透明