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. 前言 发布订阅者模式是为了发布者和订阅者之间避免产生依赖关系,发布订阅者之间的订阅关系由一个中介列表来维护.发 ...
随机推荐
- Oracle 计算两个日期间隔的天数、月数和年数
在Oracle中计算两个日期间隔的天数.月数和年数: 一.天数: 在Oracle中,两个日期直接相减,便可以得到天数: select to_date('08/06/2015','mm/dd/yyyy' ...
- Spring Boot框架搭建
用idea搭建Springboot还是很方便的 环境变量是JDK1.8 SpringBoot自带了Tomcat启动也很方便 1.创建项目 2. 3.选择SpringBoot的版本以及组件 4.创建完成 ...
- SQL函数应用-DATEPART()
作用:DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法格式:DATEPART(datepart,date) 参数说明: datepart 是指定应返回的日 ...
- Redis 在Golang中使用遇到的坑
1.从lua脚本传回到go那边的数字是string类型 2.hincrby 返回当前值的计算结果(即存放到redis中的值) 3.hset 一个不存在的key,返回什么呢?即设置失败返回什么错误?(会 ...
- ETCD TLS 配置的坑
一.环境准备 环境总共 3 台虚拟机,系统为centos7,1个 master,2 个 etcd 节点,master 同时也作为 node 负载 pod,在分发证书等阶段将在另外一台主机上执行,该主机 ...
- August 15th 2017 Week 33rd Tuesday
Would rather have done a regret, do not miss the regret. 宁愿做过了后悔,也不要错过了后悔. Yesterday, I read several ...
- Lua操作mysql
require "luasql.mysql" --创建环境对象 env = luasql.mysql() --连接数据库 conn = env:connect("数据库名 ...
- python3程序设计基本方法
实例 6.升级维护 总结: 打了多年的游击战.突然经过教官的指导,觉得很受益,程序自学需要总结和交流.
- Iptables教程
iptables防火墙简介 Iptables也叫netfilter是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入.流出.流经服务器的数据包进行精 ...
- PetaPoco轻量级ORM框架 - Database API 手册
PetaPoco Database API #region IDisposable public void Dispose() #endregion #region Constructors publ ...