1.背景
互联网某些业务场景下,我们常会遇到这种情况:服务启动需要加载大量数据到内存,数据规模达数十G,数据更新频率较低(天级、小时级、分钟级),使用方式为静态查询。如业务订单数据、线下挖掘的策略规则,地图路网数据等。而在线服务基于稳定性考虑通常至少加载双版本数据,服务启动通常需要数分钟之久。暴露的问题包括服务上线旷日持久,人力成本高;需求排队无法快速迭代,时间成本高;回滚速度慢,由于要加载大量数据故障实例无法快速恢复造成稳定性隐患。
如同闪电(Levin)一般快速加载启动是根治这类问题的灵丹妙药。Levin是针对上述低频更新、静态使用、大规模数据的快速加载方案,高效托管大规模静态数据,加速大内存服务冷启动和热加载。
2.原理
服务启动唯快不破,但是在单纯的服务变更场景中(比如上线、回滚、故障恢复)虽然并不涉及任何数据变更,服务进程重启导致堆和栈内存数据都会随之消亡,启动后需要重新加载数据。那么数据能不能在进程间传递复用呢?最高效的进程间数据传递方式就是共享内存,共享内存可以突破进程生命周期实现跨进程重用,并且具有内存对象访问效率和充足的可用地址空间(下图Memory Mapping Area),鱼(启动速度)与熊掌(查询效率)可以兼得。
再考虑数据更新场景,通常指数据版本切换,此时磁盘数据读取在所难免,那么从数十G的数据文件到内存数据