百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

架构师成长之路:设计模式之发布订阅模式

yuyutoo 2024-10-20 13:10 7 浏览 0 评论

目录

  • 发布/订阅者模式的优点
  • 实现发布/订阅者模式需要考虑的点
  • 何时应使用发布/订阅者模式
  • 发布/订阅者模式与观察者模式

熟悉消息中间件的同学应该对发布/订阅模式(Publish Subscribe Pattern)并不陌生。即使你不了解消息中间件,那么在平时生活中发布/订阅模式也是非常常见的场景。

比如你打开你的微信订阅号,你订阅的作者发布的文章,会广播给每个订阅者。在这个场景里,微信公众号就是一个Pulisher,而你就是一个Subscriber,你收到的文章就是一个Message。

下面我们就一起了解一下发布/订阅模式,如果你要了解并在自己的项目中使用这个模式,或者你对消息队列(MQ)等中间件的原理感兴趣,那么这个系列的文章就是最高效地深入浅出宝典。

模式介绍

发布/订阅模式(Publish Subscribe Pattern)属于设计模式中的行为(Behavioral Patterns)。

在软件架构中,发布/订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者),而是通过消息通道广播出去,让订阅改消息主题的订阅者消费到。

发布/订阅者模式最大的特点就是实现了松耦合,也就是说你可以让发布者发布消息、订阅者接受消息,而不是寻找一种方式把两个分离的系统连接在一起。当然这种松耦合也是发布/订阅者模式最大的缺点,因为需要中间的代理,增加了系统的复杂度。而且发布者无法实时知道发布的消息是否被每个订阅者接收到了,增加了系统的不确定性。

发布/订阅者模式的优点

发布/订阅者模式的优点可以归纳为:

  • 松耦合/Independence

发布/订阅者模式可以将众多需要通信的子系统(Subsystem)解耦,每个子系统都可以独立管理。而且即使部分子系统下线了,也不会影响系统消息的整体管理。

发布/订阅者模式为应用程序提供了关注点分离。每个应用程序都可以专注于其核心功能,而消息传递基础结构负责将消息路由到每个消费者手里。

  • 高伸缩性/Scalability

发布/订阅者模式增加了系统的可伸缩性,并提高了发送者的响应能力。原因是发送方(Publisher)可以快速地向输入通道发送一条消息,然后返回到其核心处理职责,而不必等待子系统处理完成。然后消息传递的基础结构负责确保把消息传递到每个订阅者(Subscriber)手里。

  • 高可靠性/Reliability

发布/订阅者模式提高了可靠性。异步的消息传递有助于应用程序在增加的负载下继续平稳运行,并且可以更有效地处理间歇性故障。

  • 灵活性/Flexibility

你不需要关心不同的组件是如何组合在一起的,只要他们共同遵守一份协议即可。

发布/订阅者模式允许延迟处理或者按计划的处理。例如当系统负载大的时候,订阅者可以等到非高峰时间才接收消息,或者根据特定的计划处理消息。

  • 可测试性/Testability

发布/订阅者模式提高了可测试性。通道可以被监视,消息可以作为整体集成测试策略的一部分而被检查或记录。

实现发布/订阅者模式需要考虑的点

  • 订阅处理

订阅者可以在消息通道中订阅或者取消订阅某个话题。

  • 安全

连接到任何消息通道必须受到安全策略的限制,以防止未经授权的用户或应用程序窃听。

  • 内容筛选

根据每条消息的内容检查和分发消息。每个订户都可以指定其感兴趣的内容。

订阅者通常只对发布者分发的消息的子集感兴趣。消息服务通常允许订户缩小以下用户接收到的消息集。

考虑允许订户通过通配符订阅多个主题。每个主题都有一个专用的输出通道,每个使用者都可以订阅所有相关主题。

  • 双向通信

发布订阅系统中的通道被视为单向的。

