文章目录
1.如何防止消息被重复消费
在防止消息丢失的方案中,如果生产者发送完消息后,因为网络的波动,没有收到Kafka返回的ACK确认收到信息,但是实际上Broker已经收到了该消息,此时生产者就会重新发送消息数据,进行重试,于是Broker就会收到多条相同的消息数据,从而造成消费者的重复消费。
如何解决生产者发送重复消息呢?
- 生产者关闭重试机制,但是会造成数据的丢失,不建议使用此种方式。
- 通过消费者来解决非幂等性消费的问题: - 所谓的幂等性指的是多次访问的结果是一样的,对于rest的请求(get(幂等性)、post(非幂等)、put(幂等)、delete(幂等))- 可以在数据库中创建联合主键,防止相同的主键创建出多条记录。- 使用分布式锁,以业务id为锁,保证只有一条记录创建成果。
2.如何保证消息的顺序消费
所谓顺序消费指的是:消息一条条被消费,例如一个业务场景,有三条消息,第一条消息消费后是下订单,第二条消息消费后是付款,第三条消息消费后是发货,一定要保证消息是顺序性被消费,否则就会出现数据错误。
保证消息顺序消费的方法:
- 生产者:保证消息按顺序消费,且数消息不丢失,使用同步发送,ack设置成非0的值。
- 消费者:主题只能设置一个分区,消费组中只能有一个消费者。
kafka的顺序消费使用场景不多,牺牲性能。
3.如何解决消息积压的问题
消费者的消费速度远远赶不上生产者生产消息的速度,从而就会导致Kafka中有大量的数据没有被消费,随着没有被消费的数据越来越多,堆积越来越大,就会导致消费者寻址的性能越来越差,最终对整个Kafka对外提供服务的性能很差。
消息积压的解决方案:
- 在消费者中,使用多线程模式,充分利用机器的性能进行消费。
- 通过业务架构设计,提升业务层面消费的性能。
- 创建多个消费组、多个消费者,部署在不同的服务器中,同时消费。
- 创建一个消费者,该消费者在Kafka中创建一个主题,配置多分区,每个分区再配置多个消费者,消费者将poll下来的消息直接转发到新建的主题上,不进行消费,此时,新主题的多个分区的多个消费者开始一起消费,不太常用。
4.延迟队列的实现方式
订单创建后,超过30分钟没有支付,则需要取消订单,如何判断下单的时间与当前时间间隔30分钟,可以通过延迟队列来实现。
延迟队列的实现:
- kafka中创建出来一个主题作为延迟队列,消费者消费该主题中的消息。
- 消费者消费消息时,判断消息的创建时间与当前时间是否超过30分钟,前提是订单没有支付。
- 如果已经支付,那么就去数据库中修改订单状态为已支付。
- 如果没有支付,那么就记录当前消息的offset值不会在消费之后的消息数据,等待1分钟后,再次向kafka拉取该offset之后的消息,继续进行判断。
不太确定红色部分的内容。
版权归原作者 Jiangxl~ 所有, 如有侵权,请联系我们删除。