这个问题也可以理解为:如何实现消息的可靠投递和可靠的消费
可以自己实现一个本地的事务消息,大致的思路:
- 本地创建一个发送日志表,提交事务之后立刻向消息队列投递一次消息;
- 使用消息队列模拟RPC调用,在消费者成功处理消息之后,向省份插着投递成功消费的消息,以便让生产端之道消息已经处理成功了;
- 生产端定时任务补偿,对于超过固定时间还没有投递成功的消息,进行重新投递,消费端注意做好幂等处理。
以上是一个通用的解决方案。
当然,如果你用的是RocketMQ,也可以尝试使用RocketMQ的事务消息来实现:消息队列#RocketMQ#特性#数据完整性与事务消息
但是RocketMQ事务消息也只是实现了消息投递的可靠性,并没有实现保证消息的消费。