Pull or Push

观察者模式

pull or push都用到了观察者模式或者变形。
观察者模式,指的是定义一种对象间的一对多的关系,当一个对象的状态发生变化的时候,所有依赖于它的对象都将得到通知并更新自己。

推拉分歧

现在要说的分歧在这里:

  • “推”的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新消息主动推送到各个Observer去。
  • “拉”的方式是指,各个Observer维护各自所关心的Subject列表,自行决定在合适的时间去Subject获取相应的更新数据。

各有优势

  • “推”的好处包括:
    1、高效。如果没有更新发生,不会有任何更新消息推送的动作,即每次消息推送都发生在确确实实的更新事件之后,都是有意义的。
    2、实时。事件发生后的第一时间即可触发通知操作。
    3、可以由Subject确立通知的时间,可以避开一些繁忙时间。
    4、可以表达出不同事件发生的先后顺序。

  • “拉”的好处包括:
    1、如果观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系解脱到Observer去完成。
    2、Observer可以不理会它不关心的变更事件,只需要去获取自己感兴趣的事件即可。
    3、Observer可以自行决定获取更新事件的时间。
    4、拉的形式可以让Subject更好地控制各个Observer每次查询更新的访问权限。

如何选择

事实上“推”和“拉”可以比较的内容太多了,比如:
客户端通常是不稳定的,服务端是稳定的,如果消息由客户端主动发起去获取,它很容易找到服务端的地址,可以比较容易地做到权限控制(集中在服务端一处),服务端也可以比较容易地跟踪客户端的位置和状态,反之则不行;pull胜出!

互联网页面的访问就是一个最好的“拉”的模式的例子;

通常我们希望把压力分散到各个客户端上去,服务端只做最核心的事情,只提供内容,不管理分发列表;push胜出!

如果是master 多slave结构,slave可能掉线,一段时间后重新加入,如果是push的话,slave重新加入时会丢失掉线期间的数据,如果采用pull的话则控制权在slave端,可以重新请求掉线时间点的数据。pull胜出!

还有一个idea是半“推”半“拉”形式,例如,服务端只负责通知某一些数据已经准备好,至于是否需要获取和什么时候客户端来获取这些数据,完全由客户端自行确定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容