一、B2B平台清算目标:

能快四支撑各类B端价格业务, 减少新业务接入的研发成本和周期, 搭建拥有B 类自身业务特色的统一平台, 并对外提供统一的B类价格业务。

B2B价格平台目前不仅仅支持的价格类型(级别价、阶梯价、协议价、VIP价、一口价、市场价、零售价、批发价),此外还支持:区域价、区域级别价、区域阶梯价等价格类型;平台支撑了大业务线:分销、大客户.

二、平台建设-架构

平台分别由CBI(价格服务中心)、SYNC(异步组件)、SVR(平台服务)、DAL(数据访问层)、RPC(外部服务依赖层)、数据持久(储存层)六大模块组成。

· 数据持久层:数据库采用Mysql,由于数据量大,借助公司Gum(弹性数据库)实现分库存储和查询。由于价格接口访问量大,接口效应时间和可用率和并发性要求高,数据查询将不直接查询数据库,通过缓存实现。缓存分为两种:本地缓存Ehcache和分布式缓存Redis,其中Redis使用公司统一缓存服务Jimdb,减少维护成本,查询服务首先查询本地缓存,未命中则查询redis缓存。为了解决分库后,批量价格查询跨库问题,引入Es集群。数据库与缓存(EhcacheRedis)、ES集群、Hbase间数据同步使用BinLake管道减少数据延迟。Hbase集群用于记录价格变化历史归档信息。

· DAL(数据访问层):价格服务中心与数据层间的通讯管道,提供统一的数据访问服务。为了满足未来价格数据的增量,价格底层数据采用分库,根据业务路由字段访问具体的数据库。

· RPC(外部服务依赖层):负责与外部依赖接口交互,如:主站仓报价、legendshop商城平台价、POP价格、B2B任务引擎、返利系统等。

· SVR(平台服务):负责完成平台服务组装。

· CBI(价格服务中心):由publish服务、pick服务、异步组件组成。其中:

· Publish服务:支持价格发布服务(写服务),包括:价格设置、价格清零、价格限量(数量增、减)等。

· Pick查询服务:统一价格查询服务,经过流程编排计算、数据格式转换返回指定价格类型数据。流程编排,针对于不同大客户的合同类型(折扣价、实时价、legendshop商城平台价、稳定协议价、较低协议价、较低实时价)计算、组合出不同的价格。

· Publish服务、pick服务独立部署,避免读、写服务间互相影响。

价格服务中心的接口需提供JSFHTTPS两种不同的调用方式,以此便于适应不同的外部调用场景。

· SYNC(异步组件):由MQWorker组成,其中:

· MQ组件。负责MQ的接收、发送。接收的MQ,如:POP价格变化MQ(新通路POP商品)、legendshop商城平台促销价格变化MQ(大客户),平台价格变化MQ发送;

· Worker组件。完成历史数据归档、缓存同步、数据清写和纠正;由B2B任务引擎执行统一调度;

上图流程展示了整个平台的数据流向,平台B2B-PRICE-SYNC接收到Binlake变更消息后,调用B2B-PRICE-SVRB2B-PRICE-DAL服务。B2B-PRICE-DAL层将开启多线程分别完成对异步数据源JimdbHbaseEs集群的异步写,如果Jimdb集群写成功则,发送MQ消息通知Ehcache集群进行数据更新,仅当JimdbHbaseEs集群全部写成功后,再由B2B-PRICE-SYNC对外统一发送价格平台变更MQ消息通知外部系统。如果B2B-PRICE-SYNC调用底层重试3次(保持幂等性)失败,则把数据写入任务引擎,由引擎调度延迟重试。

平台建设中接入了公司的Binlake系统,下面简单介绍下组成Binlake系统的三大服务组件:

· Wave服务 Wave服务完成实际的数据库Binary Log的持续采集、管理和分发写入到下游的消息发布和订阅系统中。在BinLake集群中会存在NWave服务,这些Wave服务共同组成一个无状态集群。

· Tower服务 Tower服务是整个BinLake的管理中心,提供BinLake接入服务的申请、完成Wave服务、数据源、接入应用的管理。

· Judge服务

Judge服务主要完成两个功能:Wave节点监控信息采集和loadBalance决策。

ZooKeeper

BinLake使用zookeeper服务进行Wave无状态集群的管理、状态同步和消息通知等。

上图左侧是通过binlake团队提供的工具包解析后的Binlake消息体内容,其中EntryMessage代表一条消息,rowDatas代表Mysql表中变更的行记录(一条消息中可以包含多条记录)。消息体中的EntryType取值:TRANSACTIONBEGINTRANSACTIONENDROWDATAHEARTBEATbinlake内部使用),EventType取值:INSERTUPDATE DELETECREATEALTERERASEQUERYTRUNCATERENAMECINDEXDINDEX

当平台接收到Binlake消息后,将对比消息数据与缓存数据的版本号,如果消息数据版本号大于、等于缓存中数据版本号,则使用消息数据更新JimdbEsHbase集群数据;否则视消息数据为过期数据丢弃(详见上方左图)。一个系统或平台,都不应该完全依赖外部系统,应该有自己的降级方案。当Binlake宕机后,平台分别可以执行MQ降级方案、接口降级方案,以此确保系统不受Binlake宕机影响(详见上方右图)。

价格平台除了发送MQ消息外,还接收外部的MQ消息,详见上图。平台在处理接收到的消息时,为了防止因网络堵塞、系统多实例并发处理速度等因数造成数据错误,在接收到SKU价格变更消息时,首先使用分布式锁对SKU进行加锁,然后调用相应价格接口查询价格,最后与库中数据对比版本号并更新数据,并释放锁。

三、平台建设

平台建设中尝试了公司新的技术、服务、与工具,如JED(GUM)BinlakeJDOS等,节省公司资源、提升了研发效率。

四、经验教训

平台建设中难免会踩到一些坑,分享给大家、希望各位在以后的工作中切勿重蹈覆辙。

1、去掉非必要的参数验证,以此提升性能;

2、尽量减少调用链路长度,节约网络开销;

3、服务接口出、入参数数量尽可能少,减少数据网络传输量,增加系统吞吐量;

4、尽可能储存压缩后的数据,节约储存空间;

5、利用mdc记录日志,系统各层间线程唯一编号(业务请求唯一编号)可采取自顶向下、或自底向上逐级传递,可根据业务场景灵活选择;业务请求唯一编号,便于排查线上问题,提升排查问题效率;

6、系统中,应该尽量配置各种开关,用于接口的升降级、配置参数的动态修改、日志打印级别的动态调整;

7、引入自动化测试工具提升测试效率,节约人力成本。

8、兜底方案。系统上线前,应考虑各种兜底方案,确保系统上线后,即使有问题也做到业务零感知;

经过上述的介绍相信大家对于B2B价格平台有初步的了解,但肯定也会产生各种疑问,欢迎大家来一起www.legendshop.cn讨论。如果文中有不足的地方,请您帮助作者修正避免误导听众,在此先行谢过。