我的用例如下:
我们有大约 500 台服务器在一个自动扩展的 EC2 集群中运行,它们需要每秒数百万次访问相同的配置数据(以键/值方式布局)。
配置数据不是很大(1 或 2 GB)并且变化不大(高峰时间每分钟几十次更新/删除/插入)。
延迟对我们来说至关重要,因此需要在运行我们应用程序的每个实例上复制数据并将其保存在内存中。
最终的一致性很好。但是,我们需要确保每次更新都会在某个时候传播。(知道服务器可以随时关闭)跨服务器的更新传播应该可靠且易于设置(我们的服务器不能有静态 IP,或者我们不想走“伪造”的路线在 AWS 上多播等...)
以下是我们过去探索过的解决方案:
- 使用常规的 java 映射并使用我们定制的系统在集群中传播更新。(显然,它不能很好地扩展)
- 使用 EhCache 及其复制功能。但是在 EC2 上设置它非常痛苦,而且不知何故不可靠。
以下是我们正在考虑尝试的解决方案:
- 具有 REPLICATED 策略的Apache Ignite ( https://ignite.apache.org/ )。
- Hazelcast 的复制地图功能。(http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#replicated-map)
- 每个应用程序节点上的 Apache Geode。( http://geode.apache.org/ )
我想知道这些解决方案中的每一个是否都适用于我们的用例。最终,我可能会遇到每个问题。
这是我到目前为止发现的:
- Hazelcast 的复制地图在某种程度上是最近的,但仍然有点不可靠(如果缩小,异步更新可能会丢失)
- 似乎 Geode 最近变得“稳定”了(尽管据说它自 2000 年代初就在开发中)
- Ignite 看起来很合适,但我不太确定如果我们继续定期添加/删除节点,他们基于 S3 发现的系统将如何工作。
谢谢!