顺序消费问题


顺序消息业务场景:

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框架来完成。