发布订阅

发布订阅
在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。
发布/订阅是消息队列范式的兄弟,通常是更大的面向消息中间件系统的一部分。大多数消息系统在API中同时支持消息队列模型和发布/订阅模型,例如Java消息服务(JMS)。
这种模式提供了更大的网络可扩展性和更动态的网络拓扑,同时也降低了对发布者和发布数据的结构修改的灵活性。
消息过滤
在发布/订阅模型中,订阅者通常接收所有发布的消息的一个子集。选择接受和处理的消息的过程被称作过滤。有两种常用的过滤形式:基于主题的和基于内容的。
在基于主题的系统中,消息被发布到主题或命名通道上。订阅者将收到其订阅的主题上的所有消息,并且所有订阅同一主题的订阅者将接收到同样的消息。发布者负责定义订阅者所订阅的消息类别。
在基于内容的系统中,订阅者定义其感兴趣的消息的条件,只有当消息的属性或内容满足订阅者定义的条件时,消息才会被投递到该订阅者。订阅者需要负责对消息进行分类。
一些系统支持两者的混合:发布者发布消息到主题上,而订阅者将基于内容的订阅注册到一个或多个主题上。
拓扑
在许多发布/订阅系统中,发布者发布消息到一个中间的消息代理,然后订阅者向该消息代理注册订阅,由消息代理来进行过滤。消息代理通常执行存储转发的功能将消息从发布者发送到订阅者。
历史
最早公开描述发布/订阅系统之一的是Isis Toolkit的“新闻”子系统,1987年,在计算机协会(ACM)的操作系统原理的研讨会上,在论文《在分布式系统中利用虚同步》中。该文描述的发布/订阅技术是由Frank Schmuck发明的。

优点

松耦合
发布者与订阅者松耦合,甚至不需要知道它们的存在。由于主题才是关注的焦点,发布者和订阅者可以对系统拓扑结构保持一无所知。各自继续正常操作而无需顾及对方。在传统的紧耦合的客户端-服务器模式中,当服务器进程不运行时,客户端无法发送消息给服务器,服务器也无法在客户端不运行时接收消息。许多发布/订阅系统不但将发布者和订阅者从位置上解耦,还从时间上解耦他们。中间件分析师对这种发布/订阅使用的常用策略,是拆卸一个发布者来让订阅者处理完积压的工作(带宽限制的一种形式)。
可扩展性
通过并行操作,消息缓存,基于树或基于网络的路由等技术,发布/订阅提供了比传统的客户端–服务器更好的可扩展性。然而,在某些类型的紧耦合、高容量的企业环境中,随着系统规模上升到由上千台服务器组成的数据中心所共享的发布/订阅基础架构,现有的供应商系统经常失去这项好处;在这些高负载环境下,发布/订阅产品的扩展性是一个研究课题。
另一方面,在企业环境之外,发布/订阅范式已经证明了它的可扩展性远超过一个单一的数据中心,通过网络聚合协议如RSS和Atom提供互联网范围内分发的消息。在交互时,为了能够即便是用低档Web服务器也能将消息播出到(可能)数以百万计的独立用户节点,这些聚合协议接受更高的延迟和无保障交付。
缺点
发布/订阅系统最严重的问题是其主要优点的副作用:发布者解耦订阅者。
消息交付问题:发布/订阅系统必须仔细设计,才能提供特定的应用程序可能需要的更强大的系统性能,例如有保障的交付。
发布/订阅系统的中介(broker)可能设计为在指定时间发送消息,随后便停止尝试发送,无论是否已收到所有用户成功接收消息的确认回复。这样设计的发布/订阅系统不能保证消息能够传递到所有需要这种有保障交付的应用程序。要达成有保障交付,必须在发布/订阅架构之外强制执行这种发布者和订阅者之间在设计上更紧密的耦合(例如,通过要求订阅者宣布消息已接收)。
发布/订阅系统中的发布者会“假定”订阅者正在监听,而实际上可能没有。一个工厂可能会使用发布/订阅系统来允许设备发布问题和故障,订阅者将问题显示并记录。如果记录器失败(崩溃了),那么设备故障发布者不一定收到记录器失败的通知,发布/订阅系统的任何设备都不会显示和记录错误消息。应当指出的是,对于其它消息架构这也是一个设计上的挑战,例如客户端/服务器系统。在客户端/服务器系统中,当一个错误记录器失效,系统将收到迹象。但是,客户端/服务器系统要处理这个失效,就必须拥有一个在线的冗余日志服务器,或者动态生成回退日志服务器。这就增加了服务端和客户端以及整个客户端/服务器架构设计的复杂度。然而,发布/订阅系统中,在不影响任何其它设备的情况下,精确复制现有日志器的冗余日志记录订阅者可以添加到系统,来增加日志记录的可靠性。在发布/订阅系统中,有保障的错误消息日志功能可以逐步添加,随后实现设备故障信息记录的简单基本功能。
在有少量发布者和订阅节点的小型网络和低信息量时发布/订阅能够自如伸缩。然而,随着节点和消息量的增长,不稳定性随之增长,限制了发布/订阅网络的最大可扩展性。大规模时吞吐量不稳定的例子包括:
负载激增 - 订阅请求使网络流量饱和,随后进入低信息量(未充分利用网络带宽)
速度变慢 - 越来越多的应用程序使用该系统(即使它们是在不同的发布/订阅频道通信)消息量流入单个订阅者的速度缓慢
使用中介(服务器)的发布/订阅系统,同意中介发送消息给带内订阅者,会引发安全问题。中介可能被愚弄,从而将通知发送给错误的客户端,增大了针对客户端的服务请求被拒绝的可能性。中介本身可能超载,因为他们分配资源来跟踪创建的订阅。
即使不依赖中介的系统,订阅者也可能可以接收未被授权的数据。未经授权的发布者可能将不正确或损坏的消息引入到发布/订阅系统。对于广播或多播消息的系统,这是尤其真实的。加密(例如传输层安全性协议(SSL/TLS)),可以防止未经授权的访问,但不能防止损坏的消息被授权的发布者引入。除了发布/订阅架构,例如客户端/服务器系统,也经常碰到授权的消息发送者有恶意行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ps 命令

ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。kill 命令用于杀死进程。linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的…

