属性 每秒10万吞吐 并发 架构 设计 58最核心的帖子中心服务IMC 类目服务 入口层是Java研发的,聚合层与检索层都是C语言研发的 电商系统里的SKU扩展服务

小结:

1、

海量异构数据的存储问题

如何将不同品类,异构的数据统一存储起来呢?

(1)全品类通用属性统一存储;

(2)单品类特有属性,品类类型与通用属性json来进行存储;

2、

入口层是Java研发的,聚合层与检索层都是C语言研发的

3、

(1)数据库提供“帖子id”的正排查询需求;

(2)所有非“帖子id”的个性化检索需求,统一走外置索引;

4、

定期全量重建索引

5、

为应对100亿级别数据量、几十万级别的吞吐量,业务线各种复杂的复杂检索查询,扩展性是设计重点:

(1)统一的代理层,作为入口,其无状态性能够保证增加机器就能扩充系统性能;

(2)统一的结果聚合层,其无状态性也能够保证增加机器就能扩充系统性能;

(3)搜索内核检索层,服务和索引数据部署在同一台机器上,服务启动时可以加载索引数据到内存,请求访问时从内存中load数据,访问速度很快:

  • 为了满足数据容量的扩展性,索引数据进行了水平切分,增加切分份数,就能够无限扩展性能
  • 为了满足一份数据的性能扩展性,同一份数据进行了冗余,理论上做到增加机器就无限扩展性能

系统时延,100亿级别帖子检索,包含请求分合,拉链求交集,从聚合层均可以做到10ms返回。

https://mp.weixin.qq.com/s/msinJA9T3TR1uWrYx6M1iQ

1万属性,100亿数据,每秒10万吞吐,架构如何设计?

有一类业务场景,没有固定的schema存储,却有着海量的数据行数,架构上如何来实现这类业务的存储与检索呢?58最核心的数据“帖子”的架构实现技术细节,今天和大家聊一聊。

一、背景描述及业务介绍

什么是58最核心的数据?

58是一个信息平台,有很多垂直品类:招聘、房产、二手物品、二手车、黄页等等,每个品类又有很多子品类,不管哪个品类,最核心的数据都是“帖子信息”。

画外音:像不像一个大论坛?

各分类帖子的信息有什么特点?

逛过58的朋友很容易了解到,这里的帖子信息:

(1)各品类的属性千差万别,招聘帖子和二手帖子属性完全不同,二手手机和二手家电的属性又完全不同,目前恐怕有近万个属性;

(2)数据量巨大,100亿级别;

(3)每个属性上都有查询需求,各组合属性上都可能有组合查询需求,招聘要查职位/经验/薪酬范围,二手手机要查颜色/价格/型号,二手要查冰箱/洗衣机/空调;

(4)吞吐量很大,每秒几10万吞吐;

如何解决100亿数据量,1万属性,多属性组合查询,10万并发查询的技术难题呢?一步步来。

二、最容易想到的方案

每个公司的发展都是一个从小到大的过程,撇开并发量和数据量不谈,先看看

(1)如何实现属性扩展性需求;

(2)多属性组合查询需求;

画外音:公司初期并发量和数据量都不大,必须先解决业务问题。

如何满足业务的存储需求呢?

最开始,业务只有一个招聘品类,那帖子表可能是这么设计的:

tiezi(tid, uid, c1, c2, c3);

那如何满足各属性之间的组合查询需求呢?

最容易想到的是通过组合索引满足查询需求:

index_1(c1, c2)

index_2(c2, c3)

index_3(c1, c3)

随着业务的发展,又新增了一个房产类别,存储问题又该如何解决呢?

可以新增若干属性满足存储需求,于是帖子表变成了:

tiezi(tid, uid, c1, c2, c3, c10, c11, c12, c13);

其中:

  • c1,c2,c3是招聘类别属性
  • c10,c11,c12,c13是房产类别属性

通过扩展属性,可以解决存储的问题。

查询需求,又该如何满足呢?

首先,跨业务属性一般没有组合查询需求。只能建立了若干组合索引,满足房产类别的查询需求。

画外音:不敢想有多少个索引能覆盖所有两属性查询,三属性查询。

当业务越来越多时,是不是发现玩不下去了?

三、垂直拆分是一个思路

新增属性是一种扩展方式,新增表也是一种方式,垂直拆分也是常见的存储扩展方案。

如何按照业务进行垂直拆分?

可以这么玩:

tiezi_zhaopin(tid, uid, c1, c2, c3);

