kafka和rabbitmq
1.为什么要使用mq
解藕:
我的模块,需要发送数据到其他很多模块,然后需要相互调用接口,很麻烦,也不好维护,有了mq,我就直接把数据发送到mq,其他模块需要,那就自己去mq消费;还可以减少远程调用。
异步:
根线程池一样可以异步出去,不过可靠性要高很多,mq有持久化,线程池只是放在内存中。
削峰:
某个接口并发量太高,可以放在mq中慢慢执行,mq中有队列。
kafka采用分区+索引的机制,及零拷贝加上可以批量处理消息和主动拉取消息的模式,所以吞吐量要高于rabbitmq。
2.如何保证消息不被重复
生成唯一id来判断:
生产者发送消息的时候传一个唯一消息id,消费者消费消息时通过这个消息id是否在redis或者mysql中来判断,这个消息是否已经被消费。
根据业务逻辑去重:
消费之前判断一下,比如推送消息,推送之前判断这个消息的状态是否已推送,已推送就不做
3.消息丢失问题
rabbitmq:
生产者发送丢失有事务保证,mq丢失消息有持久化机制,消费者有手动ack机制,消费成功了再ack
kafka:
ack设置是1,也就是有一个lead收到了,就缺人是发送成功了,可以设置成-1代表所有副本和lead收到ack了才代发生成功了。
kafka客户端丢失,可以开启参数设置 ,确保消息在多个Broker之间冗余存储。
消费者那边有个偏移量的设置,消费者消费完后手动提交偏移量。
##4.消息堆积
一般是由于消费者消费不过来导致,可以增加消费者集群、或者从mq取多条数据批量处理、看看消费者代码逻辑是否还能优化、如果业务场景一致性要求不高,可以用线程池异步处理,缺点就是服务器重启后消息会丢失;如果是kafka可以采取主动拉去的方案,效率会高很多。
5.mq的工作模式
rabbitmq:
- 生产者消费者模式 (一个生产者一个消费者)
- 工作队列模式 (有一个队列,可以多个消费者去消费)
- 发布订阅模式 (多了一个交换机,可以多个队列去绑定接收,然后多个消费者去绑定这个队列)
- 路由模式 (交换机通过一个指定的key值绑定)
- 通配符模式 (绑定的key值可以用通配符)
kafka:
- 广播模式 (并不是真的广播模式,而且建立多个主题达到类似广播的效果)
- 发布订阅模式(有一个队列,可以多个消费者去消费)
- 点对点模式 (一个生产者只能一个消费者消费)
6.消息高可用或者消息集群
rabbitmq:
基于主从做的高可用,它有单机模式,普通集群模式,镜像集群模式。
kafka:
对kafka进行分区,每个区都对应一个节点,然后每个节点里面都有一个副本和lead,当lead丢失就会有一个选举机制了,如果是ZooKeeper集群模式,就是ZooKeeper选举。