Redian新闻
>
百万并发场景中倒排索引与位图计算的实践

百万并发场景中倒排索引与位图计算的实践

公众号新闻

来源 | OSCHINA 社区

作者 | 京东云开发者-京东物流 朗元辉

原文链接:https://my.oschina.net/jiagoushi/blog/5549507

背景

Promise 时效控单系统作为时效域的控制系统,在用户下单前、下单后等多个节点均提供服务,是用户下单黄金链路上的重要节点;控单系统主要逻辑是针对用户请求从规则库中找出符合条件的最优规则,并将该规则的时效控制结果返回客户端,比如因为临时疫情等原因针对仓、配、商家、客户四级地址等不同维度进行精细粒度的时效控制。
该系统也是 Promise 侧并发量最大的系统,双 11 高峰集群流量 TPS 在百万级别,对系统的性能要求非常高,SLA 要求在 5ms 以内,因此对海量请求在规则库 (几十万) 中如何快速正确匹配规则是该系统的技术挑战点

朴素的解决方案

按照朴素的思想,在工程建设上,通过异步方式将规则库逐行缓存到 Redis,Key 为规则条件,Value 为规则对应结果;当用户请求过来时,对请求 Request (a,b,c,d..) 中的参数做全组合,根据全组合出的 Key 尝试找出所有可能命中的规则,再从中筛选出最优的规则。如下图所示
该方案面临的问题是全组合的时间复杂度是 2**n,n≈12;算法的时间复杂度高且算法稳定性差,最差情况一次请求需要 4096 次计算和读取操作。当然在工程上我们可以使用本地缓存做一些优化,但是无法解决最根本的性能问题。架构简图如下所示:

新的解决方案

上面方案是从行的角度看待匹配定位的,能够命中的行的每一列必然也是符合条件的,这里面存在某种隐约的内在联系。能否反过来思考这个问题,为此我们尝试进行新的方案,当然架构简图依然如上图所示,核心优化的是命中算法。
新的方案整体采列的倒排索引和倒排索引位运算的方式,使得计算复杂度由原来的 2n 降至 n**,且算法稳定性有非常好的保证。其中列的倒排索引是对每列的值和所分布的行 ID (即 Posting List) 建立 KV 关系,倒排索引位运算是对符合条件的列倒排索引进行列间的位运算,即通过联合查询以便快速找到符合条件的规则行。

算法详细设计

1. 预计算生成列的倒排索引和位图

通过对每列的值进行分组合并生成 Posting List,建立列值和 Posting List 的 KV 关系。以下图为例,列 A 可生成的倒排索引为:301={1},201={2,3,4,5} 等,需要说明的一点,空值也是一种候选项,也需要生成 KV 关系,如 nil={7}。

2. 生成列的倒排索引对应位图

将步骤 1 的倒排索引转成成位图,方便后续的位图计算,转换规则为行 ID 对应位图的下标位(步骤 1、2 可以合并操作)。

3. 根据用户请求查找列位图,通过位图计算生成候选规则集

将用户请求中的入参作为 Key,查找符合条件的位图,对每一列进行列内和空值做 || 运算,最后列间位图做 & 运算,得到的结果是候选规则集,如下图所示:

4. 从候选规则库中,根据业务优先级排序,查找最优的规则

以候选规则为基点,按照业务优先级排序,进行逐级位运算 &,当遍历完或位运算为 0 时,找到最后不为空的即为最优规则,该过程是从候选规则库逐渐缩小最优范围的过程。需要说明某列当用户请求位图不存在时,需要使用对应的空位图进行参与,以 B 列为例,入参 B_1102 不存在,需要使用 B_nil 参与 &。

复杂度分析

通过上面的例子我们可以看到,在时间复杂度方面查找候选规则集时,进行一轮 || 运算,一轮 & 运算;在查找最优规则时进行一轮 & 运算,所以整体复杂度是 3n≈n
在空间复杂度方面,相比原来的行式存储,倒排索引的存储方式,每列都需要存储行 ID,相当于多了 *(n-1)Posting List 存储空间,当然这是粗略计算,因为实际上行 ID 的存储最终转换为位图存储,在空间上有非常大的压缩空间。

工程问题 - 压缩位图

如果倒排索引位图非常稀疏,系统会存在非常大的空间浪费。我们举一个极端 case,若千万规则库中命中的行 ID 是第 1000 万位,按照传统方式 BitSet 进行存储,需要消耗 1.2MB 空间,在内存中占用存在严重浪费,有没有压缩优化方案,在 RoaringBitMap 压缩位图方案中我们找到,相同场景在压缩位图方式下仅占 144bytes;即使在 1000 万的位图空间,我们随机存储 1 万个值,两者比也是在 31K vs 2MB,近 100 倍的差距,总的来说 RoaringBitMap 压缩率非常大。
RoaringBitMap 本质上是将大块的 bitmap 拆分成各个小块,其中每个小块在需要存储数据的时候才会存在,所以当进行交集或并集运算的时候,RoaringBitMap 只需要去计算存在的块而不需要像 bitmap 那样对整个大块进行计算,既做到了压缩的存储又做到计算性能的提升。
以下图 821697800 为例,对应的 16 进制数为 30FA1D08, 其中高 16 位为 30FA,低 16 位为 1D08。先用二分查找从一级索引(即 Container Array)中找到数值为 30FA 的容器,该容器是一个 Bitmap 容器,然后在该容器查找低 16 位的数值 1D08,即十进制下 7432,在 Bitmap 中找到相应的位置,将其置为 1 即可。

适用场景分析

回顾上面的设计方案我们可以看到,这种方式仅适用于 PostingList 简单如行 ID 的形式,如果是复杂对象就不适合用位图来存储。另外仅适用于等值查询,不适用于 like、in 的范围查询,为什么有这种局限性?因为这种方式依赖于搜索条件的空间,在方案中我们将值的条件作为搜索的 Key,值的条件空间希望尽可能是一个有限的、方便穷举的、小的空间。而范围查询导致这个空间变成难以穷举、近乎无限扩张的、所以不适用。

其他优化方式

除了使用位运算的方式对倒排索引加速,考虑到 Posting List 的有序性,还有其他的方式比如使用跳表、Hash 表等方式,以 ES 中采用的跳表为例,进行 & 运算实际就是在查找两个有序 Posting List 公共部分,以相互二分查找的形式,将时间复杂度控制在 log (n) 的级别。
具体参见《工业界如何利用跳表、哈希表、位图进行倒排索引加速?》:https://time.geekbang.org/column/article/221292?utm_source=related_read&utm_medium=article&utm_term=related_read


往期推荐



2022网络浏览器市场份额:Edge增长缓慢、Chrome地位无法撼动

微软挑战谷歌,将ChatGPT技术整合到Bing中

开发者遭死亡威胁,项目停止开发



这里有最新开源资讯、软件更新、技术干货等内容

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦~

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
美国入境档案--于右任儿子于彭一家1941年边缘计算市场规模或突破500亿,如何在大行业与小场景中掘金?马斯克“宏图计划”公布!要每45秒造一辆车、生产成本降低一半!却令市场失望了?特斯拉盘后跌幅扩大光芯片进军AI,打破模拟计算的扩展限制打碎软件应用,在产业互联场景中串联——钉钉7.0关注企业间的高效协同今日财经 | 马斯克“宏图计划3”揭晓;董明珠回应格力渠道改革;新能源车企披露2月交付量马斯克“宏图计划3”揭晓;华为小米陷专利纠纷;董明珠建议统一五险一金标准;​爱奇艺回应2月充会员只能用28天...不要看不起小师妹整理的实验protocol,她做的实验深受我导的心!硅谷技术新焦点:摆脱缝合怪的多云设计,才是云计算的归宿高并发场景下如何优化服务器的性能?9位院士12位专家联合撰文:智能计算的新进展、挑战与未来 | Science合作期刊东京在召唤16-李鸿章小道及其它机器学习中的新数学,加速AI训练离不开数字表示方式和基本计算的变革来显摆一个新包,不是名牌P99 是如何计算的?拯救未来计算的三种办法!广告倒排服务极致优化马斯克第三个“宏图计划”正式揭晓泪目!小公司跳槽太不容易,挂了6家公司,高并发场景题一塌糊涂……高并发场景下常见的限流算法及方案介绍Transformer升级之路:长度外推性与位置鲁棒性特斯拉首次投资者日来了!马斯克“宏图计划3”揭晓;爱奇艺CEO:投屏决策失误;苏州立法禁止大数据“杀熟”丨邦早报ChatGPT让3D猫娘有了灵魂!可实时语音互动,还能在虚拟场景中给你做饭玩猜谜快速构建音视频能力与服务,5G低延迟视频技术应用实践,RTC云游戏场景探索,面向用户体验的客户端优化实践特斯拉“宏图计划”,马斯克秒杀世界上所有狂人痛心!19岁中国女留学生遭男友毒杀!大学赔$500万并树立纪念碑!突发!悉尼男子当街被乱枪打死,目击者亲述听见一串巨响!事发场馆紧急关闭!问了ChatGPT几个关于云计算的问题,发现...颠覆开发模式的创新发布背后,我看见了云计算的下一个十年re:Invent 2022 全回顾:看见云计算的力量,透视未来的云计算百度段润尧:4个因素让量子计算的出现成为必然 | MEET2023No. 1 - Supper food : Spirulina (螺旋藻)效率加倍,高并发场景下的接口请求合并方案FBEC大会 | 高通中国区VR/AR负责人郭鹏:XR革命是从二维到空间计算的变革仗打得差不多了,该政客出手了
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。