tiezi_fangchan(tid, uid, c10, c11, c12, c13);

在业务各异,数据量和吞吐量都巨大的情况下,垂直拆分会遇到什么问题呢?

这些表,以及对应的服务维护在不同的部门,看上去各业务灵活性强,研发闭环,这恰恰是悲剧的开始:

(1)tid如何规范?

(2)属性如何规范?

(3)按照uid来查询怎么办(查询自己发布的所有帖子)?

(4)按照时间来查询怎么办(最新发布的帖子)?

(5)跨品类查询怎么办(例如首页搜索框)?

(6)技术范围的扩散,有的用mongo存储,有的用mysql存储,有的自研存储;

(7)重复开发了不少组件;

(8)维护成本过高;

(9)…

画外音:想想看,电商的商品表,不可能一个类目一个表的。

四、58的玩法:三大中心服务

第一:统一帖子中心服务

平台型创业型公司,可能有多个品类,各品类有很多异构数据的存储需求,到底是分还是合,无需纠结:基础数据基础服务的统一,是一个很好的实践。

画外音:这里说的是平台型业务。

如何将不同品类,异构的数据统一存储起来呢?

(1)全品类通用属性统一存储;

(2)单品类特有属性,品类类型与通用属性json来进行存储;

更具体的:

tiezi(tid, uid, time, title, cate, subcate, xxid, ext);

(1)一些通用的字段抽取出来单独存储;

(2)通过cate, subcate, xxid等来定义ext是何种含义;

(3)通过ext来存储不同业务线的个性化需求

例如:

招聘的帖子,ext为:

{“job”:”driver”,”salary”:8000,”location”:”bj”}

而二手的帖子,ext为:

{”type”:”iphone”,”money”:3500}

帖子数据,100亿的数据量,分256库,通过ext存储异构业务数据,使用mysql存储,上层架了一个帖子中心服务,使用memcache做缓存,就是这样一个并不复杂的架构,解决了业务的大问题。这是58最核心的帖子中心服务IMC(Info Management Center)。

画外音:该服务的底层存储在16年全面切换为了自研存储引擎,替换了mysql,但架构理念仍未变。

解决了海量异构数据的存储问题,遇到的新问题是:

(1)每条记录ext内key都需要重复存储,占据了大量的空间,能否压缩存储;

(2)cateid已经不足以描述ext内的内容,品类有层级,深度不确定,ext能否具备自描述性;

(3)随时可以增加属性,保证扩展性;

解决完海量异构数据的存储问题,接下来,要解决的是类目的扩展性问题。

第二:统一类目属性服务

每个业务有多少属性,这些属性是什么含义,值的约束等,耦合到帖子服务里显然是不合理的,那怎么办呢?

抽象出一个统一的类目、属性服务,单独来管理这些信息,而帖子库ext字段里json的key,统一由数字来表示,减少存储空间。

画外音:帖子表只存元信息,不管业务含义。

如上图所示,json里的key不再是”salary” ”location” ”money” 这样的长字符串了,取而代之的是数字1,2,3,4,这些数字是什么含义,属于哪个子分类,值的校验约束,统一都存储在类目、属性服务里。

画外音:类目表存业务信息,以及约束信息,与帖子表解耦。

这个表里对帖子中心服务里ext字段里的数字key进行了解释:

(1)1代表job,属于招聘品类下100子品类,其value必须是一个小于32的[a-z]字符;

(2)4代表type,属于二手品类下200子品类,其value必须是一个short;

这样就对原来帖子表ext扩展属性:

{“1”:”driver”,”2”:8000,”3”:”bj”}

{”4”:”iphone”,”5”:3500}

key和value都做了统一约束。

除此之外,如果ext里某个key的value不是正则校验的值,而是枚举值时,需要有一个对值进行限定的枚举表来进行校验:

这个枚举校验,说明key=4的属性(对应属性表里二手,手机类型字段),其值不只是要进行“short类型”校验,而是value必须是固定的枚举值。

{”4”:”iphone”,”5”:3500}

这个ext就是不合法的,key=4的value=iphone不合法,而应该是枚举属性,合法的应该为:

{”4”:”5”,”5”:3500}

此外,类目属性服务还能记录类目之间的层级关系:

(1)一级类目是招聘、房产、二手…

(2)二手下有二级类目二手家具、二手手机…

(3)二手手机下有三级类目二手iphone,二手小米,二手三星…

(4)…

