如果消费者在收到消息后处理的结果会影响后续生产者消息的发送,那么用消息队列合适吗?

查看:221
本文介绍了如果消费者在收到消息后处理的结果会影响后续生产者消息的发送,那么用消息队列合适吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

场景:使用rabbitmq,生产者消费者模式

  1. 消息队列收到一个删除某条数据的信息

  2. 一个客户端收到后,进行删除业务操作(假如业务操作比较繁琐,数据在10秒之后才能删除

  3. 在处理数据的同时(也就是10秒之内),另外一个客户端又接收到了更改这条数据的信息,但是之前的数据并没有删除。这会不会造成数据冲突

另,有没有好的解决方案,谢谢

解决方案

不知道第2点的操作到底有多繁琐, 比如涉及几张表, 是否跨库, 是否有其它网络IO操作, 所以只能提供一些一般化的建议 (假设你采用的是MySQL)

  1. 采用事务(在你的表是一个库内的情况下有效), 在给这个业务进行删除时, 可以给暴露给最外面的加一个悲观锁, 这样将会阻塞其它的mysql客户端的写请求, (具体实现是在事务内用 select * from my_table where id = my_id for update)

  2. 在事务实现不方便的情况下, 可以定义一个状态常量为"待删除". 在开始操作删除时, 先变更掉你这整个业务操作的状态为待删除. 另一边, 你的修改操作则需要加上 where status != 待删除

  3. 上面第2点也可以用redis等缓存来实现, 删除前加个key(或者原子计数+1), 操作完成之后, 删除redis的那个key(或者原子计数-1)

不是MySQL也关系不大, 思路基本一致

这篇关于如果消费者在收到消息后处理的结果会影响后续生产者消息的发送,那么用消息队列合适吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