精华内容
下载资源
问答
  • 订阅发布模式

    2017-08-13 18:39:00
     有时需要将多个应用程序集成到一个框架中,这些应用程序常见的基础通信方式包含总线模式、代理模式、 或者点对点模式。一些应用程序发送多种类型的消息,其他应用程序可能更关注这些消息类型的组合。  例如,在...

    场景概述:

       有时需要将多个应用程序集成到一个框架中,这些应用程序常见的基础通信方式包含总线模式、代理模式、

    或者点对点模式。一些应用程序发送多种类型的消息,其他应用程序可能更关注这些消息类型的组合。

      例如,在一个金融系统存在多个应用程序管理同一客户信息的情况,存在一个客户关系管理程序(CRM)掌握客户信息。

    一种典型的情况:客户信息存在于其他系统中,且这些系统执行各自客户信息管理函数来处理客户信息。

    当某个面向客户的应用程序生成更新客户信息的消息,例如客户地址的修改时,CRM和其他管理客户信息的程序

    都将到该消息,然而,这个消息类型对于那些不管理客户信息的其他程序是没有意义的。

    问题:

      如何才能让一个程序在集成环境中只发送消息到那些对该消息感兴趣的应用程序中,而不需要知道消息接收方

    的基本信息?

     

     约束:

      为确保集成的软件能够只接收到各软件感兴趣的消息,这些软件需要满足下列约束条件:

      1. 集成框架中的应用程序关注不同的消息类型。例如,管理客户信息的应用程序关注客户信息的更新,贸易程序关注买卖事务,用于双向提交事务消息的应用关注消息的提交。

      2. 集成框架中的某个应用可能发送若干个消息类型。例如,应用程序可能发送用户和操作的状态信息。

    同样,集成框架中的某个应用通常关注的是其他应用程序发布的消息子集。例如,投资经理只关注那些影响其

    所管理的股票的金融信息事务。

      3. 应用程序添加不同信息到消息的情况是多种多样的,这种情况下,固定长度的二进制消息通常是不灵活

    的,相比而言,使用封装元素来扩展SOAP(简单对象访问协议)消息更为简单。

      4. 大多数集成框架集成所有的应用,这些应用通常假定在该集成环境中存在同其他应用通信的消息,甚至

    对于一个灵活的消息格式,插入或处理应用未知的消息元素都可能遇到困难。

     

    解决方案:

      通过创建主题或动态检测消息内容来扩展通信基础框架。通信框架能确保应用程序能够收到订阅的消息,

    并能够创建一种机制来发送消息到所有关注该消息的接收端(订阅方)。

      这里列举了三类创建订阅/发布机制方式:

      1. List-Based Publish/Subscribe(基于列表的订阅发布模式)

      2. Broadcast-Based Publish/Subscribe (基于广播的订阅发布模式)

      3. Content-Based Publish/Subscribe (基于内容的订阅发布模式)

      这三类模式都能够发送消息到所有关注该消息的订阅方。

     

    List-Based Publish/Subscribe (基于列表的订阅发布模式)

       基于列表的订阅发布模式需要管理由订阅方组成的链表,这些订阅方都关注于某一主题。当事件发生时,

    订阅方链表上的所有关注该主题的订阅者都将被通知到,这很像常见的观察者模式。当你使用观察者模式时,

    需先确定两个类:主题和观察者。假定采用push模式来更新,对于主题(subject)类需要添加三个方法:Attach(), Detach()和Notify(),对于观察者添加Update()方法。

      使用观察者模式时,所有观察者以及其所关注的主题将被注册(使用Attach()方法)。当该主题内容发生

    改变时,每个关注该主题的观察者都将被通知到。

      当你创建对象实例并且具体化所有观察者和主题时,使用观察者模式构建订阅发布比较合适, 观察者和主题

    的关系要一直保持。通过构建关系数据库,在多对多的情境下,构建主题与观察者的依赖关系。使用时,通过

    检索该关系数据库表,即可获取关注某一主题的所有订阅者。

      维护主题和订阅者链表,然后在事件来临时,通知每一个订阅者是基于链表订阅发布实现的基础。

     

    Broadcast-Based Publish/Subscribe(基于广播的订阅发布模式)

       当使用基于广播的订阅发布模式时,事件发布方将创建消息并广播到局域网中,每个监听节点都会检查

    消息主题,如果主题为该节点所关注的就会接收并处理该消息。如果该主题不是监听节点关注的,就会忽略该

    消息。

      通常主题可以分层并且可能包含多个域,每个域根据周期来分隔,如果需要监听节点可以采用通配符来订阅

    某一特殊主题。

      基于广播的订阅发布能够有效的将生产者和消费者解耦,在某些情况,还可以做到区分特殊主题订阅者。

    为了区分主题订阅者,协调程序发出消息,订阅该消息的节点将被要求回复,这些响应回复会指明所有该主题

    的订阅者。

      这种订阅发布体现在所有的消息都会发布到所有的监听节点,每个节点负责过滤不感兴趣的消息。

     

    Content-Based Publish/Subscribe(基于文本内容的订阅发布模式)

       基于广播和列表的订阅发布基本上都根据主题来分类,都使用预定义主题的方式实现多对多通信。

    基于主题和基于内容通信的不同点如下:

      在基于主题的系统,进程交换信息通过一个预订的主题集合,这些主题在多对多的情景下用来区分各

    逻辑通道。基于内容的系统更为灵活,因为订阅方与特殊消息内容有关,信息组合的方式被视为动态的

    逻辑通道,这极大的扩展了潜在的逻辑通道数量,也改变了订阅发布系统实现的方式。

     

    使用订阅发布

      图一显示四个应用程序集成的一种方案。发送方使用基于主题的方式来发布消息给主题A和主题B。其中

    三个接收方订阅这些主题;其中一个订阅了主题A,一个订阅了主题B,一个订阅了主题A和B。箭头描述消息发送

    路径。

      实现订阅发布过程,通常影响消息结构,应用集成和通信基础框架。  

      首先, 必须区分主题或应用程序感兴趣的内容。这将转化为将消息类型分为不同的子集。例如在贸易领域

    消息类型,一些贸易应用需要追踪买入事务,一些追踪卖出事务,其他应用追踪买卖事务。通过创建买入和卖出

    主题来分离消息,并将贸易消息划分到不同子集。

      下一步,必须给消息中添加信息,这些消息指明主题或识别特殊内容信息。有时可以通过保存主题相关的

    信息到消息结构的某个未使用的域内。还有一种方式,可以为主题添加一个新的域,例如在SOAP头中添加一个

    新的元素。如果既不能使用已存在的域又不能添加,只能找到某种方式将主题嵌入到消息中,或者使用基于

    内容的订阅发布方式。

      接下来必须扩展通信基础框架以便消息能够传递给每个订阅者。使用的方法依赖于集成解决方案的拓扑

    结构,例如三类普遍的拓扑结构。对于总线结构,可以采用在总线接口上实现订阅机制;对于代理结构,可以

    通过为代理者创建订阅者链表来实现;对于点对点结构,可以在发布方创建订阅链表来实现。

      最后,需要修改应用集成框架,发布方必须将与主题相关的信息添加到每个发布的消息中。例如,如果主题

    作为头元素编入,发布方必须将主题相关信息插入到合适的位置,同样地,订阅方必须明确感兴趣的主题。

      订阅方可以是固定或动态的,当订阅方是固定的,集成框架设置应用订阅的主题,应用程序无法控制订阅。

    通常,订阅过程由每个应用程序在被添加到集成环境时确定。图二显示一个针对主题A的固定订阅方式。

     

      与之相比,动态订阅能让每个应用程序通过一组控制消息来控制其自身订阅过程。应用程序通过发送消息

    到通信基础框架,使其将应用程序从订阅链表中移除,来实现移除订阅内容。大多数提供订阅发布功能的通信

    框架都提供该功能,然而,不是非得要动态订阅才能实现这种功能。

      

     

      上图描述了动态订阅的功能,首先是初始订阅主题A,然后应用发送消息了从订阅链表中移除订阅,接着应用

    发送两个消息来订阅主题B和主题C。

    相关决定:

      在决定使用订阅发布模式后,需要确定下述要素:

      1. 初始订阅。 必须确定订阅方首次添加到集成环境中如何通过通信框架与订阅内容通信。

      2. 通配符订阅。必须确定是否让订阅发布模式支持通配符订阅。通配符订阅确保订阅者通过一个订阅过程来

    订阅多个主题。

      3. 静态或动态订阅。必须确定集成解决方案是动态订阅还是静态订阅。

      4. 主题发现。 必须确定订阅者在解决方案中支持动态订阅的情况下能够发现可以主题。

    职责与协作:

      下表为订阅发布个组件的职责和功能。

     

     

     

    转载于:https://www.cnblogs.com/svenzhang9527/p/7351769.html

    展开全文
  • 什么是Pub-Sub 发布订阅是一种设计模式,...首先我们看一个简单地订阅发布模式. 定义一个Action委托,无返回值. namespace PubSubPattern { public class Pub { public Action OnChange { get; set; } public voi
  • C# 使用ActivityMQ 订阅 发布模式P2P模式
  • 订阅发布模式 1.什么是订阅发布模式订阅发布模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所依赖于他的对象都会被通知,并进行相应处理。通俗地讲,比如说我们在抖音上关注了A,那么当A...

    订阅发布模式

    1.什么是订阅发布模式?

    订阅发布模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所依赖于他的对象都会被通知,并进行相应处理。通俗地讲,比如说我们在抖音上关注了A,那么当A发布动态短视频的时候,系统就会为我们推送A的动态。A就是publisher,我们就是subcriber,系统就是evenBus,发布者发布动态后,系统就会进行过滤,然后相应地推送给相关订阅者。

    2.实现结构

    发布订阅模式

    订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(eventBus),当发布者(Publisher)发布该事件(Publish topic)到调度中心,也就是该事件触发时,由调度中心统一调度订阅者注册到调度中心的处理代码。

    3.js的简单实现

    const { log } = console;
    class eventBus {
        constructor() {
            this._bind = {}
        }
        pushSubcriber(subcriber) {
            if (!this._bind[subcriber.key]) this._bind[subcriber.key] = [];
            this._bind[subcriber.key].push(subcriber);
            return this;
        }
        publisher(key) {
            if (!this._bind[key]) {
                log(`${key}社区当前无订阅者`);
                return;
            }
            this._bind[key].forEach(item => item.recept())
        }
        deleteSubcriber(subcriber) {
            if (this._bind[subcriber.key].length === 0) {
                log(`${subcriber.key}社区当前无订阅者,无法删除`);
                return;
            }
            this._bind[subcriber.key] = this._bind[subcriber.key].filter(item => item.num !== subcriber.num);
            return this;
        }
    }
    class subcriber {
        constructor(key, num) {
            this.key = key;
            this.num = num;
        }
        recept() {
            log(`欢迎来到${this.key}社区,我是第${this.num}号订阅者`);
        }
    }
    const p = new eventBus();
    const p1 = new subcriber('足球', 1);
    const p2 = new subcriber('足球', 2);
    const p3 = new subcriber('足球', 3);
    const p4 = new subcriber('篮球', 4);
    const p5 = new subcriber('篮球', 5);
    p.pushSubcriber(p1).pushSubcriber(p2).pushSubcriber(p3).deleteSubcriber(p2);
    p.publisher('足球');
    p.publisher('篮球');
    

    4.测试结果

    pub_sub

    展开全文
  • 订阅发布模式 适用于多对多的业务,发布者将主题信息发出后,相关订阅者会收到信息。 例如很多新闻、视频网站就是这样的模式,给每个用户打一个tag,表示其订阅tag相关的内容,当有用户发布相关tag的内容后,就是推...

    订阅发布模式

    适用于多对多的业务,发布者将主题信息发出后,相关订阅者会收到信息。
    例如很多新闻、视频网站就是这样的模式,给每个用户打一个tag,表示其订阅tag相关的内容,当有用户发布相关tag的内容后,就是推送到订阅该tag的用户。
    存在一个交换机,当用户订阅tag后,交换机会将其绑定到该交换机,其他用户发布内容,会同通过该交换机发送给所有订阅者。

    展开全文
  • 手写订阅发布模式

    千次阅读 2018-06-03 12:27:43
    前几天在网上查阅了一些资料,并且自己尝试着手写了一下订阅发布模式。其实可以发现订阅发布模式和自定义事件类似(但不同),原理是我们先定义一个事件类型并给一个callback,在后续执行这个callback。var Works = ...

    前几天在网上查阅了一些资料,并且自己尝试着手写了一下订阅发布模式。

    其实可以发现订阅发布模式和自定义事件类似(但不同),原理是我们先定义一个事件类型并给一个callback,在后续执行这个callback。


    var Works = (function () {
        function Works() {
            this.handlers = {}
            this.a = 'a'
            this.b = 'b'
            this.c = 'c'
        }
    
        Works.prototype = {
            constructor: Works,
            work: function (type, a, b, c) {
                this.a = a
                this.b = b
                this.c = c
                this.run(type)
            },
            run: function (type) {
                if (this.handlers[type] instanceof Array) {
                    var handlers = this.handlers[type];
                    // 遍历这个类型任务中所有的方法,并逐个运行
                    for (let i = 0; i < handlers.length; i++) {
                        handlers[i](this.a, this.b, this.c)
                    }
                }
            },
            addListener: function (type, handler) {
                if (typeof this.handlers[type] == 'undefined') {
                    this.handlers[type] = []
                }
                this.handlers[type].push(handler)
            },
            removeListener: function (type, handler) {
                if (!this.handlers[type]) return;
                var handlers = this.handlers[type]
                // 不传入handler,则解绑所有方法
                if (!handler) {
                    handlers = []
                } else {
                    // 遍历所有方法,找到相同并删除方法
                    for (let i = 0; i < handlers.length; i++) {
                        if (handler === handlers[i]) {
                            handlers.splice(i, 1)
                        }
                    }
                }
            }
        }
        return Works
    })()
    
    var work = new Works();
    
    work.addListener('base', function (a, b, c) {
        console.log(a, b, c)
    })
    work.addListener('sum', function (a, b, c) {
        console.log(a, b, c)
    })
    
    work.work('base', 'e', 'f', 'g');    // e f g
    work.work('sum', 'ab', 'cd', 'ef');    // ab cd ef


    后续我会通过学习JavaScript中不同的设计模式再来更新这一篇文章.
    后续我会通过学习JavaScript中不同的设计模式再来更新这一篇文章.
    展开全文
  • 什么是Pub-Sub 发布订阅是一种设计模式,它允许应用程序组件之间进行松散耦合。...首先我们看一个简单地订阅发布模式. 定义一个Action委托,无返回值. namespace PubSubPattern { public class Pub {
  • 生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信。本文在总结了RabbitMQ核心概念的基础上,以“数据接入”和“事件分发”两个场景来探讨如何实现生产消费者...
  • 观察者模式和订阅发布模式的区别是没有事件中心 在观察者模式中 发布者需要知道订阅者的存在 不需要像订阅发布模式一样 需要事件中心来隔离订阅者和发布者 详细可参考上偏文章详解js中订阅发布模式的原理即运用场景 ...
  • 订阅发布模式: 两者的区别: 1.订阅发布模式比观察者模式,中间多一个“调度中心”。因此更解耦,所以常见系统中,订阅发布模式能让业务更清晰 2.可以把restful请求的通信方式,看做观察者模式的应用;而...
  • 生产消费者模式与订阅发布模式

    千次阅读 2018-06-05 15:48:06
    生产消费者模式:生产者推送消息到消息中心,消费者取出消息消费,同一类别下,所有消费者取到的数据是相同的订阅发布模式:本质是一种生产者消费者模式,不同点:订阅者先向消息中心订阅自己感兴趣的类型数据,发布...
  • 订阅发布模式是一种特殊的生产消费者模式 区别: 1.消息是否被多个对象处理。生产消费者是所有消费者抢占消息,订阅发布是所有订阅者共享消息。 2.主动权不同。生产消费者主动权在消费者,订阅发布主动权在发布...
  • Kafka下的生产消费者模式与订阅发布模式

    万次阅读 多人点赞 2017-01-21 17:27:26
    生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信。本文在总结了Kafka基本概念的基础上,以“数据接入”和“事件分发”这两个场景为例,来探讨Kafka作为消息...
  • 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。  将一个系统分割成一系列相互协作的...
  • 如果你有能力想出一个能够稳定常用解决一类问题的方案,也可以纳入自己小小的设计模式前端的思考是否需要掌握设计模式今天咱们一起聊聊订阅发布模式:举例子阐述订阅发布的概念,比如小王和小张都买了小编的Promise...
  • 用python做一个方便使用的基于zeroMQ的订阅发布模式 代码 #socketSP.py "as a subsriber using zeromq" import time import zmq import sys class socketPub(): def __init__(self, host, port): ...
  • redis订阅发布模式: Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。  发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息...
  • redis订阅发布模式

    2016-06-13 10:48:18
    redis发布订阅模式
  • 1、观察者模式,又称订阅发布模式,其架构如下: 2、实例demo——订阅天气,发布天气 1&gt;WeatherSubject 目标类 public class WeatherSubject {    private List&lt;Observer&gt;...
  • 一、什么是发布-订阅者模式 我们在使用发布-订阅者模式之前,先了解什么是发布-订阅者模式。简单来说,发布订阅这模式就是一种一对多...这样看来,一个完整的订阅发布模式,由发布者、订阅者、消息管理器三部分组成...
  • 上次研究观察者模式,很多文章说它也叫Subscribe/Publish(发布/订阅模式)。可在《Javascript设计模式》一书中,这两种模式还是有些区别的。书中原话如下: Observer模式要求希望接收到主题通知者的观察者必须订阅...
  • 1、观察者模式 观察者模式定义了对象间的一种一对多的...观察者模式有一个别名叫“发布-订阅模式”,或者说是“订阅-发布模式”,订阅者和订阅目标是联系在一起的,当订阅目标发生改变时,逐个通知订阅者。我们可以...
  • C#,事件,委托,订阅-发布
  • 委托的订阅发布模式

    2011-10-27 16:55:04
    委托的订阅发布模式 Delegate这个关键字,在C#里翻译成委托,其英文原意就是代理,委托的意思。想想生活中委托的实例。比如生产香皂的公司,它可以把销售的业务交给代理商,而不是自己与终端用户打交道。 我们把...
  • 订阅发布模式如果按数学翻译其实就是.一对多的映射关系.怎么解释呢? 就是一个开关,同时并联几个灯泡(在不同房间),触发的时候,几个灯泡都会得到指令,然后执行发光的行为。 订阅发布模式 这种模式在js里面有这天然...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,951
精华内容 6,380
关键字:

订阅发布模式