消息系统的使用心得 rabbitmq_redis
使用rabbitmq和redis有一段时间了,有一些心得体会:
rabbitmq使用的php-amqplib,exchange使用的direct,消息持久化,1h后过期;队列自动删除,7天后过期;
监听消息时的优缺点:
rabbitmq:
缺点:
1. 一个消费者只能监听一个消息,遇到【消息:动作 = N:1】的时候,要多开几个进程;
2. 为了在控制面板查看进程有没有启动,需要给每个队列指定一个名字;
3. 必须显式ack/nack;
优点:
1. 可以先publish后subscribe。对于publish、subscribe分开上线的情形,可以先上线publish部分;
2. 允许一定的消息累积;
3. 消息丢失风险可以控制到很低;
4. 用来发送需要延时的消息(微信模板/短信/邮件);
5. 消息太多的时候,可以开多个进程,轮流接收处理消息;
redis:
缺点:
1. sub端断开的时候会丢失消息(crontab五个星号不是常驻的意思,仅仅表示每分钟都会执行);
2. 进程容易自动结束(1分钟左右);
3. 必须先开sub端,再pub消息,否则会丢失;
优点:
1. 可以同时监听多个队列的消息;
2. 使用很方便,不需要关注消息过期,队列名字之类的;
现状:
1. 和金钱相关的地方对“消息丢失”很敏感,踩过坑;
2. “延时消息”用于发送微信会话(首次关注后不能立即发送);
3. 知道一个队列名字对于调试、程序阅读的帮助并不大;
4. 没出现过“消息太多,一个进程处理不过来”的情况;
5. 消息的发送和接收,逐渐变多了,有变混乱的情况;
改进:
对于现状1-4,提出以下改进:
1. 保留延时消息功能,保留持久化机制,保留死信机制;
2. 取消rabbitmq的队列名字(默认一个无意义字符串);
3. 如果修改队列名字,注意在修改后删掉以前的队列,并重启监听脚本;