顺序消费问题
顺序消息业务场景:
1.某些业务场景下存在正向操作,和逆向操作。并且不希望旧数据覆盖新数据。
上述业务本质上,当新的消息产生时,旧消息实质上已经被“作废”了,直接丢弃即可。故可以考虑基于时间戳定制一个过滤器。
解决思路:
1.基于一致性哈希思路,做分区顺序消费。根据业务特性,设计唯一性key算出哈希值,对queue数量取模。保证顺序的消息投递到同一个queue。
备注:如果期望全局顺序消费,那只能存在一个分区(在RocketMQ下即一个queue)
消费者顺序从queue中pull消息,单线程消费。根据实际业务情况具体分析。
2.基于Redis时间戳 + 分布式锁方式
1.分布式锁目的在于,业务系统分布式集群环境下,多个业务实例在做消费业务逻辑时,保证使用“共享资源”时不被其他业务实例干扰。
2.分布式锁加锁成功后,需要2次检查时间戳。
举例:
线程t1: key:corp_1_100 val:100正向操作
线程t2: key:corp_1_100 val:200逆向操作
进入filter顺序为 t1,然后t2,正常通过filter。之后t2先加锁成功(此时t1为无效操作),再次检查时即可排除t1。
3.解锁时需保证该线程释放自己加的锁。这里可以使用redission框架来完成。