标准Java地图需要在启动时进行初始化。 了解如何利用可从文件初始化的ChronicleMaps并显着减少微服务启动时间,以及如何在JVM之间共享Maps。
内置的Map
实现(例如HashMap
和ConcurrentHashMap
速度很快,但是必须先使用映射进行初始化,然后才能将其用于查找值。 而且,它们的大小受到诸如堆和RAM大小之类的实际手段的限制。 最后,它们对于运行它的JVM是本地的。
初始化过程可能会减慢微服务的关键启动速度,尤其是在从远程REST接口或远程数据库读取映射时。 在本文中,您将学习如何使用内存映射的ChronicleMap
实例在几秒钟而不是几分钟内启动微服务应用程序,以及在有关CronicleMap的系列文章的第三篇文章中,如何在JVM之间共享Maps。
在第一篇文章中详细了解CronicleMap的基础知识。
在第二篇文章中阅读有关文件映射的CronicleMap对象的更多信息。
创建共享地图
如本系列第二篇文章所述,我们可以轻松地创建一个文件映射Map,如下所示:
private static Map
已建立
现在,任何有权访问“ my-map”文件的JVM都可以访问Map
对象。 映射的更新将通过共享文件在参与的JVM之间共享。
初始化地图
如第二篇文章中所示,我们可以创建并初始化一个
像这样的Map
:
final Map
在我的笔记本电脑(2015年中的MacBook Pro,16 GB,2.2 GHz Intel Core i7)上运行时,创建和填充笔记本电脑大约需要10秒钟。
Map
一千万个条目。
如果Map
内容是从外部检索的(而不是通过pointFrom()
方法在本地创建的),则填充Map
可能会花费更长的时间。 例如,如果我们获得50 Mbit / s的REST吞吐量,并且每个JSON Point表示消耗25个字节,则填充Map
大约需要60秒。
启动一个新的JVM
现在已经有一个预先存在的映射文件,我们可以直接从该文件开始,如以下代码片段所示:
return ChronicleMap .of(Long. class , Point. class ) .averageValueSize( 8 ) .valueMarshaller(PointSerializer.getInstance()) .entries(10_000_000) .createOrRecoverPersistedTo( new File( "my-map" ));
这将直接从现有的“我的地图”文件中创建一个Map
。
在我的笔记本电脑上运行此程序将产生5秒钟的开始时间。 可以将其与60秒REST示例进行比较,从而将启动时间减少90%。
在同一节点上运行多个JVM
我们可以选择在同一物理服务器节点上运行多个JVM。 通过这样做,我们受益于操作系统通过公开共享内存使文件映射可用于每个JVM的能力。 这构成了JVM之间有效且低延迟的通信方式。 与每个JVM / OS都必须维护自己的独立映射的情况相比,存在一个公用的映射内存池这一事实使内存管理效率更高。
摘要
ChronicleMaps可以通过共享文件在参与的JVM之间共享
使用共享文件可以大大减少启动时间
如果JVM在同一台物理计算机上运行,则性能和效率将进一步提高 通过ChronicleMap共享的文件提供了JVM之间低延迟的通信方式
翻译自: https://www.javacodegeeks.com/2019/08/java-chroniclemap-fast-microservices.html