制作物流网站,建网站费用会计分录,安阳网站,wordpress修改我要注册链接RabbitMQ-如何保证消息不丢失 生产者把消息发送到 RabbitMQ Server 的过程中丢失 从生产者发送消息的角度来说#xff0c;RabbitMQ 提供了一个 Confirm#xff08;消息确认#xff09;机制#xff0c;生产者发送消息到 Server 端以后#xff0c;如果消息处理成功#xff…RabbitMQ-如何保证消息不丢失 生产者把消息发送到 RabbitMQ Server 的过程中丢失 从生产者发送消息的角度来说RabbitMQ 提供了一个 Confirm消息确认机制生产者发送消息到 Server 端以后如果消息处理成功Server 端会返回一个 ack 消息。客户端可以根据消息的处理结果来决定是否要做消息的重新发送从而确保消息一定到达 RabbitMQ Server 上。 RabbitMQ Server 收到消息后在持久化之前宕机数据未到达队列导致数据丢失 在发布消息时你可以设置消息的持久化属性使其在 RabbitMQ 服务器宕机后仍然保存在磁盘上。这样即使服务器宕机消息仍然会被保存并在服务器重新启动后恢复。使用事务来确保消息的持久化和发送的原子性。在开启事务模式后RabbitMQ 会等待消息被完全写入磁盘后才确认发布成功 队列中的数据还未被消费就宕机队列中的数据消息丢失 在创建队列时可以将队列设置为持久化这样在 RabbitMQ 服务宕机时所有未被消费的消息也将被持久化保存在磁盘中并在服务恢复时重新加载到队列中。 消费端收到消息还没来得及处理宕机导致 RabbitMQ Server 认为这个消息已签收 把消息的自动确认机制修改成手动确认也就是说消费端只有手动调用消息确认方法才表示消息已经被签收。确保消息被成功的业务调用后才发起确认信号来删除队列中的消息。 MQ百万消息持续积压问题 消息积压的原因是生产者的消息生产速度大于消费者的消费速度遇到这个问题的时候需要排查具体的原因再提出解决方案 流量变大而RabbitMQ服务器配置偏低导致消息产生速度大于消费速度 扩容即可。可以纵向扩容即增加服务器资源该加内存加内存该加CPU加CPU。如果纵向扩容不方便那就横向扩容即将单机改为集群模式增加集群节点并且增加消费者数量让消费速度快起来原来是5个消费者现在变成50个消费者 通过异步的方式来处理消息、或者通过批量处理的方式来消费。 采用惰性队列扩大交换器和消费者之间的消息可积压空间正常队列把消息存放在内存中可利用空间较小惰性队列接收到消息后直接存入磁盘而非内存要消费消息时才会从磁盘中读取并加载到内存支持数百万数据的存储 消费者故障从而消息只增不减 通过查看日志搞清楚为什么消费者会故障据我多年经验发生此类问题大概率是程序代码写的不够完美跑着跑着导致内存溢出然后消费者进程被杀。要想永久解决此问题需要结合日志分析程序代码优化代码。临时解决方法是写监控脚本如果发现消费者进程中断需要重启服务 程序逻辑设计有问题导致生产者持续生产消息而消费者不消费或者消费慢 种情况发生的概率其实并不高总之就是程序逻辑问题判断的方法也很简单持续观察服务器的资源耗费情况如果内存、CPU一切都正常但就是队列持续增长而消费速度非常慢。此时就需要好好查查程序代码了。当然可以尝试增加消费者数量看看是否有好转。
业务考虑 相信当我们发现消息积压时想必问题已经比较严重了或者说已经影响到业务正常运转了那么当务之急肯定是需要先将业务恢复正常。对于上面第二种情况直接重启相关服务让消费者恢复正常定是首当其冲。 除此之外还有一种“断尾求生”的骚操作就是新开一个队列将新产生的消息到新队列里消费者也到新队列里消费。而老的队列则需要做一个异步处理慢慢消费掉即可。
当然如果积压的消息不怎么重要可有可无的话那干脆直接删除掉这样大家都省事不是。 RabbitMQ消息的重复消费问题
消息去重在消费者端对接收到的消息进行去重操作可以通过维护一个消息ID的集合去重表或者使用唯一标识查数据库来判断是否已经消费过该消息。如果已经消费过则不进行处理避免重复消费。
消息确认机制RabbitMQ提供了消息确认机制可以确保消息被正确地消费。消费者在消费完消息之后可以手动向RabbitMQ发送确认消息告知RabbitMQ该消息已经成功消费RabbitMQ会将该消息标记为已确认然后删除消息队列中的该消息。 RabbitMQ消息的消费顺序性问题 业务中可能会存在多个消息需要顺序处理的情况比如生成订单和扣减库存消息那肯定先执行生成订单的操作再执行扣减库存操作。 但我们的项目一般都是集群部署的一个队列就会有多个消费者怎么实现一个队列中所有顺序消息只能有一个消费者消费呢 RabbitMQ本身并不能直接保证消息的消费顺序因为其是基于 AMQP 协议 的它使用多个消费者在多个线程上并行地消费消息。但是可以采取以下方法间接实现消息的有序消费 解决方法 单消费者对单队列可以给 RabbitMQ 创建多个queue 每个消费者只消费一个queue 生产者根据订单号把订单号相同的消息放入一个同一个queue。这样同一个订单号的消息就只会被同一个消费者顺序消费。 使用多个队列和分区键可以将相同类型的消息发送到多个队列并使用分区键 routingKey例如基于消息的某个属性决定消息要发送到哪个队列。然后在消费者端针对每个队列都使用单个消费者来保证消息的消费顺序。 消费者内部排序为了减少网络延迟、消费者运行速度等影响在消费者端可以对接收到的消息进行排序以确保按照特定的顺序进行处理。消费者可以在内部维护一个消息缓冲区按照某个属性或序列号对消息进行排序后再进行处理。