“好。”韩非说,“温杰,你先来说说系统的情况。”
温杰站起身来,从包里抽出一沓纸,那是上午列印好的架构说明书和待优化清单。他把纸分发给技术小组成员,然后打开笔记本电脑,把界面同步到会议桌尽头的背投电视上。
“各位,我先简单过一下现有架构。”温杰点开一张图,“目前我们是单机部署,apache+php+mysql,做了基础的读写分离。sp接口这块,我写了一个独立的验证模块,走的是移动的普通通道,计费回调加入了ip白名单和签名验证......”
温杰讲得很顺,语速不快,但条理清晰。从资料库结构讲到缓存策略,从负载均衡的初步方案讲到自研的a/b测试模块雏形。虽然全程没有看稿,中间却毫无停顿。
周明一边听一边微微点头,偶尔在笔记本上记两笔。林峰盯著屏幕,手指在膝盖上轻轻轮敲著,仿佛是在模擬代码逻辑。王哲翻著那沓纸,时不时抬头看一眼温杰。
十五分钟后,温杰讲完,垂下手臂,正好跟低低的太阳消失在云层后是同一时间,他们身后那片方形的大光块也消失了。会议室里安静了几秒。
周明合上笔记本,看著温杰:“那个a/b测试模块,是你自己写的?”
“嗯,刚搭好一个框架,还是了参考了国外案例做的,想用来对比不同文案的转化率,能不能做成还不知道呢。”
周明难得地露出一丝笑意:“有想法。总部很多项目组,做了一年都没把这东西落地。”
温杰笑了笑,有些不好意思。
林峰看了看周明,不太確定该不该站起来,最后还是决定坐著。“温工,你刚才说的资料库拆分,现在到什么程度了?”
“表结构已经分好了,”温杰切出三张表格结构图,“包含了用户库、订阅库,和內容库三套,但跨库查询还没优化,目前是用应用层做聚合。比如说,要查某个用户订阅了哪些內容,需要先查询订阅库拿到內容id,再去內容库获取详情。这个逻辑现在写在php代码里,循环查询,效率肯定会有影响。”
林峰皱起眉头,手指在膝盖上敲得更加用力了:“这个聚合层早晚会成为瓶颈。等用户量上百万,一次请求可能要触发几十次子查询,响应时间会指数级上升。”
“是这样的。”温杰说,“所以我正在考虑引入缓存,把热门数据先预热到內存里,减少实时查询。”
【写到这里我希望读者记一下我们域名 101 看书网书库多,.??????任你选 】
“缓存是个方向,”王哲开口说,“但缓存策略怎么设计?是全量缓存还是按需?失效机制怎么定?这些都得提前想好,不然到时候缓存穿透、雪崩,比资料库慢还要麻烦。”
“呃......”温杰吞了口口水。韩非看见他的额头上滚下一颗汗珠,显然这些问题他还没细想过。
“不急。”韩非微笑说,“这几位过来就是为了帮我们的。这些问题你可以和几位一起推演。”
韩非看向周明。周明点了点头:“没错。你先说说你的id生成策略,怎么保证唯一性的?”
温杰吸了口气,切换到另一张图:“我用的是时间戳加机器码,再加上自增序列的组合。时间戳精確到毫秒,机器码是固定的,自增序列我放在memcached里做原子递增。因为目前是单机部署,所以机器码写死了,序列號靠memcached的incr命令来获取。如果以后要扩展到多机,机器码就需要动態分配,这个机制还没开始做。”
“如果memcached掛了怎么办?”林峰问。