速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

京东 618:三大系统防作弊,挑战直面用户的困难

  • 2016-06-17
  • 本文字数:4632 字

    阅读完需:约 15 分钟

京东的前端业务系统发展到今天,已经基本覆盖了京东交易环节的全流程。而今年的 618,除了流量上的考验,还增加了大量个性化数据、动态定价等诸多京东智能卖场所提出的新要求。那么,京东的前端是如何应对的呢?用到了哪些工具和技术呢?

受访嘉宾介绍

尚鑫,京东商城网站移动研发部负责人。2007 年加入京东,见证了京东 IT 系统演进的全过程,先后负责京东多个核心系统,熟悉大流量高并发系统架构设计。

InfoQ:晨总(京东集团 CTO 张晨)提到,今年 618 大促“PC 端大部分活动都是由京东大脑来支持的”,对于用户来说,很多数据都是个性化的。请您讲一下,对于首页来说,哪些数据是由京东大脑支持的,哪些是人工或半自动化设置的。对于不同类型的数据,处理的方式有何种不同?

尚鑫:首页对用户个性化概念是在 2014 年首页改版的时候提出的。随着近两年京东对大数据的运用以及京东大脑的成熟,今年 618 期间将由智能卖场为用户提供更加精准的品牌个性化推荐。

针对不同用户,在区域进行对首页各楼层下商品的分区域展示、广告的分区域投放、今日推荐、猜你喜欢,以及 618 期间的品牌盛典,都进行了针对用户粒度的个性化商品推荐以及活动推荐。

对于一些楼层活动入口以及频道列表入口目前多采用排期自动更换的半自动化设置来满足业务人员对于首页运营的需求。

对于个性化数据的展示一般多采用前端异步实时调用的方式来获取个性化数据,做到了粒度为每个 PV 的实时商品运算。人工运营的部分以时间为单位由后端系统提前生成好展示给用户。

InfoQ:作为大型电商网站,京东的页面有很多种,如首页、单品页等。请您讲一下目前京东页面的种类,并举例说明针对不同页面的特点,分别采用了怎样的架构,遵循的原则是什么?

尚鑫:承载用户浏览、导购商品的页面主要为首页、频道页、列表页、单品页。它们各自的功能如下:

  • 首页是京东的门面承载着整个京东所有业务体系以及重大活动(如 618)的流量入口。
  • 频道页作为用户场景化、内容化导购的入口为用户展示商品以及活动。
  • 列表搜索页则以类目和关键词为用户提供精准的单品入口导流。
  • 单品页则作为用户购买商品前的最后一个商品展示环节为用户展示商品的所有信息细节。

从页面的流量特点上来说,首页和频道页的访问都较为集中,而列表搜索页和单品页则体现为长尾和分散。所以针对不同的流量和展示特点系统架构层面也存在着很大的差别。

首页系统作为门面对于页面的响应时间和首屏速度有着极高的要求,所以在进行设计的时候我们将首页进行了碎片化的处理,根据业务场景以及优先级将首页切分成了若干碎片并引入了 BigPipe 的概念来提升页面加载速度增强用户访问体验。对于可进行静态化的部分通过静态化的处理减少后端运算提升处理速度。页面上的 css/js、dns 预解析等方面也做了相应的优化来提升用户访问速度。

与首页流量特点形成鲜明对比的单品页访问分散并且长尾,在架构设计上考虑更多的是对于系统间依赖的解耦、对于差异较大的垂直业务的支持以及亿级商品数据的存储和展示。

所有的网站前台系统在设计上都会遵循数据闭环、动静分离、异步化、无状态、水平扩展几个原则进行设计保证系统的稳定性、扩展性以及对于业务瞬息万变的响应。

InfoQ:首页承载了大量二级页面的入口,那么首页的这些数据是采用怎样的方式加载的?采用了哪些技术来保证快速高效地处理这些数据?目前,京东的前后端是否已经完全分离?是否有中间层?