如果特定订户需要向发布服务器发送确认或通信状态,请考虑使用请求/回复模式。此模式使用一个通道向订阅服务器发送消息,以及一个单独的回复通道向发布服务器进行通信。

  • 消息排序

使用者实例接收消息的顺序不一定得到保证,也不一定反映消息的创建顺序。

设计该系统以确保消息处理是等量的,以帮助消除对消息处理顺序的任何依赖。

  • 消息优先级

有些解决方案可能需要按特定顺序处理消息。优先级队列模式提供了一种确保特定消息先于其他消息传递的机制。

  • 有毒信息

格式错误的消息或需要访问不可用资源的任务可能会导致服务实例失败。系统应防止此类消息返回到队列,否则可能导致系统故障。

  • 消息重复

同一消息可能会发送多次。例如,发送者可能在发布消息后出现了异常,没有记录自己已经成功发送了消息,然后,发送者的新实例可能会启动并重复该消息。

消息基础结构应基于消息ID实现重复消息检测和删除(也称为重复数据消除),以便最多提供一次消息传递。

  • 消息过期

消息的生命周期可能有限。如果在这段时间内没有处理,它可能不再有价值,应该丢弃。发送方可以指定过期时间作为消息中数据的一部分。在决定是否执行与消息关联的业务逻辑之前,接收者可以检查此信息,以确保消息没有过期。

  • 消息调度

例如,消息可能会被暂时禁止,直到特定的日期和时间才被处理。

何时应使用发布/订阅者模式

如果你的程序只有很少的订阅者,或者需要与子系统进行实时的交互,那么发布/订阅者模式是不适合的。

在以下情况下可以考虑使用此模式:

  1. 应用程序需要向大量消费者广播信息。例如微信订阅号就是一个消费者量庞大的广播平台。
  2. 应用程序需要与一个或多个独立开发的应用程序或服务通信,这些应用程序或服务可能使用不同的平台、编程语言和通信协议。
  3. 应用程序可以向消费者发送信息,而不需要消费者的实时响应。
  4. 被集成的系统被设计为支持其数据的最终一致性模型。
  5. 应用程序需要将信息传递给多个消费者,这些消费者可能具有与发送者不同的可用性要求或正常运行时间计划。例如你消息在上午发布了出去,消费者计划在下午才去处理这些消息。

发布/订阅者模式与观察者模式

发布/订阅者模式与观察者模式是我们经常混淆的两种设计模式,可以说两种设计模式在行为上有一定的相似性,但却是两种不同的设计模式。或者说发布/订阅者模式观察者模式的一种变体。

通过下图可以清晰地看到两种设计模式的不同点。

发布/订阅者模式观察者模式主要有以下几个不同点:

  1. 在观察者模式中,主体维护观察者列表,因此主体知道当状态发生变化时如何通知观察者。然而,在发布者/订阅者中,发布者和订阅者不需要相互了解。它们只需在中间层消息代理(或消息队列)的帮助下进行通信。
  2. 在发布者/订阅者模式中,组件与观察者模式完全分离。在观察者模式中,主题和观察者松散耦合。
  3. 观察者模式主要是以同步方式实现的,即当发生某些事件时,主题调用其所有观察者的适当方法。发布服务器/订阅服务器模式主要以异步方式实现(使用消息队列)。
  4. 发布者/订阅者模式更像是一种跨应用程序模式。发布服务器和订阅服务器可以驻留在两个不同的应用程序中。它们中的每一个都通过消息代理或消息队列进行通信。

本文介绍了发布者/订阅者模式的相关概念,后面几篇会详细介绍具体实现。

最后

大家觉得不错的可以转发和关注下,欢迎大家讨论,以后还会不定期更新更多精选文章!

相关推荐

Docker部署 chatgpt-web-midjourney-proxy:开启一站式AI与绘图

ChatGPT和Midjourney的结合无疑是创新性的突破。ChatGPT作为强大的语言模型,能够为用户提供智能的对话和文本生成服务。而Midjourney则以其出色的绘画能力,能够根据...

Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)

