学做衣服上什么网站,中国工商信息注册网,查网站域名备案查询,网站友情链接的作用RabbitMq消息丢失主要是有三种情况#xff1a;生产者消息未发送到服务端、服务端消息没有做持久化导致丢失、消费端未收到消息。解决方案依次如下#xff1a;
开启事务或使用确认机制。对于一些重要的消息#xff0c;生产者可以开启事务#xff0c;确保消息发送成功后再提…RabbitMq消息丢失主要是有三种情况生产者消息未发送到服务端、服务端消息没有做持久化导致丢失、消费端未收到消息。解决方案依次如下
开启事务或使用确认机制。对于一些重要的消息生产者可以开启事务确保消息发送成功后再提交事务。或者使用确认机制等待 MQ 服务器的确认响应确认消息已成功接收服务端消息持久化以及高可用机制开启消息的持久化机制正常消息是存储在内存当中的开启持久化机制之后会将消息存储在磁盘当中。还可以开启镜像集群以及自从同步Raft协议机制保证服务宕机之后我的消息不会丢失消费者确认机制开启消费者确认机制为auto由spring确认消息处理成功后完成 ack如果多次没有收到ack就会重复发送多次没有就会将消息发送到一场交换机
消息重复消费问题主要就是一个幂等性的一个问题无论是一个操作执行多少次产生的结果合执行一次是相同的解决方案有几个方面数据库层面、业务层面、分布式系统层面
数据库层面 唯一索引对于数据库层面可以使用唯一索引对于插入操作可以在数据表中设置唯一索引确保相同的数据不会被重复插入。乐观锁可以对插入数据添加一个版本号字段每一次更新数据时先检查版本号是否与预期一致如果一致就进行增加版本号否则不进行操作业务层面 状态控制对于一些像是点赞的问题可以通过判断它的状态来进行判断是否执行就比如我当前点赞那么就将状态设置为1表示已点赞状态。当再次执行点赞操作时通过检查当前状态如果已经是 1则不进行重复的点赞操作直接返回已点赞的结果或者忽略此次请求从而保证了无论点赞操作被执行多少次最终的效果都是一致的去重表创建一个去重表用于记录已经处理过的操作。在执行关键操作之前先检查去重表中是否存在相应的记录。如果存在则说明该操作已经执行过直接返回结果如果不存在则执行操作并在去重表中插入一条记录。分布式系统层面 分布式锁在分布式的环境当中使用分布式锁来保证同一时间只有一个节点能够执行特定操作就可以避免重复执行全局唯一ID为每个操作生成一个全局唯一的 ID在执行操作时将这个 ID 作为参数传递给服务。服务在处理操作时先检查是否已经处理过具有相同 ID 的操作。如果已经处理过则直接返回结果如果没有处理过则执行操作并记录这个 ID
消费顺序性问题主要有以下几个层面来解决生成者层面消费队列层面、消费者层面
生产者层面单线程发送确保同一个业务流程的消息由同一个生产者线程发送这样可以保证消息到达队列的顺序性消费的队列层面分区或者队列划分对于支持分区或多个队列的消息队列系统可以将需要保证顺序的消息发送到同一个分区或队列中消费者层面 单线程消费消费者使用给单线程来消费特定的分区合队列中的消息可以确保消息按照消息队列顺序进行消费业务层面判断消费者可以在本地存储已处理消息的状态例如记录已处理的消息的序号或唯一标识。在消费下一个消息之前检查该消息的序号是否符合预期顺序如果不符合则等待或进行相应的处理重试机制当消费消息出现错误需要重试时要确保重试的消息不会打乱顺序。可以将重试的消息放入一个单独的队列或延迟处理等前面的消息都处理完成后再进行重试