回顾之前的处理方案
生产环境RocketMQ 顺序问题中有介绍,之前在线上环境遇到的关于RocketMQ 顺序的问题;
也有说到处理方案 保证 生产者-消息队列-消费者 都是一对一的关系
- 上游应用:保证生产者生产消息的顺序(由原来的并发生产改为了串行生产);
- 下游应用:也为了保证顺序消费,由并行模式改为串型模式;
- 消息队列:将消息(需要保证顺序的消息)放在同一个队列中进行传输;
为什么需要新的处理方案?
因为之前的方案,不管是在生产者还是消费者,都必须使用同步的方式,并且需要保证有序的消息,必须是在同一个队列中进行传输;这也意味着牺牲了很大部分异步的性能优势
新方案是:
让生产者指定消息的顺序,例如 1、2、3 ;
消费者如果收到 2号消息,会判断1号消息消费了没有,如果没有就先落库等待;
如果已经1号消息已经被消费了,则直接消费2号消息,并记录2号为已消费状态;
还需要查询数据库是否还有3号消息,如果已经收到3号消息;则继续消费3号消息;
新方案虽然保证了消费者异步消费且消息不在同一个队列中,依然能做到有序;但是还是需要生产者同步
的生产消息,因为生产消息时依然需要指定消息