python练习题-day8

1、有如下文件,a1.txt,里面的内容为: 老男孩是最好的培训机构, 全心全意为学生服务, 只为学生未来,不为牟利。 我说的都是真的。哈哈 分别完成以下的功能: a,将原文件全部读出来并打印。 with o…

消息中间件应用场景

消息中间件应用场景

IDEA开发vue.js卡死问题

在执行cnpm install后会在node_modules这个文件下面生成vue的相关依赖文件, 这个时候当执行cnpm run dev命令时,会导致IDEA出现卡死的问题,解决方法如下: 转载于:https://www.cnblogs.com/heqiuyong/p/10301925.html

[BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

差分之后就是求多串LCS。 对其中一个串建SAM,然后把其它串放在上面跑。 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值。答案就是res[]的最大值。 考虑f[x]的求法,把s[]放在SAM上跑时&#xff…

点对点

数据传输的可靠性是通过数据链路层和网络层的点对点和传输层的端对端保证的。点对点是基于MAC地址或者IP地址,是指一个设备发数据给另外一个设备,这些设备是指直连设备包括网卡,路由器,交换机。端对端是网络连接,应用程…

none

module.exports {root: true,env: {node: true},extends: [plugin:vue/essential, vue/prettier],rules: {no-console: process.env.NODE_ENV production ? error : off,no-debugger: process.env.NODE_ENV production ? error : off,prettier/prettier: [error,{// tab缩…

MQ消息中间件介绍

消息队列技术是分布式应用间交换信息的一种技术,消息队列可驻留在内存或者磁盘上,队列存储消息直到它们被应用程序读走,通过消息队列,应用程序可以独立的执行—它们不需要知道彼此的位置,或者继续执行前不需要等待接收…

22 块级元素和行内元素

学习的初期,我们就要知道,标准文档流等级森严。标签分为两种等级: 行内元素块级元素比如h1标签和span,同时设置宽高,来看浏览器效果,那么你会发现: 行内元素和块级元素的区别:&#…

节流防抖

https://www.cnblogs.com/fsjohnhuang/p/4147810.html 转载于:https://www.cnblogs.com/smzd/p/10943002.html

P3796 【模板】AC自动机(加强版)

题目描述 有 NNN 个由小写字母组成的模式串以及一个文本串 TTT 。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串 TTT 中出现的次数最多。 输入输出格式 输入格式:输入含多组数据。 每组数据的第一行为一个正整数 NNN ,表示共有 NNN…

访问数据库优化

例如:工资表里面有全公司人员的工资信息。 现在我需要把这些工资信息打印成工资条。因此需要访问数据库。 1.把整个表全部读取出来,内存处理每个人的工资信息。 2.按照人员单个查询每个人的工资信息。 分析:第一种情况是将所有的人员全部查询…

psql 命令

(1)使用命令行连接数据库psql -U postgres -h localhost -p 5433 (2)列出所有的数据库\l -- 查看所有数据库(3)进入某个数据库\c name -- name是表名(4)列出数据库的所有数据表和视图\d -- 列出所有的数据…

各种缓存介绍

说起缓存相关技术,老多了, memcache、redis、squid、varnish、web cache、 CDN等等。缓存技术五花八门,但这些技术间有什么共性的地方,又有什么不同的地方呢?答案肯定是有的,这次为大家分享及整理一下缓存方…

CentOS6.8 安装node.js npm

环境:CentOS6.8_X64系统 一、到官方下载最新的编译好的安装文件,目前是6.9.4。 $>cd /usr/local/src #定位到这个目录,下载的文件会在这个目录#使用wget下载(这个内置命令) $>wget https://nodejs.org/dist/v8.1…

[上下界网络流][二分] Bzoj P2406 矩阵

题目描述 输入输出格式 输入格式: 第一行两个数n、m,表示矩阵的大小。 接下来n行,每行m列,描述矩阵A。 最后一行两个数L,R。 输出格式: 第一行,输出最小的答案; 输入输出样例 输入样…

记录自己的nest学习之旅

.a r 转载于:https://www.cnblogs.com/smzd/p/10978807.html

PYTHON 爬虫笔记七:Selenium库基础用法

知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Sele…

pyqt5界面切换

#主要的思路就是创建两个frame(如果有两个以上同理)使用setVisible()函数显示或者隐藏frame 参数是bool值import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *class logindialog(QDialog):def __init__(sel…

mac 完全卸载vscode

原文分隔线while writing go this morning, I found that the wrong code are not under lined by red line This is really difficult for me and time consuming to keep writing. After 1 hour of wasting time trying to figure out what happened, I decide to kill it al…