一、消息
1、什么是消息
消息本质上是一种数据结构(当然,对象也可以看做是一种特殊的消息),它包含消费者与服务双方都能识别的数据,这些数据需要在不同的进程(机器)之间进行传递,并可能会被多个完全不同的客户端消费
2、消息分类
-
同步消息 例如:远程调用服务,同步RPC
-
异步消息 客户端主服务不需要等待服务处理消息,简单来说就是不阻塞。
3、消息的重要概念
-
消息代理(message broker)
-
目的地(destination)
二、队列
1、概念
队列(Queue),是先进先出(FIFO, First-In-First-Out)的线性表,通俗的讲队列就是一群人或者事物按照排好的顺序等待接受服务或者处理
2、分类
本地队列
本地队列按照功能可划分为初始化队列,传输队列,目标队列和死信队列。初始化队列用作消息触发功能。传输队列只是暂存待传的消息,条件许可的情况下,通过管道将消息传送到其他的队列管理器。目标队列是消息的目的地,可以长期存放消息。如果消息不能送达目标队列,也不能再路由出去,则被自动放入死信队列保存。
别名队列&远程队列
只是一个队列定义,用来指定远端队列管理器的队列。使用了远程队列,程序就不需要知道目标队列的位置。
模型队列
模型队列定义了一套本地队列的属性结合,一旦打开模型队列,队列管理器会按照这些属性动态地创建出一个本地队列。
三、消息队列
1、什么是MQ
MQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。可以将它理解成邮局,发送者将消息传递到邮局,然后由邮局帮我们发送给具体的消息接收者(消费者),具体发送过程与时间我们无需关心,它也不会干扰我进行其它事情。
它被广泛的应用与跨平台、跨系统的分布式系统之间,为它们提供高效可靠的异步传输机制
2、特点
-
可靠性传输
是消息中间件的重要特点,对于应用来说,只要成功把数据提交给消息中间件,那么关于数据可靠传输的问题就由消息中间件来负责
-
不重复传输
不重复传播也就是断点续传的功能,特别适合网络不稳定的环境,节约网络资源
-
异步性传输
异步性传输是指,接受信息双方不必同时在线,具有脱机能力和安全性
-
消息驱动
接到消息后主动通知消息接收方
-
支持事务
应用程序可以把一些数据更新组合成一个工作单元,这些更新通常是逻辑相关的,为了保障数据完整性,所有的更新必须同时成功或者同时失败
3、应用场景
-
异步-流量削峰
例如: 在电子商务一些秒杀、促销活动中
-
异步-系统解耦
例如: 发送短信、发送邮件、通知物流等
备注
消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。
四、JMS与AMQP
JMS
JMS(JAVA Message Service,java消息服务)是java的消息服务 JMS是一套 API,是j2EE标准的一部分。
JMS是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操作,包括create、send、receive等
JMS是Java Enterprise Edition的一部分。从使用角度看,JMS和JDBC担任差不多的角色,用户都是根据相应的接口可以和实现了JMS的服务进行通信,进行相关的操作
消息模型
点到点(P2P)模型
结构图
xiao'x说明
使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。比如:我们生产者发送100条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费。)
发布/订阅(Pub/Sub)模型
结构图
image说明
发布订阅模型(Pub/Sub) 使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息广播之后才订阅的用户则是收不到该条消息的。
消息数据格式
-
StreamMessage -- Java原始值的数据流
-
MapMessage--一套名称-值对
-
TextMessage--一个字符串对象
-
ObjectMessage--一个序列化的 Java对象
-
BytesMessage--一个字节的数据流
AMQP
AMQP(advanced message queuing protocol) 是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,可以跨语法开发
AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议),兼容JMS
常见的消息中间件
功能 | 消息队列 RocketMQ | Apache RocketMQ (开源) | 消息队列 Kafka | Apache Kafka (开源) |
---|---|---|---|---|
安全防护 | 支持 | 不支持 | 支持 | 不支持 |
主子账号支持 | 支持 | 不支持 | 支持 | 不支持 |
可靠性 | - 同步刷盘 - 同步双写 - 超3份数据副本 - 99.99999999% | - 同步刷盘 - 异步刷盘 | - 同步刷盘 - 同步双写 - 超3份数据副本 - 99.99999999% | 异步刷盘,丢数据概率高 |
可用性 | - 非常好,99.95% - Always Writable | 好 | - 非常好,99.95% - Always Writable | 好 |
横向扩展能力 | - 支持平滑扩展 - 支持百万级 QPS | 支持 | - 支持平滑扩展 - 支持百万级 QPS | 支持 |
Low Latency | 支持 | 不支持 | 支持 | 不支持 |
消费模型 | Push / Pull | Push / Pull | Push / Pull | Pull |
定时消息 | 支持(可精确到秒级) | 支持(只支持18个固定 Level) | 暂不支持 | 不支持 |
事务消息 | 支持 | 不支持 | 不支持 | 不支持 |
顺序消息 | 支持 | 支持 | 暂不支持 | 支持 |
全链路消息轨迹 | 支持 | 不支持 | 暂不支持 | 不支持 |
消息堆积能力 | 百亿级别 不影响性能 | 百亿级别 影响性能 | 百亿级别 不影响性能 | 影响性能 |
消息堆积查询 | 支持 | 支持 | 支持 | 不支持 |
消息回溯 | 支持 | 支持 | 支持 | 不支持 |
消息重试 | 支持 | 支持 | 暂不支持 | 不支持 |
死信队列 | 支持 | 支持 | 不支持 | 不支持 |
性能(常规) | 非常好 百万级 QPS | 非常好 十万级 QPS | 非常好 百万级 QPS | 非常好 百万级 QPS |
性能(万级 Topic 场景) | 非常好 百万级 QPS | 非常好 十万级 QPS | 非常好 百万级 QPS | 低 |
性能(海量消息堆积场景) | 非常好 百万级 QPS | 非常好 十万级 QPS | 非常好 百万级 QPS | 低 |
开发语言 | Java | Erlang | Java | C |
客户端支持语言 | Java、C、 C++、 Python、 PHP、 Perl、.net 等 | Java、C、 C++、 Python、 PHP、 Perl、.net 等 | Java C++(不成熟) | python、 java、 php、.net 等 |
事务 | 支持 | 不支持 | 支持 | 不支持 |
集群 | 支持 | 支持 | 支持 | 不支持 |
负载均衡 | 支持 | 支持 | 支持 | 不支持 |
网友评论