Golang在京东列表页实践总结
Golang在京东列表页实践总结
作者:张洪涛
10余年软件开发和设计经验,曾就职于搜狐、搜狗、前matrixjoy公司联合创始人、甘普科技CTO。
目前线上状态
基于搜索实现;
全量数据,搜索结果不理想;
接口响应时间长,影响了用户体验;
没法针对数据做二次优化;
转化率相对较低;
基于以上原因,需要做出改变,所以就需要对老进行重构,如下
重构版本
非全量数据,线下异步根据数据模型进行进行筛选部分最优数据;
要求时时过滤计算,接口相应时间要快,保证用户体验;
数据进行优化,提高转换率,提搞GMV;
为何选择golang
golang语言强大的并发能力;
与C相媲美的性能,新版对cpu计算要求较高;
基于以上两点,所以选择了golang语言作为服务端计算使用的语言。
重构后的架构图
解释下架构图各个模块功能
Nginx+Lua: 用来渲染页面,拿到go计算服务的json数据渲染到页面端,最终呈现给终端用户;
Config Center 是用来协调worker、lua服务以及go计算服务的控制中心;
Score Worker、Data Worker 是一个用来线下异步计算数据的2个worker,从数据平台拿到数据加上各种数据模型计算最优数据,计算完成后会通知 Config Center,同时数据会进入DB,进行持久化;
深 黄色部分是go计算服务,只要分2个集群,一个线上集群、一个线下集群,异步计算服务根据配置中心选择一个线下集群进行数据计算,计算完成后会通知 Config Center,然后相应的线下集群会进行数据预加载到分片的redis以及go计算服务的各个节点中,然后线下集群准备就绪,可以随时切到线上提供服务;
MQ Worker是一个处理消息的服务,主要包括sku上架、下架、库存变动、以及价格变动等消息;
Msg Receiver 接受到MQ worker的消息后进行消息处理,然后发送的go计算服务的各个节点中;
线上部署的多个机房,避免单机房故障;
数据处理流程如下图所示:
上图是一个完整的数据处理流程,整个流程中最核心的部分是架构图中的Config Center,数据流程中的每一步操作都依赖于配置中心。所以整个架构中配置中心非常重要。
内存计算模型图
简单介绍下计算过程:
解析页面传过来的参数,整理成相应的结构体;
格式化的结构体,比如品牌、价格、sku属性、库存、产品标签、排序类型等;
通过格式化的结构体进行内存中计算,包括过滤、排序等计算操作;
计算完成后会拿到当前页面需要的产品ids;
然后通过id列表获取到产品的详细信息,并对产品属性过过滤;
最终把结构化的json数据返回给lua,进行页面渲染;
内存计算数据结构
如下图所示:
以 上结构是go的一个结构体,包括了页面上所有要进行计算的属性,后续所有的内存中计算过滤、排序都是基于此结构体进行,每个商品对应一个相应的结构体,每 个分类大约有几万个商品,内存中也有对应的结构体。这些结构体是在数据异构完成后,数据预先加载内存,避免在提供服务的时候再去初始化。
开发过程中遇到的问题
遇到2个比较严重的问题:
Golang自身序列化性能低下
GolangGC困扰
针对第一个序列化、反序列化问题,我们尝试过golang内置的encoding/json、encoding/gob两种方式,但是效果都特别不理想,耗费cpu过多,qps 一直上不去。
后来请教beego作者的谢大同学,给推荐了ffjson,也亲自写了一些测试ffjson的代码,最终ffson以3倍优势完胜golang内置json序列化,所以最后采用了ffjson。
第二个问题,golang GC问题,相信不少同学在开发的过程中也遇到过这个问题,其实我们认真分析,发现GC时候很大部分时间是浪费的Marking阶段,所以我们可以从以下几个点优化我们的代码:
减少内存中对象数量
尽量重复内存申请,采用对象池,避免重复申请、释放内存,可以非常有效的减少GC;
开启GODEBUG=gctrace=1,可以非常清晰的看到内存中对象数量、内存使用情况。以及各个阶段的时间开销;
另外可以使用golang内置的性能监控工具pprof包,可以方便得监控到内存、cpu的是使用情况。
Go 技术栈选择
web 框架,采用Asta的beego(http://beego.me)里边的orm部分写的很赞,建议大家仔细读读里边的源码,对lua部分的API设计都 是采用beego现成的MVC设计,可以方便得定义接口,并在路由中配置即可提供服务;具体github地址:http://github.com /astaxie/beego
json序列化,https://github.com/pquerna/ffjson,里边有详细的使用说明文档;
redis:http://github.com/go-redis/redis 在这之上我们内部又对主从操作封装了一层;
转载自:http://studygolang.com/articles/4744
Golang在京东列表页实践总结的更多相关文章
- Atitit.列表页and查询条件的最佳实践(1)------设定搜索条件and提交查询and返回json数据
Atitit.列表页and查询条件的最佳实践(1)------设置查询条件and提交查询and返回json数据 1. 1. 配置条件字段@Conditional 1 1 2. 2. 配置条件字段显示类 ...
- 列表页url参数格式分析【求指教】
运营对列表页url制定静态化模式,与区区观点相悖.遂请大家指教点解. 动态参数包含6个,分别是: 1认证(有机),2品类(水果),3地区(丰台),4状态(众筹中),5排序(评分),6分页 使用状态非常 ...
- 【京东详情页】——原生js爬坑之放大镜
一.引言 在商城的详情页中,放大镜的功能是很常见的.这里京东详情页就要做一个仿放大镜的效果,预览如下: 二.实现原理 实际上,放大镜的实现是单纯用几个div,鼠标移入其中一个小图div,触发事件显示另 ...
- 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)
Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页下 drf中的request和response drf对于django的 ...
- 谈谈yii2-GridView如何实现列表页直接修改数据
作者:白狼 出处:http://www.manks.top/yii2_gridview_advanced.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原 ...
- espcms列表页ajax无限加载
类似百度图片的效果,滚动到底部后,点击加载更多,加载出第二页,第三页... 替代了传统的上一页,下一页,第几页,以达到在某些情况下使得用户体验更好. 二次开发方法: 1.先在模板文件中增加ajax文件 ...
- dedecms讲解-arc.listview.class.php分析,列表页展示
./plus/list.php - 动态展示栏目列表页(也可能是频道封面)arc.listview.class.php 是dedecms的列表页的相关处理类__construct() ...
- 通过angularjs的directive以及service来实现的列表页加载排序分页
前两篇:(列表页的动态条件搜索,我是如何做列表页的)分别介绍了我们是如何做后端业务系统数据展示类的列表页以及动态搜索的,那么还剩下最重要的一项:数据展示.数据展示一般包含三部分: 数据列头 数据行 分 ...
- DEDECMS之三 首页、列表页怎么调用文章内容
一.首页调用 百度了很多,没有找到实际的解决方法,对于直接读取数据库,这种写法不会采取. 后来,仔细考虑,这部分解决的内容不会很多,所以直接使用了简介的内容 方法一(默认长度55) [field:in ...
随机推荐
- TCP中SYN洪水攻击
在查看TCP标识位SYN时,顺便关注了一下SYN Flood,从网上查阅一些资料加以整理,SYN洪水攻击利用TCP三次握手. 1.SYN洪水介绍 当一个系统(客户端C)尝试和一个提供了服务的系统(服务 ...
- 常用获取Android崩溃日志和IOS崩溃日志的几种方法
一:前言 在日常测试app时,经常会遇到崩溃问题,测试快速抓取到崩溃日志可以有效方便开发进行定位,快速解决问题所在测试做到测试分析,定位是非常重要的,这也是判断一个测试能力指标的一大维度. 二:And ...
- 用VBA写一个计算器
着急的 玩家 可以 跳过“============”部分 ======================================可以跳过的 部分 开始==================== ...
- 求一个集合S中m个元素的所有排列以及一个数组A的全排列—递归实现版完整代码
说明,本文全文代码均用dart语言实现. 求一个集合S中m个元素的所有排列情况,并打印,非常适合用递归的思路实现.本文给出了两种实现方法,一种是给定的填充排列数组长度是固定的,一种是可变长度的.两种方 ...
- ubuntu18.04 安装mongodb并使用Robo 3T连接Mongodb数据库
1.前提: 系统:ubuntu18.04 64位 数据库:mongodb GUI:Robo 3T 2018.3.0 描述: mongodb 安装在局域网内的ubuntu的机子上面, 在win 下 ...
- spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现
spring 定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现 依赖包 如下 <dependencies> <depende ...
- 红帽学习笔记[RHCSA] 第九课[文件归档、硬盘、分区以及自动挂载、Swap、链接]
文件归档 tar是什么 通过tar命令可以将大型文件汇集成一个文件(归档),注意没有压缩功能. 压缩方式 gzip 通过gzip过滤文档,使用最广泛 bzip2 通常比gzip压缩小,但是不如gzip ...
- idea 代码部分格式化
效果: 处理Idea使用ctrl+alt+L进行代码格式化时部分代码可以被忽略,不执行格式化功能(webstorm,phpstorm同理) 原因: 有时希望自己写的一些代码不被格式化,或者发现格式化后 ...
- Client does not support authentication protocol requested by server; consider upgrading MySQL client
出现错误 Client does not support authentication protocol requested by server; consider upgrading MySQL c ...
- Self-Driving Database
最近一直在做 ML in Database 相关的工作.偶然发现CMU 19spring的15-721课程竟然专门安排了这个专题,不禁欣喜若狂,赶紧去学习了一下. Andy提出了self-drivin ...