1.如何防止消息丢失

  • 发送方:使用同步发送,ack是1或者-1/all可以防止消息丢失,并且设置同步的分区数>=2(如果要做到99.9999%,ack设置成all,把min.insync.replicas配置成分区备份数)
  • 消费方:把自动提交改为手动提交

2.如何防止消息重复消费

在消费者端解决消费的幂等性问题

  • 在mysql表中创建一个联合主键
  • 使用分布式锁 redisson.lock()

3.如何做到顺序消费

  • 发送方:将ack不能设置为0,关闭重试,使用同步发送,等到发送成功再发送下一条,确保消息是顺序发送的
  • 消费方:只能设置一个分区,消费组中只能有一个消费者

顺序消费会牺牲掉性能,RocketMQ可以实现顺序消费功能

4.如何解决消息积压问题

  • 在这个消费者中,使用多线程,充分利用机器的性能进行消费消息
  • 通过业务架构的设计,提升业务层面消费消息的性能
  • 创建多个消费组,多个消费者,部署到其它机器上,一起消费,提高消费者的消费速度
  • 创建一个消费者,该消费者在kafka另建一个主题,配上多个分区,多个分区再配上多个消费者,该消费者将poll下来的消息,不进行消费,直接转发到新建的主题上,此时,新的主图的多个分区的多个消费者就一起消费了

5.延迟队列

应用场景:订单创建后,超过30分钟没有支付,则需要取消订单

  • kafka中创建相应的主题,消费者消费该主题的消息(轮询),消费者消费消息时判断消息的创建时间是否超过30分钟(前提时订单未支付)
  • 如果是:去数据库中修改订单状态为已取消
  • 如果否:记录当前消息的offset,并不再继续消费之后的消息,等待一定时间后,再次向kafka拉取该offset之后的消息,继续进行判断,以此反复