深入理解kafka和rabbitmq

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选举。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值