C/S模式,发布/订阅模式和PUSH/PULL模式(上)
CS模式(客户端/服务器模式)
最场景的信息传递模式,也称为Request/Response模式,或者调用模式。http/https协议即此模式。因为最常用所以大家一般都比较熟悉,这里不重点讲了,大家请看图下图:

发布/订阅模式(Publish/Subscribe)
发布订阅模式相对于BS模式稍微难点,我们不妨先看一个生活中的小例子:

如果没有邮局会怎么样?毫无疑问出版社既要发行杂志又要把杂志投递给用户,不仅累而且极其低效!因为大部分时间都将耽误在投递上,发行杂志的事情还有肯能被耽误!此例子可以理解为生活中的"发布订阅模式"
理解完生活中的事例,我们再来看发布订阅模式在软件开发中的重要作用!我们先看下图:

这是一个新闻入库程序的实现的流程,我们来看看此流程有什么问题:
逻辑会越来越复杂:不停将新功能追加后面必然导致程序越来越复杂。
非异步流程:程序是串行执行的,只有确认推送成功后才会走到写入elasticsearch流程。意味着可能有进程等待,程序执行过程将会较长,甚至会超时。
不稳定:只要中间任何一个流程挂掉了,整个程序就挂了,无法走到后面的流程。
再看采用发布订阅模式处理流程:

可以看到新闻入库过程被简化了,只有新闻写入数据库和发布到kafka两个过程。其他的处理程序采用订阅kafka中的新闻消息来实现了各自功能,我们再来看看这样处理有什么好处:
新闻入库简化且几乎不再变更。
处理流程是异步的:新闻发布到kafka后就可以给用户返回新闻入库成功,用户体验好!后面的事情其他程序会异步去完成。
一个程序被拆分成多个程序,每个程序都不算复杂。
即使有一个程序(例如推送程序)挂掉了,其他程序依然可以稳定运行。
总结发布/订阅模式:

我们可以看到发布订阅模式有3个角色,分别是一个生产者,一个消息管理器,多个消费者,生产者将消息发布到消息管理器,而多个消息消费者则会订阅消息管理器中消费者发布的内容。这便是发布订阅模式的基本组成。
发布订阅模式的意义:
降低系统耦合性。
提供系统稳定性。
系统更加灵活
降低每个程序的复杂度
...
本节就先分析到这来了!
仁者见仁智者见智,欢迎大家评论指正!
分享或关注公众号的帅哥会越来越帅!美女会越来越美!

C/S模式,发布/订阅模式和PUSH/PULL模式(上)的更多相关文章
- RabbitMQ六种队列模式-发布订阅模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅 [本文]RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_8.RabbitMQ研究-工作模式-发布订阅模式-生产者
Publish/subscribe:发布订阅模式 发布订阅模式: 1.每个消费者监听自己的队列. 2.生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将 ...
- 4.js模式-发布-订阅模式
1. 发布-订阅模式 var observe = (function(){ var events = {}, listen, trigger, remmove; listen = function(k ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_9.RabbitMQ研究-工作模式-发布订阅模式-消费者
消费者需要写两个消费者 定义邮件的类 复制以前的代码到邮件类里面进行修改 最上面 声明队列的名称和交换机的名称 监听修改为email 的队列的名称 手机短信接收端 复制一份email的接收端的代码 改 ...
- 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 抽象主题(Subject):它把所有观察者对 ...
- java 观察这模式(发布订阅模式)
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息. 抽象 ...
- Asp.Net进阶/管家模式+发布订阅模式:练习
现在需要实现一个需求:我需要在一个窗体中发送一个信息,其余几个窗体都能同时接收到发送的消息. 1.界面:一个管家窗体,1个主窗体,2个订阅者窗体.其中管家窗体为启动窗体. 2.订阅:2个订阅窗体订阅主 ...
- Redis消息通知(任务队列和发布订阅模式)
Redis学习笔记(十)消息通知(任务队列和发布订阅模式) 1. 任务队列 1.1 任务队列的特点 任务队列:顾名思义,就是“传递消息的队列”.与任务队列进行交互的实体有两类,一类是生产者(produ ...
- 设计模式-发布订阅模式(javaScript)
1. 前言 2. 什么是发布订阅模式 3. 发布订阅优缺点 4. 举例 4. 总结 1. 前言 发布订阅者模式是为了发布者和订阅者之间避免产生依赖关系,发布订阅者之间的订阅关系由一个中介列表来维护.发 ...
随机推荐
- Android 显示html标签或者带图片
Android中显示html文件要用Html.fromHtml(...)处理过的返回值,返回值可以成为setText()的参数. 只显示带文本的html可以用下面的方法处理html文件. public ...
- A memory map of an object
Phone类 package com.itheima_02; /* * 手机类: * 成员变量:品牌,价格,颜色... * 成员方法:打电话,发短信... */ public class Phone ...
- integer storage and decimal storage differences in java
package storage.java; public class StorageJava { public static void main(String[] args) { byte b = 1 ...
- 4类Storage方案(AS开发实战第四章学习笔记)
4.1 共享参数SharedPreferences SharedPreferences按照key-value对的方式把数据保存在配置文件中,该配置文件符合XML规范,文件路径是/data/data/应 ...
- CPU纯软件全虚拟化技术
我们在前面的文章中提到了虚拟化技术的大致分类情况,即分为全虚拟化.半虚拟化和硬件辅助虚拟化3大类.而我们虚拟化技术最主要的虚拟主体就是我们的硬件CPU.内存和IO,那么我们的CPU在全虚拟化模式下如何 ...
- PLSQL Developer V10 注册码
PLSQL Developer V10 注册码(V10.0.3.1701可以使用)注册时间至:9999/12/31 License Number:999 Product Code:ljkfuhjpcc ...
- django项目配置
创建工程 本项目使用git管理项目代码,代码库放在gitee码云平台.(注意,公司中通常放在gitlab私有服务器中) 1. 在git平台创建工程 1) 创建私有项目库 2)克隆项目到本地 3)创建并 ...
- SQL点点滴滴_SQL分页查询
假如tb_customer表中的数据量非常大,在显示时要分页显示而且每页只显示10条信息.为了效果我们取第三页的数据. 方法一:遍历两次表,取不同的数据. select top 10 * from t ...
- rabbitmq集群配置
原文地址:http://www.360doc.com/content/14/0911/17/15077656_408713893.shtml 按照文章中的方式成功建立了两台机器的集群. 但文章中加入集 ...
- Nginx学习---Nginx的详解_【all】
1.1. Nginx简介 1.什么是nginx nginx:静态的,开源的www软件,可以解析静态的小文件(低于1M ),支持高并发占用较发少的资源(3W并发,10个进程,内存150M),跨平台 te ...