跳到主要内容

消息中间件简介 mom-intro

· 阅读需 6 分钟

同步

分布式对象技术(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. 返回远程调用

该种模式引发的问题:

  1. 客户端会一直被阻塞,直到服务(对象操作)返回(紧耦合).
  2. 过度的链接(每次调用都需要一个链接来进行处理和网络访问等).
  3. 很难对调用失败做出响应(调用的服务可能抛出异常,可能服务未启动等...).
  4. 不适用于嵌套调用(服务对象调用客户端的对象又需要引入另外一个服务对象的操作).

异步

消息中间件 (Message Oriented Middleware - MOM)

  • 异步操作(调用者发送一个消息,然后继续工作,"fire and forget")
  • 存储,转发通信
  • 发送和接收之间是松耦合的
    1. 不需要在同一时间存活
    2. 发送者不需要知道接收者的具体位置,反之亦然.
发送应用->发送队列:非阻塞消息发送操作
发送队列->网络
网络->接收队列
接收队列->接收应用

类比:

同步(RPC/DOT) -> 电话 异步(MOM) -> 邮件

2. 消息模型

  1. 点到点 (P2P - Point to Point) {#ch-2-1}

  • 每个接收者(应用)一个队列
  • 一对一(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 优先级队列: 接收应用

共有/私有队列

  • 定义不同的访问权限
    1. 共有队列: 所有发送者均能发送消息,不需要访问控制
    2. 私有队列: 发送者发送到私有队列需要进行认证

其他类型队列

日志队列 : 消息系统会保存一个该队列的副本,达到日志记录或监控的目的

Dead-letter 队列 : 该队列会持有所有无法分发的消息(因为 TTL 过时的消息或队列地址无法解析的消息).

桥接和连接器队列(Bridge/connector queue) : 连接不同的队列系统,例如: MSMQ, JMS

4. 消息中转(Message broker) - 应用集成模式

Message broker 将消息分发给接收者

参考