尚鑫:目前首页前后端已经完全分离,首页的数据维护以及各下级页面入口都是通过 CMS 系统后台来完成内容搭建维护的。各个业务系统数据更新通过消息的方式通知到中间层来实现数据更新、加工最后同步到前台展示层。像首页的非个性化数据一般是已经预先排期生成好的,所以除非遇到紧急的临时更新一般情况下首页的数据更新是非常高效实时的不会存在延迟的情况。

InfoQ:商品详情页的数据,尤其是价格方面的数据是非常重要的,对于数据的处理遵循哪些原则?采用了哪些技术来保证数据的准确性?另外,智能卖场提到此次 618 大促活动中会植入动态定价,前端是如何对此进行保障的?

尚鑫:商品详情页的数据来自于多个业务系统。数据的闭环、消息化、异步化三个原则是保证商品详情页稳定高效的基石。

每分钟几十万次的商品信息操作更新通过消息的方式通知到商品详情页系统再由系统将页面展示所需的数据异构到本地进行闭环处理最后展示给用户。

对于价格、库存这种重要实时性要求高而且敏感的数据采用异步的方式实时获取从而保证展示的准确性。

InfoQ:为了备战今年的 618 大促,京东针对 618 的压测方案有哪些?压测的数据是怎样设定的?具体采用了哪些技术?是如何进行压测的?

尚鑫:由于网站系统读大于写的特点,一般压测都是为了找到系统的读性能瓶颈。

之前采取的是通过 TCPCopy 的方式进行线上压测,但由于 TCPCopy 的压测方式具有一定的风险性,所以后来放弃了这种方式。现在采用的是从线上 nginx 日志中离线采集访问请求然后处理成压测请求脚本后使用 jmeter 对目标机进行压测。压测一般是看正常情况下的系统访问承载能力的极限、异常请求下的系统容错能力和系统承载能力以及自我恢复能力。

压测的数据根据以往系统日常流量和峰值流量的访问来进行压测基数的设定,然后在此基础上进行成倍的增加请求,并通过性能监控系统辅助,来找到系统的性能拐点以及承载的极限点。而异常压测则是将系统依赖的服务进行干扰模拟接口服务不稳定或不可用的情况下系统容错能力和稳定性。

压测后根据两种场景的结果来对系统进行优化提升性能和对缺陷进行改造提升稳定性。

InfoQ:为了实时了解 618 大促的情况,前端是否有相应的监控平台?具体的功能是什么?采用了哪些技术实现的?

尚鑫:监控我们从两方面来做。服务端的监控,京东有统一的监控平台,可以通过它看到系统在服务端的性能表现。而对于在浏览器端展现的页面层面,我们内部有个前端监控系统,主要从以下两个角度对页面进行实时监控:

  • 主动监控,针对页面上的一些异步服务进行延迟、错误主动信息上报,提前发现有问题的服务并采取降级等相关措施。
  • 被动监控,通过抓取设定的样本页面并模拟浏览器的访问来看页面上 dom 元素内容加载情况、页面乱码、接口内容获取失败等问题并进行报警。这种和前端用户访问直接相关的风险点在后端是很难做监控的尤其在页面启用 cdn 后,前端页面的展示和后端完全分离开来这时候就需要一些被动抓取式的监控策略来保证出现。

目前我们对京东流量 Top10000 的页面及其各种临时的促销活动页面进行快速自动抓取。这类页面如果产生错误状态码(404,50x)、页面空白、跳错误页等,就会立即触发报警系统,后台主要使用 NodeJS 异步任务队列定时执行。而针对页面内容的检测通过系统的规则引擎对页面 dom 信息和预期规则进行匹配如果验证错误就会记录错误信息,保存现场快照,然后触发报警机制进行邮件或者短信通知。

InfoQ:在 618 大促过程中,前端是如何对用户的数据进行统计分析的?使用了哪些工具?如何快速筛选出非正常用户并对其进行快速隔离?

尚鑫:我们将从用户可以直接感知的前端业务风控系统进行剖析:

  • 交易订单风控系统