具体案例:局域网内有两台主机,一台Linux、一台Windows,现在需要配置一台Cacti监控服务器对这两台主机进行监控...

那些少为人知却非常有意思好用的 Chrome 扩展

ChromeWebStoreSessionManager要睡觉了,还有网页没看完怎么办?等明天点开歷史记录重新加载?No!有这个保存当前打开的链接,下回直接打开一串网址,好顶赞有木有!!!chr...

分享一款轻量级 HTTP(S) 代理 TinyProxy

概述众所周知,我们常用的Web服务器Nginx/Apache都可以很方便的用来做为正向或反向代理服务器使用。但是它们都并不支持HTTPS的正向代理。Nginx做为正向代理不支持HT...

深入理解 WebSecurityConfigurerAdapter「源码篇」

我们继续来撸SpringSecurity源码,今天来撸一个非常重要的WebSecurityConfigurerAdapter。我们的自定义都是继承自WebSecurityConfigurer...

RPC、Web Service等几种远程监控通信方式对比

几种远程监控通信方式的介绍一.RPCRPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.meth...

老酒好喝,5G时代数据中心柴油发电机组以GPRS方式接入动环监控

背景:随着手机的普及,电信运营商基站越建越多,网络覆盖范围也越来越广,基本上随时随地都能通过运营商的网络上网冲浪,这给我们传统的通过有线方式实现的动环监控也提带来了新的启发:对于不具备有线传输条件的的...

为了春节红包大战,微信做了一次成功的预热!

经过上午的预告,微信在今天下午17:00正式推出了微信红包新玩法——红包照片。微信用户在朋友圈点击照片发送按钮,会看到“红包照片”选项,用户在选择发布照片之后,这张照片将被模糊处理后,再发送到朋友...

Proxy-Lite实战:3步部署+2个案例,轻松掌握轻量级网页自动化

大家好,我是何三,80后老猿,独立开发者一、Proxy-Lite模型概述...

会Python?那么你一定要试一试mitmproxy

mitmproxy是一款工具,也可以说是python的一个包,使用这个工具可以在命令行上进行抓包(现在也可以在web页面上查看上抓的数据包了),还可以对所抓到的包进行脚本处理,非常有用。和...

十大Web安全扫描工具,你知道哪些?

初入门时,喜欢将目标站点直接丢扫描器,慢慢等扫描结果,极度依赖Web扫描器;而有一些漏洞高手,善于运用运用各种工具但并不依赖工具,经常可以找到扫描工具发现不了的漏洞。一款好用的Web扫描器对于白帽子来...

鸿蒙5网页开发神器 ArkWeb:让 Web 和原生手拉手跳舞

你有没有想过,在鸿蒙应用里既能用原生代码写高性能界面,又能直接塞进一个网页?这听起来有点像把汉堡和披萨拼在一起,但ArkWeb(方舟Web)真的做到了!今天咱们就聊聊这个神奇的工具,看看它如何让...

MapReduce过程详解及其性能优化(详细)

从JVM的角度看Map和ReduceMap阶段包括:第一读数据:从HDFS读取数据1、问题:读取数据产生多少个Mapper??Mapper数据过大的话,会产生大量的小文件,由于Mapper是基于虚拟...

大数据平台建设需要掌握的14个知识

Q1、大数据分析中的实时推荐是如何实现的?@rein07某证券系统架构师:实时推荐需要使用实时处理框架结合推荐算法,从而做到对数据的实时处理和推荐。实时处理框架有Storm、Flink、Spark...

HDFS可视化管理系统设计与实现(hdfs的可靠性设计,主要依靠哪些机制来实现)

摘要:Hadoop工具核心模块包括分布式文件系统(HadoopDistributedFileSystem,HDFS)和分布式编程模型MapReduce,其中HDFS是Hadoop数据存储处理的...

取消回复欢迎 发表评论: