Publish & Subscribe 即消息的发布与订阅,是一种设计模式:观察者模式。

发布订阅模式下,发布方不主动发布消息给接收方,而是由订阅方选择性接收,这使得发布方和订阅方相对独立,减少了耦合性。

使用场合

当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式。

很多分布式的场景中都有所应用,一般分为三类:

  • 在线应用 - 实现系统核心逻辑,时延10ms以内
    • 事务日志
    • 分布式的消息队列
    • rpc system
  • 流式计算 - 对产生数据实时处理,对时延要求低,单对吞吐量要求大,时延100ms
  • 日志收集 - 秒~分钟

redis的实现

频道订阅

订阅 – 开启一个客户端,进行topic订阅

> SUBSCRIBE first second

发布 – 开启另一个客户端,进行消息发布

> PUBLISH second Hello

模式匹配订阅

Redis 的Pub/Sub实现支持模式匹配。

  • 订阅

    $ PSUBSCRIBE news.*
    

将接收所有发到news.art.figurative, news.music.jazz等等的消息。

  • 取消订阅

    $ PUNSUBSCRIBE news.*
    

模式匹配将会带来cpu的性能问题,不建议生产环境使用

优缺点

优点

  • 支持简单的广播通信,自动通知所有已经订阅过的对象;
  • 页面载入后发布者很容易与订阅者存在一种动态关联,增加了灵活性;
  • 发布者与订阅者之间的抽象耦合关系能够单独扩展以及重用。

缺点

  • 创建订阅者本身要消耗一定的时间和内存,而且当你订阅一个消息后,也许此消息最后都未发生,但这个订阅者会始终存在于内存中;
  • 虽然可以弱化对象之间的联系,但如果过度使用的话,对象和对象之间的必要联系也将被深埋在背后,会导致程序难以跟踪维护和理解。