类目服务解释了帖子数据,描述品类层级关系,保证各类目属性扩展性,保证各属性值合理性校验,就是58另一个统一的核心服务CMC(Category Management Center)。

画外音:类目、属性服务像不像电商系统里的SKU扩展服务?

(1)品类层级关系,对应电商里的类别层级体系;

(2)属性扩展,对应电商里各类别商品SKU的属性;

(3)枚举值校验,对应属性的枚举值,例如颜色:红,黄,蓝;

通过品类服务,解决了key压缩,key描述,key扩展,value校验,品类层级的问题,还有这样的一个问题没有解决:每个品类下帖子的属性各不相同,查询需求各不相同,如何解决100亿数据量,1万属性的检索与联合检索需求呢?

第三:统一检索服务

数据量很大的时候,不同属性上的查询需求,不可能通过组合索引来满足所有查询需求,“外置索引,统一检索服务”是一个很常用的实践:

(1)数据库提供“帖子id”的正排查询需求;

(2)所有非“帖子id”的个性化检索需求,统一走外置索引;

元数据与索引数据的操作遵循:

(1)对帖子进行tid正排查询,直接访问帖子服务;

(2)对帖子进行修改,帖子服务通知检索服务,同时对索引进行修改;

(3)对帖子进行复杂查询,通过检索服务满足需求;

画外音:这个检索服务,扛起了58同城80%的请求(不管来自PC还是APP,不管是主页、城市页、分类页、列表页、详情页,最终都会转化为一个检索请求),它就是58另一个统一的核心服务E-search,这个搜索引擎,是完全自研的。

对于这个内核自研服务的搜索引擎架构,简单说明一下:

为应对100亿级别数据量、几十万级别的吞吐量,业务线各种复杂的复杂检索查询,扩展性是设计重点:

(1)统一的代理层,作为入口,其无状态性能够保证增加机器就能扩充系统性能;

(2)统一的结果聚合层,其无状态性也能够保证增加机器就能扩充系统性能;

(3)搜索内核检索层,服务和索引数据部署在同一台机器上,服务启动时可以加载索引数据到内存,请求访问时从内存中load数据,访问速度很快:

  • 为了满足数据容量的扩展性,索引数据进行了水平切分,增加切分份数,就能够无限扩展性能
  • 为了满足一份数据的性能扩展性,同一份数据进行了冗余,理论上做到增加机器就无限扩展性能

系统时延,100亿级别帖子检索,包含请求分合,拉链求交集,从聚合层均可以做到10ms返回。

画外音:入口层是Java研发的,聚合层与检索层都是C语言研发的。

帖子业务,一致性不是主要矛盾,E-search会定期全量重建索引,以保证即使数据不一致,也不会持续很长的时间。

五、总结

 

文章写了很长,最后做一个简单总结,面对100亿数据量,1万列属性,10万吞吐量的业务需求,可以采用了元数据服务、属性服务、搜索服务来解决:

  • 一个解决存储问题
  • 一个解决品类解耦问题
  • 一个解决检索问题

任何复杂问题的解决,都是循序渐进的。

思路比结论重要,希望大家有收获。

原文地址:https://www.cnblogs.com/yuanjiangw/p/10801152.html

时间: 2024-08-05 20:17:09

属性 每秒10万吞吐 并发 架构 设计 58最核心的帖子中心服务IMC 类目服务 入口层是Java研发的,聚合层与检索层都是C语言研发的 电商系统里的SKU扩展服务的相关文章

中小型电商系统商品属性设计与实现

这两年做过不少的小型电商系统,有的卖衣服,有的卖鞋子,有的卖电器,甚至还有些卖虚拟服务的.不同商品的属性千差万别,为了减少以后卖xxx的电商系统的工作量,特将属性系统做成通用版的. 设计思路如下: 1.可自定义的无限级商品类别. 2.各类别可自定义属性,属性的类型有:普通文本.数字.价格.单项选择.多项选择.日期.文本域.富文本.图片.布尔值等,添加商品时自动加载所需的组件. 3.支持公共属性. 4.支持属性继承,即子类别自动继承父类别的属性,并支持覆盖父类别同名属性. 5.支持属性值验证,添加

幂等和高并发在电商系统中的使用

