消息队列及发布/订阅模式


摘自:《大型网站技术架构》 李智慧

1 消息驱动架构
    消息驱动架构(Event Driven Architecture) :通过在底耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作,典型的EDA架构就是操作系统中常见的生产者消费者模式。
    在大型网站中最常用的是分布式消息队列:
         消息队列及发布/订阅模式_第1张图片
     消息队列利用”发布—订阅者模式“工作,消息发送者发布消息,一个或者多个消息接受者订阅消息。消息发送者是消息源,在对消息进行处理后将消息发送至分布式消息队列,消息消息接受者从分布式消息队列获取该消息后继续进行处理。
       松耦合:可以看到,消息发送者和消息 接收者之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,而消息接收者只需要从分布式消息队列获取消息后进行处理,不需要知道该消息从何而来。
       消息接收者在对消息进行过滤、处理、包装后,构成一个新的消息类型,将消息继续发送出去,等待其他消息接收者订阅处理该消息。因此基于事件驱动的业务架构可以是一系列的流程。

2 分布式消息队列
    首先跟一般队列一样是一种先进先出的数据结构。分布式消息队列可以看做将这种数据结构部署到独立的服务器上,通过远程访问接口使用分布式消息队列,进行消息存储操作,进而实现分布式的异步调用,基本原理如图:
消息队列及发布/订阅模式_第2张图片

如上图所示,我们可以明确三个步凑:

  ①消息生产者应用程序通过远程访问接口将消息推送给消息队列服务器,消息队列服务器将消息写入本地内存队列后马上返回成功响应给消息生产者。

  ②消息队列服务器根据消息订阅列表查找订阅该消息的消费者应用程序,将消息队列中的消息按照先进先出的原则将消息通过远程通信接口发送给消费者应用程序;

  ③消费者应用程序接收到推送过来的消息之后进行相关的一系列处理,过程终止;


伸缩性:将新服务器加入到分布式消息队列集群中,通知生产者服务器更改消息队列服务列表即可。
可用性:为了避免消费者进程处理缓慢,分布式消息服务器内存空间不足的问题,如果内存队列已满,会将消息写入磁盘,消息推送模块在将内存队列中的消息处理完后,将磁盘内容加载到内存队列继续处理。
    为了避免消息队列服务器宕机造成消息丢失,可以将消息成功发送到消息队列的消息存储在消息生产者服务器,等消息真正被消息消费者服务器处理后才删除消息。
    消息队列服务器宕机,生产者选择分布式消息队列服务器中的其他机器。

3 ”发布/订阅“模式
    “发布/订阅”模式包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。
      对任务  ”发布/订阅“模式很容易想到可以
使用消息队列实现的,Redis中就包含发布订阅模式的命令。

你可能感兴趣的:(redis)