RabbitMQ 数据丢失 导致  状态更新不一致的bug 及 数据修复过程_持久化

RabbitMQ 数据丢失 导致  状态更新不一致的bug 及 数据修复过程_重发_02

 

2个页面中同一条数据的状态不一致,并且只有部分数据 是这样,大部分的数据都是 一致的。

由于我们得订单状态得处理 都是通过定时任务来批量进行处理,并且写入RabbitMQ 消息队列。

经过对业务逻辑流程与 代码实现的角度分析 得出结论为:RabbitMQ 数据丢失 导致,销售出库单明细表中得数据状态没有及时更新到。

 

关于mq数据丢失得解决方案:

1、开启RabbitMQ 的持久化机制,也有一种可能 ,就是这个消息写到了 RabbitMQ 中,但是还没来得及持久化到磁盘上,结果不巧,此时 RabbitMQ 挂了,就会导致内存里的一点点数据丢失。所以,持久化可以跟生产者那边的 “确认机制” 配合起来,只有消息被持久化到磁盘之后,才会通知生产者 ack 了,所以哪怕是在持久化到磁盘之前,RabbitMQ 挂了,数据丢了,生产者收不到 ack,需要自己重发。

2、关闭 RabbitMQ 的自动 ack,可以通过一个 api 来调用就行,确保每次数据处理完后手动 ack。这样的话,如果你还没处理完,不就没有 ack 了?那 RabbitMQ 就认为你还没处理完,这个时候 RabbitMQ 会把这个消费分配给别的 消费者去处理,消息是不会丢的。

--------------------------------------------------

对于生产中 销售出库单明细表中 状态 错误得数据进行修正:

查询到 2个表中状态不一致得数据:

select a.out_stock_no,a.out_stock_status,b.out_stock_status from tb_ofc_out_stock a ,tb_ofc_out_stock_detail b
where a.out_stock_no =b.out_stock_no and a.out_stock_type = 2 and a.shipping_time
BETWEEN "2021-07-01 00:00:00" and "2021-09-31 23:59:59" and 
a.out_stock_status != b.out_stock_status

更新销售出库单明细表中  销售出库单状态 与  销售出库单页面中得状态一致
update tb_ofc_out_stock a,tb_ofc_out_stock_detail b
set b.out_stock_status = a.out_stock_status where a.out_stock_no = b.out_stock_no
and a.out_stock_type = 2 and a.shipping_time
BETWEEN "2021-07-01 00:00:00" and "2021-09-31 23:59:59" and 
a.out_stock_status != b.out_stock_status

在生产数据库中提交以上sql语句执行则可。

--------------------------------------------------------------

select count(1) from tb_ofc_out_stock a ,tb_ofc_out_stock_detail b
where a.out_stock_no =b.out_stock_no and a.out_stock_type = 2 and a.shipping_time
BETWEEN "2021-07-01 00:00:00" and "2021-09-31 23:59:59" and 
a.out_stock_status != b.out_stock_status

统计了下 生产环境中 没有更新状态得数据  占了 总数据得 7%多。

RabbitMQ 数据丢失 导致  状态更新不一致的bug 及 数据修复过程_数据丢失_03

 ------------------------------------------------------------------------

关于涉及到定时任务 写入 RabbitMQ 处理大批量数据得 系统 都需要注意 RabbitMQ 数据丢失得问题!!!

 

xiezhifei