消息中间件简介 mom-intro
· 6 min read
同步
分布式对象技术(Distributed Object Technologies - DOT), 远程过程调用 RPC: 同步操作 (调用被阻塞,直到被调用者返回).
title: 简单的远程调用
客户端->>服务端: 1.远程调用
Note right of 服务端: 2.服务器处理请求
Note left of 客户端: 客户端被阻塞
服务端-->>客户端: 3. 调用返回
title: 带回调的远程调用
客户端->>服务端: 1.远程调用
Note right of 服务端: 2.服务器处理请求
Note left of 客户端: 客户端被阻塞
服务端->>客户端: 3. 回调
客户端-->>服务端: 4. 回调返回
服务端-->>客户端: 5. 返回远程调用
该种模式引发的问题:
- 客户端会一直被阻塞,直到服务(对象操作)返回(紧耦合).
- 过度的链接(每次调用都需要一个链接来进行处理和网络访问等).
- 很难对调用失败做出响应(调用的服务可能抛出异常,可能服务未启动等...).
- 不适用于嵌套调用(服务对象调用客户端的对象又需要引入另外一个服务对象的操作).
异步
消息中间件 (Message Oriented Middleware - MOM)
- 异步操作(调用者发送一个消息,然后继续工作,"fire and forget")
- 存储,转发通信
- 发送和接收之间是松耦合的
- 不需要在同一时间存活
- 发送者不需要知道接收者的具体位置,反之亦然.
发送应用->发送队列:非阻塞消息发送操作
发送队列->网络
网络->接收队列
接收队列->接收应用
类比:
同步(RPC/DOT) -> 电话 异步(MOM) -> 邮件
2. 消息模型
- 点到点 (P2P - Point to Point) {#ch-2-1}
- 每个接收者(应用)一个队列
- 一对一(1 个发送者,一个接收者)或者多对一(多个发送者,一个接收者)的消息机制.
- 发布-订阅 (PubSub - Publish - Subscribe) {#ch-2-2}
3. 队列类型
- 所有的消息都有相同的优先级
- 消息以他们发送的顺序进行分发
Note over 先进先出队列: 发送应用
Note over 先进先出队列: 消息 3
Note over 先进先出队列: 消息 2
Note over 先进先出队列: 消息 1
Note over 先进先出队列: 消息队列
Note over 先进先出队列: 消息 3
Note over 先进先出队列: 消息 2
Note over 先进先出队列: 消息 1
Note over 先进先出队列: 接收应用
优先级队列
- 消息缓存在 FIFO 队列中,并以优先级进行排序
- 该排序会应用在已经接收到的消息上
Note over 优先级队列: 发送应用
Note over 优先级队列: 消息 3 优先级 1
Note over 优先级队列: 消息 2 优先级 3
Note over 优先级队列: 消息 1 优先级 2
Note over 优先级队列: 消息队列 - 根据消息的优先级从排序
Note over 优先级队列: 消息 2 优先级 3
Note over 优先级队列: 消息 1 优先级 2
Note over 优先级队列: 消息 3 优先级 1
Note over 优先级队列: 接收应用
共有/私有队列
- 定义不同的访问权限
- 共有队列: 所有发送者均能发送消息,不需要访问控制
- 私有队列: 发送者发送到私有队列需要进行认证
其他类型队列
日志队列 : 消息系统会保存一个该队列的副本,达到日志记录或监控的目的
Dead-letter 队列 : 该队列会持有所有无法分发的消息(因为 TTL 过时的消息或队列地址无法解析的消息).
桥接和连接器队列(Bridge/connector queue) : 连接不同的队列系统,例如: MSMQ, JMS
4. 消息中转(Message broker) - 应用集成模式
Message broker 将消息分发给接收者