迁移PHP电商⺴⽹网站⾄至GO的节奏
!Zalora South East Asia 架构师 翁伟
Zalora South East Asia
• 2012年初成立
• 东南亚时尚电商
• 新加坡(总部)⻢马来西亚 印尼 香港 越南 泰国 菲律宾 文莱
• 约1000名员工(IT部門约40人)
8月中开始尝试迁移
11月初试上线
目前。。。
• 第一版被rollback
• 部分推倒重来,积极准备第二版重新上线
今天
• 谈谈在此折腾过程中的经验
原有网站架构• 经典LAMP
• 前端网站(Alice)负责商品显示
• Memcached / Solr
• 后端网站(Bob)负责购物⻋车、订单处理等
• MySQL
为何迁移?• 调⽤用memcached非常快,但solr...
• PHP的同步运行模式注定会成为瓶颈
• 射手网对此也有分享:https://bitbucket.org/PinIdea/fcgi_ext/
• 程序员(我!)太闲了
• 第一版仅是试验性项目
• 据说百度很简单,两个⻚页面
• Zalora的前端网站也就是比百度复杂一倍,有四个⻚页面
• 商品目录
• 商品详情
• 购物⻋车
• 支付
实验项⺫⽬目计划
• 把这“四个⻚页面”全部用GO改写了~
• 先把“一个⻚页面”用GO来实现
• nginx分发不同⻚页面至PHP / GO
nginx Alice
memcache
solrAll URLs
BOB
ZRS
Tracking (GA / Webtrekk / etc)
worker
Aliceproduct
cart..
catalog
nginx
Tracking (GA / Webtrekk / etc)
Eve(GO)
memcache
solr
BOB
ZRS
worker
一些前提
数据兼容
• GO对PHP序列化、反序列化支持
• https://github.com/Wuvist/gophpserialize
• https://github.com/Wuvist/gophpserialize/pull/1
⻛风险控制• 新旧两套系统并存,互不影响
• 新版本无需修改任何现有代码
• 独立的新部署
• nginx控制切换
• 随时上线、随时rollback
产品团队的需求
• 商品分类⻚页面浏览体验需改善!
• PM直接说:“我们要AJAX...”
看起来很美
• 有节奏的改进网站
• 改善用户体验,满足产品团队需求
• 实现架构迁移,让技术团队不要太闲
激进的计划
• 原PHP(Alice),拆分为:
• AngularJS (Eve) 前端 MVVM
• GO (Costa) 后端API
去PHP化
• 上AngularJS,前端界面全部用AngularJS渲染
• GO仅提供rest API服务
• 一切都很美好,上线了!
• 直到我膝盖中了一箭
• 直到我尝试分享网站链接去Facebook
OpenGraph
• 用户分享网站链接去Facebook时,Facebook获得的链接信息(title / text / picture)全部都错了
• AngularJS + Go API的架构完全无法处理此情况
• Eve (AngularJS) 阵亡
其他问题
• AngularJS?可以用jQuery么?
• PHP也可以编译的,跟GO一样快~
Costa (GO) 威武!
第二版
• PHP + GO,预期12月上旬上线
• 无AngularJS
经验
• “慢慢来,比较快”
• 去PHP化是不对的~
• 最重要的是团队整体的共识
• 经过折腾⼩小伙伴们都对Go的潜力有了充分认识
• 成立新部門,对后端模块进行迁移
Go可以做的事情很多
• GroupCache (去Memcached)
• 购物⻋车
• 订单处理
• 触发CDN⻚页⾯面过期