观察者模式在分布式系统中的变体:发布-订阅模式
推荐一个学习网站,http://easelearningai.com 输入学习主题,会根据你的知识背景,帮你把学习内容讲得通俗易懂。
观察者模式在分布式系统中的变体:发布-订阅模式
概要
简单说,发布-订阅模式就是“你只管喊,谁想听谁听”——一个消息发布者(喊话的人)不需要知道谁会收到消息,甚至不需要知道有没有人在听;而订阅者(听众)只关心自己感兴趣的内容,不需要知道是谁在喊。
这听起来是不是很像我们日常生活中的微信群?你在群里发了一条消息,群里的每个人都能看到。但你不需要知道谁在看、谁没看,也不需要把消息挨个私聊发给每个人。这就是发布-订阅模式最朴素的原型。
但等等,你可能会问:“这和观察者模式有什么区别?观察者模式不也是‘一个对象变化,通知所有依赖它的对象’吗?”
好问题。这正是我们要讲的核心——从观察者模式到发布-订阅模式,是一次从“点对点”到“广播站”的进化。观察者模式就像你直接给朋友打电话:“我到了,你出来吧。”——你需要知道对方是谁,电话号码是多少。而发布-订阅模式就像你在广场上用喇叭喊:“我到了,想见我的来广场东门。”——你不需要知道谁会来,甚至不需要知道有没有人来。
这个进化,是为了解决分布式系统(比如微服务架构、消息队列系统)中一个根本性的问题:当系统变得庞大、分散、动态变化时,如何让不同组件之间高效、松耦合地通信?
整体架构流程
想象一个大型购物网站:用户下单后,系统需要做很多事——扣库存、发短信通知、更新用户积分、生成物流单、通知商家备货……如果这些步骤都串在一起做,一旦某个环节卡住(比如短信服务挂了),整个下单流程就瘫痪了。
发布-订阅模式怎么解决这个问题?它引入了一个中间人——通常称为“消息代理”或“事件总线”。整个流程变成了这样:
发布者(下单服务):用户下单后,它只做一件事——向消息代理发送一条消息:“订单已创建,订单号是12345”。它不需要关心谁会处理这条消息。
消息代理(中间人):收到消息后,它根据消息的“主题”(比如“订单创建”),把消息复制多份,分发给所有订阅了这个主题的消费者。
订阅者(各种服务):库存服务、短信服务、积分服务……它们各自订阅了“订单创建”这个主题。当消息到达时,它们各自做自己的事,互不干扰。
这个流程的核心变化是:发布者和订阅者之间不再有直接联系。就像你发了一条朋友圈,你的朋友能看到,但你不必知道谁看了、谁没看。
为什么需要这个“中间人”?
如果不用发布-订阅模式,直接让
