有这么个情景。
1查询出等待发送消息的记录
2变更该条记录状态为正在发送(一但进入正在发送则该条记录状态不能被改变:入取消发送)
3通过调用第三方请求发送消息
4如果发送成功更新为发送成功,如果失败更新为发送失败
请问有什么办法可以较好的保证记录不会被重复发送,发送成功后能确保记录状态变更为发送成功
有这么个情景。
1查询出等待发送消息的记录
2变更该条记录状态为正在发送(一但进入正在发送则该条记录状态不能被改变:入取消发送)
3通过调用第三方请求发送消息
4如果发送成功更新为发送成功,如果失败更新为发送失败
请问有什么办法可以较好的保证记录不会被重复发送,发送成功后能确保记录状态变更为发送成功
这个场景更像是消息队列。
既然每条记录都有状态位,使用MySQL更新就行,MySQL有自己的隔离级别与锁机制,单条更新不会出问题。
控制程序:
一个监控程序定时扫表,将未处理的记录取出,变更状态为正在发送。
另起一个或者多个进程发送消息,并将处理结果变更到MySQL中。
建议:
消息队列不建议使用MySQL,每次处理时都有大量的写操作,MySQL压力较大。
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
2 回答2.8k 阅读✓ 已解决
这个貌似不是事务的问题,要看你的设计了,比如List放等待发送消息的记录,遍历list,调用第三方接口后,修改状态为正在发送,发送成功,更新该条数据的状态入库,发送失败,把失败的数据放在一个缓冲区,启动一个线程,重发这些失败的数据。