京东虚拟业务多维订单系统架构设计

张开涛

2017-07-07 发表于 今年 07-07 10:53 高并发

当年白居易初到长安,拜见大儒顾况,老先生见名曰“长安米贵,居大不易”,当读到白居易所诗“野火烧不尽,春风吹又生”时不禁赞叹“有句如此,居天下有甚难”。

京米平台隶属虚拟平台下基础平台组研发的公共基础服务平台,上承复杂非标品商品模型,下接海量个性化订单数据,为虚拟平台内外设计的所有非标准结构商品提供结构个性化定制、发布、促销、虚拟资产支付、结算、退款及订单汇聚、流动、统计、展示等丰富解决方案,大大降低了电商行业非标准商品的业务开发复杂度。

本期为大家介绍京米平台的重要产品之一虚拟订单中心。

同主站常规实物订单中心一样,京米虚拟订单中心定位于订单数据的汇聚、变更及状态维护等,目前已经聚合了手机充值、加油卡、机票酒店、景点门票火车票、点卡页游等大量虚拟商品和部分非虚拟商品的订单详情数据,同时为京东主站订单中心提供订单展示,对接风控、营销等业务方提供订单数据分析应用等。

虚拟订单中心的核心功能主要围绕数据搬运工(Hamal)产品运行, Hamal是京米依托开源项目研发的MySQL数据库binlog监听产品,在保证高可用的前提下实现了高指标的监听转换过程。

预备小知识1-Binlog binlog是mysql数据库开启Row模式时提供的二进制日志,以binlogEvent形式记录对数据发生或潜在发生更改(事务开启)的SQL语句和数据,类似于oracle数据库的归档日志,可以用来查看数据库的变更历史、数据库增量备份和基于时间点的恢复及Mysql的复制等。

预备小知识2-同步监听原理简单说就是模拟mysql的主从复制过程,先伪造成slave向master库发送COM_REGISTER_SLAVE命令注册客户端,这样master才会发送binlogEvent;接着发送COM_BINLOG_DUMP命令,并指定binlog文件和Position信息,即可从Master库获得包含详细数据的binlogEvent二进制流,binlogEvent包含了所有数据库的事件类型(DDL、DML、TCL、授权等)、库表信息、字段信息和行数据,余下的工作经过过滤、解析、协议反序列化得到想要的订单数据。

COM_BINLOG_DUMP命令格式如下:

-COM_BINLOG_DUMP
    -4byte binlog-pos
    -2byte flags (BINLOG_DUMP_NON_BLOCK see sql/mysql_priv.h)
    -4byte slave-server-id
    -nul-term binlog name

DML的binlogEvent类型如下:

enumLog_event_type {
  /* ...... */
  WRITE_ROWS_EVENT = 23,
  UPDATE_ROWS_EVENT = 24,
  DELETE_ROWS_EVENT = 25,
  INCIDENT_EVENT= 26,
  HEARTBEAT_LOG_EVENT= 27,
  /* ...... */
};

虚拟订单中心的主要架构如下:

Hamal作为虚拟订单中心数据管道的入口,其首要的任务是保证数据库数据变动的精准消费,因此必须谨慎设计binlog的消费记录和异常消费后续处理机制等。

健壮性和高可用 Hamal使用zookeeper集群管理监听实例和记录binlog的消费位置信息。对于目标库,多个Hamal实例在启动时抢占该库的映射节点以获取监听权限,落选的实例则以热备份形式监听zk对应节点binlog位置信息,在遭遇服务不可用或宕机时,迅速通过抢占接力监听服务和binlog信息;Hamal也支持同时监听目标库的多个目标从库,幂等的消费binlog以防止目标库单节点宕机故障。由此,多重防灾机制力保服务的72小时高可用及数据的完备性,目前稳定提供日监听千万行记录,从未抛弃过一条订单。

快消费Hamal采用类似TCP滑动窗口的binlogEvent消费的Get和ACK机制:每次接收批量binlog记录,并行解析数据的变更,发送JMQ消息后确认消费(ACK),以窗口长度作为binlogPosition的增长步调。Hamal通过自产自销MQ消息方式继续驱动订单数据的后续业务处理,后续过程包含数据变更的去重、DML过滤、存储等,同时也可以为风控、营销、订单交易等系统提供个性化数据订阅服务。这样即可以解耦binlog消费环节以加速消费,又可以隔离同步监听服务和业务逻辑。

读写分离Hamal采集的订单数据转换成订单模型后继续流向虚拟订单中心的三重存储介质中:传统Mysql数据库作为原始数据的第一重存储,ES和缓存系统用于数据索引和分析,以实现读写分离。存储订单数据上,DAO模块同样使用消息队列解耦,订单数据存储到数据库后,以自产自销JMQ的形式推送订单数据到ES和缓存系统以轻量化存储过程,减少多级存储间耦合又能够均衡集群负载。

多级搜索作为数据管道出口,订单网关系统(GW)对外提供了可定制模版数据或消息数据订阅、数据分页查询、订单搜索统计等服务,是对接数据应用的关键环节。网关系统实现了非常完备且强悍的多级平滑搜索过程,当订单搜索超时或失败时立刻跳转到下级搜索,降级搜索的结果反补上级数据源;如果虚拟订单中心检索失败,搜索会落地到产品线数据库做最终检索,检索成功则会反补该订单到订单中心的各级存储中,检索失败则必然是单号有误;当虚拟订单服务完全不可用时,网关搜索将直接降级到原产品线生产数据库拉取订单数据。多级检索方案,保证最完善的用户体验!

如今,历经两次技术版本演进和多次618、双十一大促考验的虚拟订单中心,接入的虚拟业务达30+,稳定承载了虚拟平台的核心订单数据,累计订单数据已近10亿,并不断挑战新高,正逐渐成为虚拟商品以及其他非标准商品融入京东电商主体系的重要通道。

读者评论

相关专题

相关博文

  • spring-retry重试与熔断详解—《亿级流量》内容补充

    spring-retry重试与熔断详解—《亿级流量》内容补充

    张开涛 2017-05-02

    本文是《亿级流量》第6章 超时与重试机制补充内容。 spring-retry项目实现了重试和熔断功能,目前已用于SpringBatch、Spring Integration等项目。 RetryOperations定义了重试的API...

    张开涛 2017-05-02
    267 0 1 1
  • #小编推书#一个扣人心弦又趣味横生的侦探缉凶故事

    管理员账号 2017-02-27

    小编说 《算法神探:一部谷歌首席工程师写的CS小说》围绕程序设计典型算法,精心编织了一个扣人心弦又趣味横生的侦探缉凶故事。小说主人公运用高超的搜索技巧和精深的算法知识,最终识破阴谋、缉拿元凶。其间,用二分搜索搜查走私船、用搜索树跟踪...

    管理员账号 2017-02-27
    38 0 0 0
  • 组织架构适配下的敏捷开发

    管理员账号 2017-02-27

    小编说:本文将会讨论如何协调公司内各个工程师团队之间的合作,从而高效地保持系统的弹性和灵活性,以满足敏捷开发的需求。本文选自《Node.js微服务》。 如果一个公司采用微服务来构建软件系统,那么每个干系人都需要参与决策。 微服务...

    管理员账号 2017-02-27
    49 0 0 0