如何选型
- 关于性能
- 吞吐量
- 延迟
- 关于选型
- 场景
- 指标
- 关于开发
- 抽象
- 封装
关于维护
各个方式的不足
- 文件:明显不方便、不及时
- socket:使用麻烦,多数情况下不如RPC
- 数据库:不实时,但经常有人拿数据库模拟消息队列
- RPC:调用关系复杂,同步处理,压力大的时候无法缓冲
期望方式
异步通信:异步通信减少线程等待,特别是处理批量等大事务、耗时操作
- 通信可靠:提供多种消息模式、服务质量、顺序保障等
- 系统解耦:系统间不直接调用,降低依赖,特别是一方不在线也能保证通信最终完成
-
DLQ
DeadLetterQueue死信队列
- 重试N次依然失败的消息、执行超时的消息等都会被丢到DLQ
是MQ为了保证消息可靠的一种机制,为了不影响线上服务和资源,后续可人工介入处理
Camel
-
RoaringBitmap
-
消息处理模式与消息协议
消息处理模式
PTP
PointToPoint
- 点对点模式
-
PubSub
PublishSubscribe
- 发布订阅模式
- 对应于Topic模式
消息处理保障
QoS
- AtMostOnce,至多一次,消息可能丢失但不会重复发送
- AtLeastOnce,至少一次,消息不会丢失,但可能会重复(推荐使用此模式,业务上去重RoaringBitmap)
ExactlyOnce,精确一次,每条信息肯定会被传输且仅传输一次
事务
通过确认机制实现消息的事务性
-
有序性
同一个Topic/Queue的消息,保障按顺序投递
-
消息协议
JMS
JavaMessageService
- 关注于应用层的API协议,类似JDBC
- Message结构
- Body
- Header
- Property(自定义的头信息)
- Messaging行为
- PTP&PubSub
- 持久化
- 事务机制
- 确认机制
- 临时机制
- TemporaryQueue
- TemporaryTopic
-
消息队列的通用结构
开源中间件
第一代主要不支持堆集,内存满了系统就崩溃了
- 第二代基于磁盘和堆集以及WAL,只要磁盘够,支持无限的消息
- 第三代计算和存储分离,相互不受影响