交易订单风控系统主要致力于控制下单环节的各种恶意行为。该系统根据用户注册手机,收货地址等基本信息结合当前下单行为、历史购买记录等多种维度,对机器刷单、人工批量下单以及异常大额订单等多种非正常订单进行实时判别并实施拦截。

目前该系统针对图书、日用百货、3C 产品、服饰家居等不同类型的商品制定了不同的识别规则,经过多轮的迭代优化,识别准确率已超过 99%。对于系统无法精准判别的嫌疑订单,系统会自动将他们推送到后台风控运营团队进行人工审核,运营团队将根据账户的历史订单信息并结合当前订单,判定是否为恶意订单。从系统自动识别到背后人工识别辅助,能够最大限度地保障订单交易的真实有效性。

  • 爆品抢购风控系统

在京东这样的电商平台,每天都会有定期推出的秒杀商品,这些商品多数来自一线品牌商家在京东平台上进行产品首发或是爆品抢购,因此秒杀商品的价格会相对市场价格有很大的优惠力度。但这同时也给黄牛带来了巨大的利益诱惑,他们会采用批量机器注册账号,机器抢购软件等多种形式来抢购秒杀商品,数量有限的秒杀商品往往在一瞬间被一抢而空,一般消费者却很难享受到秒杀商品的实惠。针对这样的业务场景,秒杀风控系统这把利剑也就顺势而出。

在实际的秒杀场景中,其特点是瞬间流量巨大。即便如此,“爆品抢购风控系统”这把利剑对这种高并发、高流量的机器抢购行为显示出无穷的威力。目前,京东的集群运算能力能够到达每分钟上亿次并发请求处理和毫秒级实时计算的识别引擎能力,在秒杀行为中,可以阻拦 98% 以上的黄牛生成订单,最大限度地为京东的正常用户提供公平的抢购机会。

  • 商家反刷单系统

随着电商行业的不断发展,很多不轨商家尝试采用刷单、刷评价的方式来提升自己的搜索排名进而提高自家的商品销量。随着第三方卖家平台在京东的引入,一些商家也试图钻这个空子,京东很早就提出了对此类行为的“零容忍”原则,为了达到这个目标,商家反刷单系统也就应运而生。

商家反刷单系统利用京东自建的大数据平台,从订单、商品、用户、物流等多个维度进行分析,分别计算每个维度下面的不同特征值。通过发现商品的历史价格和订单实际价格的差异、商品 SKU 销量异常、物流配送异常、评价异常、用户购买品类异常等上百个特性,结合贝叶斯学习、数据挖掘、神经网络等多种智能算法进行精准定位。而被系统识别到的疑似刷单行为,系统会通过后台离线算法,结合订单和用户的信息调用存储在大数据集市中的数据进行离线的深度挖掘和计算,继续进行识别,让其无所遁形。而对于这些被识别到的刷单行为,商家反刷单系统将直接把关联商家信息告知运营方做出严厉惩罚,以保证京东消费者良好的用户体验。

前端业务系统发展到今天,已经基本覆盖了京东交易环节的全流程,从各个维度打击各种侵害消费者利益的恶意行为,几年时间,成绩斐然。

InfoQ:为了保障 618 大促的顺利进行,前端做了哪些预案?在何种情况下回启动这些预案?启动的方式是怎样的?

尚鑫:由于前端系统调用了众多业务系统的接口服务,所以我们的预案大多会集中在对于前端调用接口的治理上。

我们开发了前端使用的“三峡系统”来为前端系统提供接口的监控、降级、切换一站式服务。“三峡”,顾名思义就是作为一个总闸来控制所有前端系统对接口的调用和内容展示。从接口的性能、可用性、数据正确性几个方面进行监控,并提供便捷的降级和切换功能。这样可以保证一旦监控发现依赖的接口服务性能或可用性下降,我们就可以一键式从后台对接口服务进行降级、切换处理保证前台页面展示。

InfoQ:京东的前端团队是如何分工的?在 618 大促期间是如何保障团队内部的高效沟通与合作的?与其他部门又是如何协作的?