在Java web项目开发中,经常会听到在做订单系统中生成订单的时候,要做幂等性控制和并发控制,特对此部分内容作出总结,在高并发场景下,代码层面需要实现并发控制:但是幂等性,其实更多的是系统的接口对外的一种承诺,承诺一次请求和多次请求会返回同样的数据.关于幂等性将分别从高等代数中的幂等性.HTTP中的幂等性和订单生成系统中的幂等性阐述:并发性控制则提供了分布式锁等方式来对并发场景进行代码实现. 一.幂等性 idempotence  ['a?d?mpo?t?ns] 1.高等代数中关于幂等idemp

案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?

出自:http://1t.click/7TJ 目录: 案例背景引入 特殊的电商大促场景 抗住大促的瞬时压力需要几台机器? 大促高峰期订单系统的内存使用模型估算 内存到底该如何分配? 新生代垃圾回收优化之一:Survivor空间够不够 新生代对象躲过多少次垃圾回收后进入老年代? 多大的对象直接进入老年代? 别忘了指定垃圾回收器 今日思考题 1.案例背景引入 按照惯例,我们接下来会用案例驱动来带着大家分析到底该如何在特定场景下,预估系统的内存使用模型. 然后合理优化新生代.老年代.Eden和Surv

优秀的开源电商系统有哪些

信息技术的迅速发展,商家想在众多的电商系统中选择一款合适的并不是那么轻易的事情,那么为了能够让商家在选择上减少时间,小编为你介绍几款好的开源电商系统. ECSHOP电商系统 基于PHP语言及MYSQL数据库构架开发的跨平台开源电商系统,因其强大功能拥有着大批粉丝.ECSHOP开源的电商系统最大的特色之一是功能健全,有着较为全面的商品管理.订单处理.会员管理等功能,其操作简易性更是成为国内多数从事电商行业的企业或个人的首选.ECSHOP是我国较为经典的一款老牌开源电子商务系统. MAGENTO电商

CRMEB电商系统

CRMEB电商系统 西安众邦网络科技有限公司,是在网络信息化时代,移动互联网深刻地影响和改变企业命运的大趋势下,应运而生的一家高端专业的互联网应用开发公司.自公司成立以来,始终以技术为核心,服务为宗旨!已为上百家知名企事业单位提供了高品质互联网应用服务.其中包含:延安统战部.延安共青团.白鹿制药.陕西粮农.一汽大众.奥克斯.老凤祥.金牛乳业.中国铁建.西安电影公司.西古光通.亿丰置业.长九实业.明威实业.安得制药.力邦集团等.涉及×××.汽车.医疗.餐饮.影视.政府机构等三十多个行业. 这套系统

电商系统架构——系统鸟瞰图

在看到图(一)这样的图,我们是否有一种探究系统的冲动?这样一个花花绿绿的界面,背后隐藏着什么样的奥秘!用户输入某个域名的时候,比如www.taobao.com的时候,页面是如何展示的,用户在搜索框搜宝贝的时候,系统又是如何处理的,用户在参加秒杀活动的时候,系统又是如何处理的.经过两年多的互联网从业经验,以及自己的思考,在这里我就抛砖引玉对电商系统架构进行探究,探究系统是如何设计的,以及设计这个系统的各种权衡. 图(一) 隐藏在花花绿绿的界面之后,是一个庞大复杂的系统,图(二)是这个系统的鸟瞰图.

电商系统中的商品模型的分析与设计—续

前言     在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介绍. 从SPU.SKU开始     首先我们需要澄清上篇中的这两个概念,在上篇文章中"货品"是指一种概念物品,这种物品并不是一个具体的实物,当它具备具体的属性.价格时,才是一种实物,也就是商品."商品"就是库存中一个具体的实物.例如:iphone6,就是一种货品,但用户

(1)dotnet开源电商系统-brnshop&amp;brnMall 和老外开发的nopCommerce(dotnet两套电商来PK--第一篇)

一直想做电商软件,但是实在不想学PHP了,所以前后关注了这两个开源电商系统.一个是国人出品的,一个据说是俄罗斯人写得(不知道对不对).目前两个开源软件都在学习了解中,以下的博文可能会涉及到这两套系统,我希望能对比进行学习,能互相借鉴和补充. brnshop :http://www.cnblogs.com/wheretime/p/3793979.html  (入门篇:BrnShop开源网上商城第一讲:架构设计) nopCommerce:http://www.cnblogs.com/babieton

电商系统Broadleaf文档翻译(六) - 主要实体main entities

主要实体 原文标题:main entities 原文出处:http://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/data-and-service-models/main-entities 译者:IT十年 译文链接:http://www.ittenyear.com/170/broadleaf-main-entities/ 本译文仅用于学习和交流目的,转载请保留原文链接和译文链接! 产品/商品Product 商品文