RabbitMQ相关总结
//connection //channel //broke //exchange:fanout、 dirct、 topic(*:一个单词、#:多个单词)、 header //queue //bind(exchange,queue,routingkey) //一、如何保证消息不丢失 //生产者发布消息时 设置消息持久化(Persistent:true)、设置确认模式(DeliveryMode:2) //声明交换机时设置持久化(durable:true) //声明队列时声明持久化(durable:true) //消费者消费消息时关闭自动应答(autoAck:false) //二、实现延迟队列 //声明队列时设置队列消息过期时间TTL(x-message-ttl)或者发布消息时设置消息过期时间TTL(Expiration) //配置死信队列 //当消息没有消费者过期时会进入死信队列,再消费死信队列中的消息可实现延迟队列的效果 //三、进入死信队列条件 //配置了死信队列 //消息被拒、过期、超过队列长度 //四、消费者2种消费模式 //Push(BasicConsume)、Pull(BasicGet) //五、如何保证消息不重复消费
前提:生产者产生消息时带一个唯一ID
方案一、将唯一ID设置为数据库表的唯一索引,通过数据库唯一索引保证消费端幂等性(适用于新增场景)
方案二、使用Redis+TTL+消费状态(过期时间)
方案三、使用数据库+补偿机制(数据库存唯一ID、消费状态、消费次数),定时任务自动处理消费多少次的任务
-->(特殊情况,比如消费完成没有更新消费状态)消费次数>N次,则人工介入做补偿
-->插入失败-->(已消费直接返回成功、消费中则拒收进入延迟队列)
插入消费记录(消费中、消费次数)-->插入成功-->执行业务-->执行成功-->修改消费记录状态为成功 -->执行失败-->删除消费记录-->重新投递
//六、开启手动应答模式后 //BasicAck()、BasicNAck、BasicReject
喜欢 C#、SQL、Web