消息队列
# RabbitMQ-如何保证消息不丢失
消息队列的作用,可以做到异步发送(验证码、短信、邮件)
MySQL和Redis,ES之间的数据同步
分布式事务
削峰填谷
rabbitMQ工作模式,exchange和Queue进行绑定,根据话题匹配,exchange发送消息到指定的Queue。
消息丢失的位置
框架中实现了发送者发送消息的回调函数,并说明是否发送成功,如果发送失败了,则再回调方法中进行重发。
另外方法可以发送失败时,保存日志,之后定时重发,成功发送后删除日志中的记录。
若消息发送到了Queue中,宕机了,消息丢失。
可以进行消息持久化,交换机持久化,队列持久化。
消费者确认,消费者处理消息后向MQ发送ack回执,收到ack自动删除消息。还有一个,消费者出现异常时,会进行重试,到了一定次数后还是不行,将消息送到异常交换机中记录。
# RabbitMQ死信交换机、延迟队列
- 延迟队列:进入队列的消息会被延迟消费
- 超时订单、限时优惠、定时发布
延迟队列=死信交换机+TTL
死信
- 消息被消费者拒绝了
- 消息是过期消息
- 消息队列满了,较早的消息
成为死信的消息,可以转发到死信交换机
TTL
- 消息队列的TTL
- 消息的TTL
# RabbitMQ消息堆积
生产者的生产消息的速度,远超过消费者消费消息的速度。
- 增加消费者
- 在消费者中开启线程池
- 惰性队列,把存放在磁盘中
# RabbitMQ集群
# Kafka如何保证消息不丢失
Kafka的工作模式为,生产者向指定的topic发送消息,如果指定了消息的key,则将key hash并取模,存放到指定的分区中,如果没有key,则轮次存放。一个topic有多个分区,每个分区可以放在不同的broker中。一个消费者组中的消费者消费不同的分区。
# Producer
生产者发送到主分区后,可以收到broker的ack确认,这个是可以设置的,设置ack=1,或者ack=all。表示主分区收到消息后,和备份分区都收到消息后的回复确认。
如果没有收到确认,生产者尝试进行重发。
# Broker
Broker中主分区收到消息后,将数据持久化,操作系统定时将page cache中的数据持久化存盘。如果此时broker宕机,选取了一个落后的备份分区当主分区,那么就会数据丢失。
# Consumer
消费者到指定的topic,指定的分区去消费消息。消费完成后会提交offset消费位移进度记录。
- 先提交offset,后处理消息,那么可能会造成消息丢失。
- 先处理消息,后提交offset,那么可能会造成消息重复消费,这个可以在业务中保证幂等。
# Kafka保证消费顺序
对于需要顺序消费的消息,放入到同一个分区即可。
# Kafka高可用机制
# Kafka高性能
- 消息分区:不同的服务器,并发
- 顺序读写:
- 页缓存:
- 零拷贝: