1万属性,100亿数据,每秒10万吞吐,架构如何设计?(2)
解决了海量异构数据的存储问题,遇到的新问题是:
解决完海量异构数据的存储问题,接下来,要解决的是类目的扩展性问题。 第二:统一类目属性服务 每个业务有多少属性,这些属性是什么含义,值的约束等,耦合到帖子服务里显然是不合理的,那怎么办呢? 抽象出一个统一的类目、属性服务,单独来管理这些信息,而帖子库ext字段里json的key,统一由数字来表示,减少存储空间。 画外音:帖子表只存元信息,不管业务含义。 如上图所示,json里的key不再是”salary” ”location” ”money” 这样的长字符串了,取而代之的是数字1,2,3,4,这些数字是什么含义,属于哪个子分类,值的校验约束,统一都存储在类目、属性服务里。 画外音:类目表存业务信息,以及约束信息,与帖子表解耦。 这个表里对帖子中心服务里ext字段里的数字key进行了解释:
这样就对原来帖子表ext扩展属性:
key和value都做了统一约束。 除此之外,如果ext里某个key的value不是正则校验的值,而是枚举值时,需要有一个对值进行限定的枚举表来进行校验: 这个枚举校验,说明key=4的属性(对应属性表里二手,手机类型字段),其值不只是要进行“short类型”校验,而是value必须是固定的枚举值。
这个ext就是不合法的,key=4的value=iphone不合法,而应该是枚举属性,合法的应该为:
此外,类目属性服务还能记录类目之间的层级关系:
类目服务解释了帖子数据,描述品类层级关系,保证各类目属性扩展性,保证各属性值合理性校验,就是58另一个统一的核心服务CMC(Category Management Center)。 画外音:类目、属性服务像不像电商系统里的SKU扩展服务?
通过品类服务,解决了key压缩,key描述,key扩展,value校验,品类层级的问题,还有这样的一个问题没有解决:每个品类下帖子的属性各不相同,查询需求各不相同,如何解决100亿数据量,1万属性的检索与联合检索需求呢? 第三:统一检索服务 数据量很大的时候,不同属性上的查询需求,不可能通过组合索引来满足所有查询需求,“外置索引,统一检索服务”是一个很常用的实践:
元数据与索引数据的操作遵循:
画外音:这个检索服务,扛起了58同城80%的请求(不管来自PC还是APP,不管是主页、城市页、分类页、列表页、详情页,最终都会转化为一个检索请求),它就是58另一个统一的核心服务E-search,这个搜索引擎,是完全自研的。 对于这个内核自研服务的搜索引擎架构,简单说明一下: 为应对100亿级别数据量、几十万级别的吞吐量,业务线各种复杂的复杂检索查询,扩展性是设计重点: (1)统一的代理层,作为入口,其无状态性能够保证增加机器就能扩充系统性能; (2)统一的结果聚合层,其无状态性也能够保证增加机器就能扩充系统性能; (编辑:ASP站长网) |