我们有许多不同的 vertx 实例,它们通过 Hazelcast 之上的集群 EventBus 相互通信。开箱即用,效果很好。
但是vertx的实现对我们来说似乎是开销。 Hazelcast 显着增加了每个实例的内存消耗和启动时间。 此外,我们不使用任何内存存储,也不使用任何 AsyncMaps 和 HA 功能。
是否可以以最小的影响进行顶点间通信?有什么解决办法吗?
UPD。更多详情
我尝试了vert.x v3.3.3和v3.4.0,都使用hazelcast v3.6.3。 我还尝试了更新版本的 hazelcast 3.4 vert.x。
为了进行比较,我运行了一个 Zookeeper 实例和基于它的 vert.x。
我总共收集了一些初始化阶段的统计数据。 对我来说,与集群的连接时间更重要。我还注意到 hazelcast 在开始时加载了很多 com.hazelcast* 类(大约是项目中加载的所有类的一半)
| | hazelcast 3.6.3 | hazelcast 3.7.5 | Hazelcast 3.8 | Zookeeper 3.4.8 | No cluster |
|------------------------------|-----------------|-----------------|---------------|-----------------|------------|
| Loaded classes(init phase) | 2685 | 2703 | 3131 | 257 | 0 |
| Start of the 1st member(sec) | 2.3s±0.2 | 2.4±0.2 | 2.4s±0.2 | 1.0s±0.1 | 0.4 |
| Start of 2d/3d member(sec) | 4 | 4.5±0.2 | 4.5s±0.2 | 1.0s±0.1 | — |
我使用Ubuntu x64和java8.121
PS:我再次重复一遍,我只谈论初始化阶段。
最佳答案
您在测量中注意到的差异是由于 vertx-hazelcast 和 vertx-zookeeper 集群管理器的工作方式存在根本差异造成的:
- 使用 vertx-zookeeper 时,您的 vert.x 实例会启动连接到现有 Zookeeper 集群的 Apache Curator 客户端 [1]:Zookeeper 集群本身单独在其他 JVM 上运行。
- 当使用 hazelcast 集群管理器运行 vert.x 时,集群管理器会启动一个嵌入在同一 JVM 中运行的 Hazelcast 成员:您没有连接到单独的 Hazelcast 集群,而是在与以下相同的 JVM 中运行完整的集群成员:您的 vert.x 实例。
这至少应该解释您在加载的类数量方面注意到的差异。也就是说,您可以启动一个单独的 Hazelcast 实例并配置集群管理器来启动 lite 成员 [2]。 Hazelcast lite 成员不存储任何数据,因此在加载的类方面可能更轻,并且在运行时肯定更轻,因为它不参与共享数据管理,而是充当集群数据结构的客户端。
就连接时间而言,您的结果可能会有所不同,具体取决于您使用的是多播、TCP/IP 还是其他集群发现方法。请参阅 [3] 中有关替代集群发现配置选项的更多信息。
[1] https://github.com/vert-x3/vertx-zookeeper/blob/master/src/main/asciidoc/java/index.adoc#how-to-work
[2] http://docs.hazelcast.org/docs/3.8/manual/html-single/index.html#enabling-lite-members
[3] http://docs.hazelcast.org/docs/3.8/manual/html-single/index.html#discovering-cluster-members
关于hazelcast - 轻集群Vert.x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42714804/