背景
消息队列是现代应用系统中应用非常广泛的组件。可以利用消息队列实现流量削峰,业务解耦。
例子
流量削峰
用户入会。大促时,往往会出现大量的用户引流入会,这时候快速的处理入会请求,不影响用户的活动参与就非常重要。这时候往往将用户入会请求直接标记为成功,再交由消费服务完成完整的入会过程,可能涉及历史的积分等级处理。
业务解耦
在用户积分等级更新链路上,往往容易出现大促的高流量。这时候链路中如果还存在用户创建等重操作,往往导致接口的qps无法提高,并且导致数据库压力骤增。这时候就要将非核心业务进行剥离,例如用户创建不影响更新动作异步处理。
如何保证消息不丢
生产端需要保障可靠性投递,例如与业务封装在同一个事务中,保证业务成功消息一定落库。
再由服务进行扫描消息投递消息,这时候可以保证消息投递成功。
消费端,消费到消息后保证业务成功后再进行ack,业务如果失败,同样落库,再由补偿服务进行重试。
消费顺序问题
对接会员状态变更消息时,由于无法保证消费顺序,导致用户最终状态不一致。
这时候需要使用顺序队列,改造生产端将用户id hash到相同的队列key,消费端同样需要按照队列key顺序处理,保证顺序一致。
另外也可以采用时间戳丢弃历史消息,但是需要保证落库可追溯。业务允许,且出现概率不高可以这样处理节省费用。
消息积压怎么处理
入会送积分,挤压了50w。调整服务处理为多线程,另外开启多个消费实例进行处理,成功在半小时之内完成处理。