消息发布订阅
更新时间:2023-12-20
功能介绍
Redis 发布订阅是一种消息传递模式,它允许用户将消息发送到频道,并且允许其他用户订阅该频道以接收这些消息。 Channel的消息会放在订阅的客户端输出缓冲区中发送给订阅者,和传统的MQ不同,发布订阅的消息不会持久化,这个消息一旦发出,没订阅到的客户端也无法重试获取过去的消息。
发布者在一个连接内可以发布多个消息,也可以向多个Channels发布消息,但是订阅者一旦处于订阅状态,只能执行 SUBSCRIBE,SSUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE, SUNSUBSCRIBE, PUNSUBSCRIBE。
适用场景:
可以设定对某一个Channel进行消息发布及消息订阅,当一个Channel上进行了消息发布后,所有订阅它的客户端都会接受到相应的消息。 这一功能最明显的用途就是用作实时消息系统,比如:
- 实时通知:Redis发布订阅可以用于实时通知应用程序,例如在社交媒体上关注某人或某个主题,当有新消息时,可以向订阅者推送实时通知。
- 聊天应用:Redis发布订阅可以用于实现聊天应用中的实时聊天功能,发布者将消息发送到频道,订阅者可以实时接收这些消息。
- 事件驱动系统:Redis发布-订阅还可用于构建事件驱动系统。当某些事件发生时,可以将事件消息发布到相应的频道,各个订阅者可以根据自己的需求对这些事件做出响应,比如数据库高可用的功能也可以依赖这个实现。
使用注意事项
- 避免发布者数量过多:如果发布者数量过多,可能会导致订阅者无法处理所有消息,建议每个Channel的发布者<10。
- 避免订阅过多频道导致输出缓冲区打满,减少使用通配符匹配,比如:“Channe*”,如果需要订阅多个频道,建议控制在50个以内,控制Redis的输出流量在20MB/s。
- 对消息顺序敏感的业务,如果订阅了多个频道,或者一个频道有多个发布者,订阅者需要处理消息的顺序。
- 要注意发布和订阅保持平衡,不要出现只订阅不发布,或者只订阅没有发布,此外,不要持续订阅和取消不存在的Channel。
命令的支持与使用规范
- 命令支持情况:详情参考Proxy命令支持情况
- 开源框架Redission的分布式锁redis-cluster模式的实现依赖在LUA中的使用发布订阅功能,但是由于Redis集群版对LUA脚本有严格使用要求,故不支持框架中分布式锁的功能。
建议的连接池配置
因为订阅场景的客户端连接占用时间过长,可能因为连接池不够用影响整体吞吐,建议连接配置如下:
- 最大连接数:在数据库集群能承载的连接数安全限度内,建议将最大连接数设置略高。(集群基本信息可查看连接数规格)
- 最大空闲连接数:建议设置最大空闲连接数,以保证客户端其他非订阅请求有可用连接。
- 最小空闲连接数:建议设置最小空闲连接数,以保证订阅客户端连接可用。
- 空闲连接回收时长:根据业务的订阅消息时效以及超时时间,合理设置空闲连接回收时长,确保整体连接池有可用连接。
- 重连次数:建议将重连次数设置为1-3次,以确保连接池中的连接在Redis服务端故障时能够快速恢复连接。