Redis pub/sub模式

背景


Redis的pub/sub是一个比较尴尬的存在。无论是作为消息中间件抑或是类似zookeeper的通知机制都有明显的缺陷。不然如果应用较小且对可用性、扩展性等要求不高也可以考虑,通过自己“多做一些”的方式来满足自己的要求。
Redis支持两种类型的sub模式,一种是针对具体channel的subscribe;另一种是针对某个pattern的pSubscribe,可同时subscribe匹配的所有channel。

机制


<1> 当客户端subscribe订阅某个或某些频道是,服务器会将client与被订阅的channel在pubsub_channels字典进行关联。
<2> 同理,对于模式的订阅,Redis Server也将所有订阅关系都保存到pubsub_patterns属性里面;
<3> 当客户端通过publish命令发布消息到某个channel时,Redis Server需要将消息发送给channel频道的所有订阅者;同时如果有pattern与channel匹配,还需要将消息发送给pattern模式的订阅者。

实现


以Jedis client为例:
<1> pub/sub只支持单实例和cluster,sharding是不支持的。
<2>单实例的原理比较容易理解,主要注意下subscribe的时候使用独立线程,因为subscribe是一直堵塞等待消息的,直到channel都unSubscribe为止;
<3> cluster环境下,我们需要了解下其背后的机制。
首先看看subscribe操作:
public void subscribe(final JedisPubSub jedisPubSub, final String... channels) {
  new JedisClusterCommand<Integer>(connectionHandler, maxAttempts) {
    @Override
    public Integer execute(Jedis connection) {
      connection.subscribe(jedisPubSub, channels);
      return 0;
    }
  }.runWithAnyNode();
}
可以看到是订阅的随机一个节点(publish也是到随机一个节点,不再列举),那么为了订阅端能接收到消息,当cluster的某个node接收到publish消息时,其需要通过内部的bus将消息copy到cluster内的其它node,保证消息能通知到各个subscribe。如果是在一个大的集群中,无疑这样会增加不少的网络通信。


如果未说明,本Blog中文章皆为原创文章,请尊重他人劳动,转载请注明: 转载自jmatrix

本文链接地址: Redis pub/sub模式

(注:一般引用了,我都会添加引用,如果有侵权的请联系我)



This entry was posted in 日常文章 and tagged . Bookmark the permalink. Follow any comments here with the RSS feed for this post. Trackbacks are closed, but you can post a comment.