Golang+Lua 在京东前端业务系统中最佳实践
2020-02-27 226浏览
- 1.Golang+Lua 在分类列表中 最佳实践 谢刚@JD 2016-10-18
- 2.
- 3.目录 CONTENTS 1 分类列表介绍 2 分类列表架构 3 Golang应用 4 Lua(OpenResty)应用 5 前端优化
- 4.分类列表介绍 分类列表是承接京东用户访问的主要流量之一 分类列表特点 发 商品数量多,分类多 发 业务复杂,不同分类逻辑不一样 发 请求量大 发 实时性要求
- 5.列表页入口
- 6.目录 CONTENTS 1 分类列表介绍 2 分类列表架构 3 Golang应用 4 Lua(OpenResty)应用 5 前端优化
- 7.架构-搜索版架构 Nginx Nodejs Search Service
- 8.架构设计—设计目的 系统架构改造 发 分布式(数据分片、各层水平扩容) 发 高可用(双机房双活部署) 发 响应迅速 发 数据闭环(线上服务不依赖外部API接口) 发 运维便捷(通过配置中心灵活切换集群) 数据提升 发 GMV 发 转化率 发 客单价
- 9.架构设计– 新版架构 Config Center MSG Receiver Nginx+lua Go Cluster2 Go Cluster1 Data Worker MSG Handler GO Jimdb Score Worker Hadoop Mysql Miss Worker
- 10.架构设计– 新版拓扑 Users CDN LVS+Haproxy mjq lf Nginx+Lua Nginx+Lua 平滑切换 平滑切换 Cluster1 Cluster2 Go1 Go2 Jimdb Jimdb Cluster1 Cluster2 Go1 Go2 Jimdb Jimdb MQ MSG Hadoop—Offline 数据模型 排序算法 机器学习 MYSQL Data Worker
- 11.数据处理流程 Hadoop 1 2 MYSQL 3 Go(Offline) 4 4 Go(Online) MQ MSG Data Worker
- 12.Date Worker Score Worker Sku_Log Sku Virt_sku Large_Sku Data Worker API SkuDetail http Stock http Price http Tag JSF FBP JSF SKU
- 13.目录 CONTENTS 1 分类列表介绍 2 分类列表架构 3 Golang应用 4 Lua(OpenResty)应用 5 前端优化
- 14.选择Golang 特性 发 Golang并发能力 发 Golang性能 开源 发 Beego 发 Ffjson 发 redigo
- 15.商品筛选
- 16.主要功能 Loading Data Query Data Update Data
- 17.数据加载 Go Service1 index Go Service2 index Jimdb MYSQL … Go ServiceN index index
- 18.内存数据 Sku 索引数据 字典数据 Brand Publish 分类数据 分类字典数据 分类扩展属性 分类自定义属性 质 量 分 排 序 数 组 销 量 排 序 数 组 价 格 排 序 数 组 上 架 时 间 数 组 Large limit
- 19.数据查询 查询 解析参数 过滤sku 聚合属性 Mget 获取数据 组装数据 返回
- 20.数据更新 优化前 MSG Receiver MSG Handler 优化后 MSG Receiver QUEUE MSG Handler
- 21.Golang – 遇到的坑 一、JSON的序列化性能低下 Golang内置的encoding/json、encoding/gob,采用ffjson 二、GC问题 减少内存对象。减少对象申请,两个作用:减少内存使用,减少内存碎片 三、字符串拼接 尽量使用byte数组,不要用String,由于String会创建新对象 四、Go占用OS内存释放慢 执行:debug.freeOSMemory() 五、Goroutine闪退 goroutine闪退,导致应用进程闪退,异常捕获 六、并发处理map 必须加读写锁(sync.RWMutex)
- 22.目录 CONTENTS 1 分类列表介绍 2 分类列表架构 3 Golang应用 4 Lua(OpenResty)应用 5 前端优化
- 23.选择Lua(OpenResty) Lua优点 1.轻量级 2.协程 3.嵌入式、可调用其他API 4.开发效率 OpenResty OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起的web应用开 发框架 生态 ngx_lua lua-resty-template lua-resty-redis lua-resty-limit-traffic lua-resty-memcached lua-resty-mysql
- 24.主要功能 模板渲染 缓存模块 异常处理 其他
- 25.模板渲染 使用的模板引擎https://github.com/bungle/lua-resty-template Nginx配置
- 26.模板渲染
- 27.缓存 FirstPage Cache1 Nginx+Lua Key Cache OtherPage Cache1 FirstPage Cache2 ... Jimdb OtherPage Cache2 FirstPage CacheN Go Service ... OtherPage CacheN
- 28.异常处理 Nginx Lua 读取缓存 返回html location / 报错 内部跳转 location @static 正常流程 模板渲染 后端接口数据 读取缓存 返回html 有缓存 Nginx配置 展示缓存流程 跳转京东首页 无缓存 报错 location @jd 跳转京东首页 跳转首页流程 28
- 29.其他模块 限流 (lua-resty-limit-traffic) 定时任务(ngx.timer.at) 防爬虫
- 30.目录 CONTENTS 1 分类列表介绍 2 分类列表架构 3 Golang应用 4 Lua(OpenResty)应用 5 前端优化
- 31.优化原则 时间 感觉 0~100ms 很快 100~300ms 有一点点慢 300~1000ms 机械在工作呢 >1000ms 先干点别的吧 >10000ms 不能用了 首屏优先 精简和瘦身页面,首屏优先展示出来 惰性交互 需用户交互的部分惰性加载 惰性执行 能不执行的先别执行,惰性执行 惰性滚屏 滚屏惰性加载
- 32.首屏优先 目的 尽快渲染出页面并达到可交互的状态 方法 1、只生成首屏需要的HTML数据 2、优先获取资源、提前解析 3、优先安排关键网络资源,尽早分派请求并取得页面 4、服务端渲染耗时短,性能才会好
- 33.首屏优先
- 34.惰性交互 定义 惰性交互,即对需用户交互的部分进行惰性加载 目的 提升服务端性能,减少数据传输 方法 品牌只渲染18个品牌 属性筛选只渲染5行
- 35.惰性执行 定义 能不执行的先不执行 目的 页面瘦身,提升渲染时间 方法 1.数据通过Json方式嵌入到页面 2.JS惰性执行渲染 3.减少网络请求
- 36.惰性滚屏 定义 鼠标滑动时加载 目的 节省服务器带宽和压力,提升页面整体渲染时间 方法 用户向下滚动页面时加载 1. 60个商品区域的图片 2. 猜你喜欢 3. 浏览记录 4. 页面尾部
- 37.细节优化工作 页面层 1.将一些JS/CSS资源直接嵌入页面 2.对引入的资源排定优先次序 3.应用JS缓存来存储公有属性和商品信息属性 4.AJAX接口最优调用 网络层 1.DNS预解析 2.减少HTTP重定向 3.使用CDN 把数据放到离用户地理位置更近的地方,可以显著减少每次TCP连接的网络延迟, 增大吞吐量 4.传输压缩过的内容(Gzip压缩) 减少60%~80%文件大小,建议Nginx设置为1-4
- 38.细节优化工作 5. 去掉不必要的资源 任何请求都不如没有请求快,把一些非必须、可异步、可延迟的尽量延迟请求 6. 在客户端缓存资源 对静态资源CSS/JS或变化不频繁的HTML块放到前端localstorage 7. 并行处理请求和响应 请求和响应的排队都会导致延迟,无论是客户端还是服务器端 8. 无状态域名 减少请求的HTTP首部数据 Cookie 是额外负担 如列表页依赖的价格、库存接口,采用3.cn无状态域名 9. 域名分区 浏览器同时只能打开6个连接池 如:对图片进行域名分区调用http://img10.360buyimg.com/http://img11.360buyimg.com/http://img12.360buyimg.com/http://img13.360buyimg.com/http://img14.360buyimg.com/
- 39.细节优化工作 10. 拼合和连接 多个JavaScript 或CSS 文件组合为一个文件 多张图片组合为一个更大的复合的图片 11. 服务端写相关信息到header
- 40.Web性能监控 前端监控的两个方向 用WebKit内核模拟浏览器,定时抓取设定的页面 1.一个中心服务,多个终端服务 2.是否打开正常(请求超时、返回非200) 3.页面HTML关键元素是否丢失,页面是否出现乱码 4.验证规则 前端JS植入监控 1.白屏时间 2.首屏加载时间 3.每个AJAX异步方法调用耗时和请求状态码
- 41.Q&A