为了账号安全,请及时绑定邮箱和手机立即绑定

引入 message 表的意义?

为了保证消息百分百投递, 在发送消息到 RabbitMQ 的同时,写入一份消息到 message 表.


然后消费者读取 RabbitMQ 的同时也要查询 message 表对应的消息.  


我有点理解不了, 在这个设计中, 直接拿到 Rabbit 貌似都可以,理解不了意义在哪里.

正在回答

5 回答

借楼,感觉这个场景举例不是很好,既然我消费者能直接访问DB,并且也有个定时任务可以读取业务数据和MSG数据,那还需要RabbitMQ干嘛。我直接让生产者把消息放到MSG表,消费者定时任务访问MSG表获取消息处理,不用担心幂等,不用担心消息在MQ传递过程总出现的各种问题。?

0 回复 有任何疑惑可以回复我~
#1

_phpstudy 提问者

我当初就是这个问题, 在这个流程中,确实直接干掉 rabbit 也是无问题的. 这个问题应该重点从消息队列能办到而 db 办不到的角度出发. 假设 你现在消息比较多, 生产消息速度比较快, 使用 DB, 会频繁的操作DB,这里就有个效率问题. 再假设, 你因为消息多, 需要多跑一个程序来处理消息, 使用 db , 可能会产生 两个程序互相竞争问题(多个程序处理同一条记录,产生脏数据 或者 产生锁)
2020-03-26 回复 有任何疑惑可以回复我~
#2

涣涣虚心 回复 _phpstudy 提问者

分布式应用中,不同的application用不同的DB啊。类似分布式事务里本地消息表。。。
2020-05-19 回复 有任何疑惑可以回复我~

如果一个消息成功产生了,但是因为生产者没有连接到exchange或者网络故障等 那么这个消息是不会保存到消息队列中去的,消费者也就无法对这个消息进行消费了,而案例中这个message表就能解决这个问题,就算在消息队列中没有这条消息记录也能在数据库的消息表中找到,并重新进行消费

2 回复 有任何疑惑可以回复我~

消费者读取MQ的时候为什么需要拿去message表对应的消息?message表只是起到一个订单发送消息状态的记录作用 只是记录的作用,在拿去mq后手动确认消息签收后 这时候才回去更新message表对应的订单投递状态 即:0(发送中)->1(发送成功),如果说中间因为网络状态等等导致消费者这边没有签收确认这个消息,此时的订单消息状态还是0,这时候会有定时任务去轮询查取所有消息状态为0(发送中)的消息来resend。

0 回复 有任何疑惑可以回复我~
#1

_phpstudy 提问者

我的问题就在于此, 你签收消息之后, 更新 message 表对应消息 这一步. 我们有了 message 表, 记录了消费者要确认的消息, 记录了消息的状态. 那么我们现在直接 把 rabbitMQ 干掉. 只用 message 表, 照样能实现消息发布订阅系统啊. 所以我问这里 rabbitMQ 起什么作用, 意义在哪里.
2019-10-23 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

引入 message 表的意义?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信