为什么使用mq?
解耦、异步、消峰
mq怎么保证高可用?
比如kafaka高可用:一个topic有多个partition分布在不同的机器上,类似于分片,每个partition对应有至少两个副本纵向部署在不同机器上,分布主从。
mq 选型问题?
activemq:万级请求,很成熟,但社区不活跃,不是分布式
rabbitmq:延时很低,管理界面强大,社区活跃,不是分布式
rocketmq:单机吞吐量十万级,阿里的可靠,java的源码
kafaka:单机十万级,分布式mq,topic的多个partition分布在不同的机器上,一个partition又在不同机器上有不同的副本
mq积压问题解决?
1 可以改下代码,将原来3个partition的数据送到12个partition里消费
2、如果你消息设置了过期时间,然后积压又没了,就从源头重新拉取。
3、如果积压到一定程度,mq磁盘满了,我们可以直接消费,然后从源头重新拉取。
mq重复性问题?(kafaka重启,但offset没有ack,那么会重复消费)。
1、redis判重。
2、mysql设置唯一索引。
mq 消息丢失问题?
场景一:生产者写消息过程中 网络传输丢了,或者消息到mq没存下来
a、try catch 重试机制,但会阻塞 不推荐
b、回调函数 confirm机制,异步通知。
场景二:mq接受到消息暂存在内存,但是重启丢了
开启持久化磁盘功能
场景三: 消费者没来得及消费,但mq以为自己已经消费掉了
将autoack关闭,每次你自己处理完一条消息后才手动ack.
如何设计一个mq?
1、分布式功能,参考kafaka
2、可扩容
3、高可用-多个副本
4、消息丢失-持久化