与传统电商相比,携程门票交易系统具有两大特点:
1) 强一致性:用户预 订后保证出票且尽可能快速确认,确保每一笔交易都能履约。
2) 多维度和跨商品组合限购:限购规则复杂多变,例如多维度和跨商品组合限购,保障每位用户有公平购票的机会,避免囤票行为。
当系统遇到洪峰流量时,容易出现页面打开慢、卡顿等问题,主要原因有以下几点:
1) Redis 超负载与缓存热点。
2) 数据库超负载。
3) 供应商系统不稳定。
系统优化:
一、Redis负载与缓存热点优化
a) 缓存热点应对方案:热点识别自动构建多级缓存将单位时间内高频访问的Key ,识别出来。例如:同一个 Key 1 秒内单机访问 10 次。
b) 缓存大key问题:
1. 精简缓存对象:去除缓存中的冗余字段。
2. 压缩缓存对象:采用压缩比更高的压缩方式,缩小缓存对象。
3. 拆分大 Key :若精简和压缩后还是过大,根据业务逻辑,将大 Key 拆分成多个小 Key 。
5. 长期治理:建立长期治理机制,定期扫描 Redis 中的大 Key ,每周跟进,将隐患在日常治理中消除。
二、数据库超载优化
a) 缓存覆盖更新策略:替代直接删除缓存 Key 的做法,采用了缓存覆盖更新策略。当商品信息发生变更时,系统不再删除缓存 Key ,而是直接更新该 Key 对应的缓存值。避免了流量穿透到底层数据库。
b) 消息聚合:针对商品变化消息量过大的问题,引入了消息聚合机制。将商品多次变化消息在一段时间窗口内合并成一个,减少消息处理的频率。
c) 异步更新缓存:为了进一步降低 对数据库的实时压力,采用了异步更新缓存的策略。当商品信息发生变更时,系统不会立即更新缓存,而是将更新任务放入一个异步队列中,由后台线程异步处理。
三、供应商系统不稳定
当供应商系统面临大流量冲击时,往往会出现响应缓慢甚至被限流的情况,这直接影响了我们自身系统的稳定性和用户体验。
为了缓解上述问题,我们采取以下技术策略:
1)削峰填谷 缓冲池:利用消息队列作为订单提交的缓冲池,将订单信息先写入队列,再由后台服务异步处理。这样可以将订单提交的高峰流量削平,减少对供应商系统的瞬时压力。