背景
基于当前遇到的问题。
-
商品模块核心接口目前是基于odp的,会很耗资源,单pod压测有上限。
-
redis存在热点数据的问题。(秒杀同一个商品的情况)
-
接口耗时过长。
-
目前组装数据会在c端接口组装,商品本身就是读多写少,可以后台组装好之后统一输出。
指标
- 接口压测指标,单pod并发?(减少资源数量)
-
- 理论上单pod在2千左右。 10w需要50个pod。(压测获取)
- 耗时降低时间?保持在10毫秒内返回 。(压测获取)
-
- 1个/2个/5个 sku压测数据。
- 服务启动时间? (同步(热点数据)+异步(其他上架数据))
-
- 48029 w 上架数据。
- 每天变更的数据多少个? 1w 左右接口同步的。正常人工修改2000条以内,所以变更很少。
- 热点数据有多少?
-
- 每天访问的商品数量(写本是缓存。每隔一段时间上报给redis,redis会记录bitmap,说明是热点数据)。
- 穿透率
-
-
穿透redis 保障在 1%左右。
-
优化收益
-
减少资源占用 (pod数量480个)
-
解决热点数据的问题。
-
减少接口响应时间。
-
缩短链路长度。
本次改造涉及接口:kv2 + kv1 + 快照v2
整体架构
流程图
- 全量数据(热点数据),服务启动的时候,访问db,拉取上架数据,写入到本地文件(本地缓存读取没有才会加载)
- 增量数据(热点数据),根据偏移量增量更新。
-
- pod第一次初始化之后会记录最新的时间,后续跟进时间来作为下一次的偏移量(表中的update_time)。
- pod拉取根据上一次的偏移量,查找哪些skuid变更了,重新写入本地文件
- 洗数据的场景,涉及大批量的数据改动。
-
-
- 不做任何改动,会有一点延迟,如果晚上跑是可接受的。
-
- 访问未上架的商品会穿透文件不会写到文件中,理论上文件都是上架商品。
- 热点数据:
-
- 第一版 上架数据 。
- 第二版 接口增加上报功能。每隔一段时间上报。
-
-
- 最简单的方法写到redis的bitmap中,使用开关控制(大促期间关掉上报功能)。
-
存储方案:
本地缓存(30秒)skuId => all data(1次调用组装之后的数据)
文件存储(无时间限制)
- sku文件,
- spu文件,
- shop文件,(全量,1587)
- 类目文件,(全量数据,1700)
- 索引文件(redis),作用: 1. 为了加快验证和更新数据使用 (skuId => version) 2. 访问快照如果是最新快照会读取本地文件。
-
- sku_skuId => [1,2,3,4] md5 update_time
- spu_spuId => [1,2,3,4] md5 update_time
skuInfo
方案一(暂不考虑)
每次数据变更会记录到db中去(新的聚合之后的快照数据)
-
- id,skuId, md5, version=[1,2,3,4,5],kv1Data, kv2Data, update_time(偏移量)
- id,spuId, md5, verrsion=[1,2,3,4], spuName, data,update_time
文件
目录划分 0-99/0-99/skuId (最后四位计算)。
kv1 => json
kv2 => json
id(表的id)
缺点:存储多了一份。
优点:穿透之后直接查db查询不需要额外的组装放到缓存中去。比较方便。c端不用写复杂的组装逻辑。
方案二(推荐)
复用当前的db和redis存储。(偏移量使用现有goodsSku中的更新使劲)
kv1和kv2的接口通过计算得出(和原有计算逻辑保持一致)
穿透查目前的redis和db数据。
缺点:前期并行阶段改代码需要改2个地方。
优点:1. 不用做单独的额外存储,穿透之后复用当前redis+db的方案。
-
启动可以不需要刷新数据,服务器启动之后异步更新本地文件。
文件存储
目录划分 0-99/0-99/skuId (最后四位计算)。
data => db中的json数据
spuInfo
目录划分 0-99/0-99/spuId (最后四位计算)
data => json
spu变更会导致大量sku的变更,通过索引文件的md5值对比,可以过滤掉很大一部分数据。
shopInfo
目录划分 0-99/shopId
id
versions
md5
agencyId
channelId
shopPayMix
storeType
类目
存储全量数据(数据比较少tblGoodsTags 1606 tblGoodsField 368条)
访问流程
其他:
一致性保障
- 全量文件数据比对。(30分钟,和redis和db比对,根据数据进行调整。)
- 全量接口数据比对。(30分钟,会单独访问每一个skuid进行比对数据。)
- 如果根据偏移量更新发现偏移量差超过30秒会暂时报警处理,一致性延迟不能超出1分钟。
切换方案
使用方统计
切换顺序
- 商品内部接口切换。
- 通过网关切换。
- 调用方直接替换链接。