一 设计思路
广告检索具有数据量较小、数据结构复杂、检索性能要求高、更新实时性要求高等特点。这要求设计者在进行内核整体设计时,需要做出倾向性的考量。
本文介绍的检索内核在设计思路上的主要前提如下:
- 纯内存存储
对比于文档搜索动辄TB量级的数据量来说,广告场景的数据量一般在10GB至100GB量级。当前业界主流的资源划分方式均可以提供10G至100GB大小的内存,因此为了追求高性能,广告索引大都采用纯内存存储方案。本文设计的内核使用Linux提供的mmap进行文件映射,对索引文件进行类似于内存的直接操作,目前并未对传统磁盘和SSD硬盘进行深入优化。
- 数据schema + 标准化数据接入协议
为了提高检索内核的通用性,同时降低业务方的开发成本,内核提供了通用的数据schema描述方式和标准化的数据接入协议。业务方可以根据业务自行定义复杂的数据结构,包括元组类型数据(支持嵌套)和表间关联(支持多级关联)结构。
- 无锁化并发读写
广告业务区别于搜索、推荐业务的另一大特征是有广告主行为的干预,如何及时响应广告主的各种操作是在广告系统设计初期就必须考虑的问题。为了同时保证读写的性能,业内通常利用轻量级原子操作实现无锁化并发读写。
- 空间碎片管理
实时数据更新过程中会无法避免的出现空间碎片,随着更新行为的持续,碎片会导致存储空间利用率降低,直至危及服务稳定性。一些开源的检索技术选型(如LevelDB、RocketDB、ElasticSearch等)采用本地数据定期合并的方式来进行空间碎片回收。但是这种方式会带来两个问题:一是会不定期出现写放大,影响检索性能;二是