不同的程序之间需要有序的信息交换,消息队列就是其中的渠道,它连接着上游和下游。
上游是生产者或发布者,下游是消费者或订阅者。
消息队列有有两种模式:
一种是生产-消费模式:生产者把消息放在队列中,多个消费者监听队列,但只能有一个消费者抢走消息。
一种是发布-订阅模式。发布者把消息放在队列中,多个订阅者都会收到同一份消息。
Redis本身具有发布订阅功能。其缺陷是消息不能存储,不能重发。如果订阅者断线,那么重连之后,断线期间发布的消息无法获得。UPOS项目最初采用这种方式发布规则文件,除了上述缺点,当规则文件较大时(印象中是>5M),数据传输会占用较大带宽,这样发布订阅过程极不稳定。后来把规则文件直接存储在redis中(含版本号),定时去检查版本号,如果发现更新的规则文件,就会更新。
Redis的数据结构list作为生产消费模式的消息队列。
list操作命令是RPOP,LPOP,RPUSH,LPUSH,BRPOP,BLPOP。最后两个是阻塞命令,必须有timeout。
这种方案的缺点是,如果消费者拿到消息之后崩溃,那么恢复之后不可能重新拿到消息。
BRPOPLPUSH source destination timeout
这种方案的改进版本是使用命令RPOPLPUSH / BRPOPLPUSH,这样被取出的消息存储在另一个列表中(备份)。等消费者处理完消息之后,再从备份列表中删除。