尚鑫:目前京东前端团队主要负责京东商城的网站前台系统建设。团队主要根据业务线进行垂直划分。但团队的内部沟通并不会影响团队的沟通效率和合作。用户的每一次访问、每一个点击,都会将每个团队串在了一起。

我们的内部沟通不拘泥于任何形式,只要有问题出现大家就会聚在一起进行讨论,并形成一个可执行的方案进行推进。

对于外部,由于我们是处在系统链的最前端,所以我们会建立主动沟通机制,和各个团队进行随时随地的沟通,来预防和解决任何可能出现影响用户体验的问题。同时,由于我们部门所负责的各个系统全部面向客户,有任何的小问题都会严重影响到客户体验。因此,我们也建立了问题快速响应的专职团队,负责及时解决客户反馈的任何问题。将用户体验的损失降低到最低。

2016-06-17 21:575042
用户头像

发布了 28 篇内容, 共 17.3 次阅读, 收获喜欢 29 次。

关注

评论

发布
暂无评论
发现更多内容

微服务稳定性保障

穿过生命散发芬芳

微服务 10月月更

今日国庆,祝福祖国!【文末超级福利】

图灵社区

读书 国庆节

COSCon'22主论坛来袭 开源站在十字路口

开源社

戏说系统安全(50/100)

hackstoic

系统安全

16个分论坛出品标准大揭秘,期待你的申请!

开源社

Go学习之路-1.认识GO语言

子不语Any

Go 后端 10月月更

【LeetCode】重新格式化电话号码Java题解

Albert

LeetCode 10月月更

ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)

矜辰所致

蓝牙 ESP32-C3 10月月更 GATT

【一Go到底】第一天---初识Goooooooooooooooooooooooo

指剑

Go go并发 10月月更

面试官:高并发场景下,你们是怎么保证数据的一致性的?

一灯架构

Java MySQL 10月月更

用任意类型编写代码——一文带你了解泛型编程

宇宙之一粟

Java 泛型编程 10月月更

大数据ELK(十):使用VSCode操作猎聘网职位搜索案例

Lansonli

ELK 10月月更

mysql中的事务隔离级别序列化如何实现

知识浅谈

MySQL 隔离级别 10月月更

架构师的十八般武艺:线上运维

agnostic

运维

开发者有话说|程序猿工作多年之后的感悟

慕枫技术笔记

个人成长

体验 Orbeon form PE 版本提供的 JavaScript Embedding API

汪子熙

Java SAP commerce 10月月更 oberon

《零代码教练指南》正式发布

明道云

今日国庆,祝福祖国!【文末超级福利】

图灵教育

读书 国庆节

存储优化--分区与冷热分离

喵叔

10月月更

【从0到1学算法】1. 如何获取题中关键信息

Geek_65222d

10月月更

简述构建微服务架构的四大挑战

穿过生命散发芬芳

微服务 10月月更

Qt解压带有密码的加密文件

中国好公民st

c++ Qt Company 10月月更

Spring Boot 集成 Redis 配置 MyBatis 二级缓存

微枫Micromaple

redis 缓存 mybatis springboot 10月月更

跟随一组图片,了解Go Channel的底层实现

董哥的黑板报

Go 后端 服务端 操作系统 runtime

2022-10-01:给定一个字符串 s,计算 s 的 不同非空子序列 的个数 因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。 字符串的 子序列 是经由原字符串删除一些(也可能不删除

福大大架构师每日一题

算法 rust 福大大

MyBatis学习笔记之JDBC

薛定谔的猫

mybatis JDBC 10月月更

OpenHarmony如何控制屏幕亮度

坚果

OpenHarmony 10月月更

一起玩OptaPlanner-Study,玩转第一个程序

积木思维

[架构实战] 学习笔记二

爱学习的麦子

Python应用之计算三角形面积

梦笔生花

10月月更 Python代码 计算三角形面积

数组操作の旋转二维数组

掘金安东尼

算法 10月月更

京东618:三大系统防作弊,挑战直面用户的困难_语言 & 开发_韩婷_InfoQ精选文章