
做法一:使用加锁操作先占有锁资源,再占有红包。
可以使用分布式全局锁的方式(各种分布式锁组件或者数据库锁),先申请 lock 该红包资源且成功后再做后续操作。优点是不会出现脏数据问题,某一个时刻只有一个应用线程持有 lock,红包只会被至多一个用户抢到,数据一致性有保障。缺点是,所有请求同一时刻都在抢红包 A,下一个时刻又都在抢红包 B,并且只有一个抢成功,其他都失败,效率很低。
做法二:单独开发请求排队调度模块。
排队模块接收用户的抢红包请求,以 FIFO 模式保存下来,调度模块负责 FIFO 队列的动态调度,一旦有空闲资源,便从队列头部把用户的访问请求取出后交给真正提供服务的模块处理。优点是,具有中心节点的统一资源管理,对系统的可控性强,可深度定制。缺点是,所有请求流量都会有中心节点参与,效率必然会比分布式无中心系统低,并且,中心节点也很容易成为整个系统的性能瓶颈。
做法三:巧用 Redis 特性,使其成为分布式序号生成器。
前文已经提到,红包系统所使用的红包数据都是预先生成好的,我们使用数字 ID 来标识,这个 ID 是全局唯一的,所有围绕红包的操作都使用这个 ID 作为数据的关联项。在实际的请求流量过来时,可采用"分组"处理流量的方式。
加MQ排队,分库分表。

参考:
https://www.infoq.cn/article/solution-to-the-architecture-of-spike-system
https://www.ibm.com/developerworks/cn/web/wa-design-small-and-good-kill-system/index.html
网友评论