38.4 黑板模式

38.4 黑板模式

38.4.1 黑板模式的意图

黑板模式(Blackboard Design Pattern)是观察者模式的一个扩展,知名度并不高,但是我们使用的范围却非常广。黑板模式的意图如下:

允许消息的读写同时进行,广泛地交互消息[^1]。

简单地说,黑板模式允许多个消息读写者同时存在,消息的生产者和消费者完全分开。 这就像一个黑板,任何一个教授(消息的生产者)都可以在其上书写消息,任何一个学生 (消息的消费者)都可以从黑板上读取消息,两者在空间和时间上可以解耦,并且互不干扰。示意图如图38-8所示。

image-20211001235608017

图38-8 黑板模式示意图

看到这个图大家可能会说:这不是一个简单的消息广播吗?是的,确实如此,黑板模式确实是消息的广播,主要解决的问题是消息的生产者和消费者之间的耦合问题,它的核心是消息存储(黑板),它存储所有消息,并可以随时被读取。当消息生产者把消息写入到消息仓库后,其他消费者就可以从仓库中读取。当然,此时消息的写入者也可以变身为消息的阅读者,读写者在时间上解耦。对于这些消息,消费者只需要关注特定消息,不处理与自己不相关的消息,这一点通常通过过滤器来实现。

38.4.2 黑板模式的实现方法

黑板模式一般不会对架构产生什么影响,但它通常会要求有一个清晰的消息结构。黑板模式一般都会提供一系列的过滤器,以便消息的消费者不再接触到与自己无关的消息。在实际开发中,黑板模式常见的有两种实现方式。

  • 数据库作为黑板

利用数据库充当黑板,生产者更新数据信息,不同的消费者共享数据库中信息,这是最常见的实现方式。该方式在技术上容易实现,开发量较少,熟悉度较高。缺点是在大量消息和高频率访问的情况下,性能会受到一定影响。

在该模式下,消息的读取是通过消费者主动“拉取”,因此该模式也叫做“拉模式”。

  • 消息队列作为黑板

以消息队列作为黑板,通过订阅-发布模型即可实现黑板模式。这也是黑板模式被淡忘的一个重要原因:消息队列(Message Queue)已经非常普及了,做Java开发的已经没有几个不知道消息队列的。

在该模式下,消费者接收到的消息是被主动推送过来的,因此该模式也称为“推模式”。


提示 黑板模式不做详细讲解,因为我们现在已经在大量使用消息队列,既可以做到消息的同步处理,也可以实现异步处理,相信大家已经在开发中广泛使用了,它已经成为跨系统交互的一个事实标准了。


[^1]: 原文是allows multiple readers and writers. Communicates information system-wide。