背景

消息队列是现代应用系统中应用非常广泛的组件。可以利用消息队列实现流量削峰,业务解耦。

例子

流量削峰

用户入会。大促时,往往会出现大量的用户引流入会,这时候快速的处理入会请求,不影响用户的活动参与就非常重要。这时候往往将用户入会请求直接标记为成功,再交由消费服务完成完整的入会过程,可能涉及历史的积分等级处理。

业务解耦

在用户积分等级更新链路上,往往容易出现大促的高流量。这时候链路中如果还存在用户创建等重操作,往往导致接口的qps无法提高,并且导致数据库压力骤增。这时候就要将非核心业务进行剥离,例如用户创建不影响更新动作异步处理。

如何保证消息不丢

生产端需要保障可靠性投递,例如与业务封装在同一个事务中,保证业务成功消息一定落库。

再由服务进行扫描消息投递消息,这时候可以保证消息投递成功。

消费端,消费到消息后保证业务成功后再进行ack,业务如果失败,同样落库,再由补偿服务进行重试。

消费顺序问题

对接会员状态变更消息时,由于无法保证消费顺序,导致用户最终状态不一致。

这时候需要使用顺序队列,改造生产端将用户id hash到相同的队列key,消费端同样需要按照队列key顺序处理,保证顺序一致。

另外也可以采用时间戳丢弃历史消息,但是需要保证落库可追溯。业务允许,且出现概率不高可以这样处理节省费用。

消息积压怎么处理

入会送积分,挤压了50w。调整服务处理为多线程,另外开启多个消费实例进行处理,成功在半小时之内完成处理。