我有一个任务,需要构建一个高度可扩展的分布式共享内存(DSM)应用程序的原型。该原型只用作概念验证,但是我希望通过选择将在实际解决方案中使用的组件来最有效地利用时间。
该解决方案的目标是从外部源获取数据输入,对其进行加工处理,并使结果可用于多个前端。这些“前端”只需从缓存中获取数据并提供服务,无需进行额外处理。这些数据的前端访问量可以达到每秒数百万次。
数据本身非常不稳定;它(并且确实)很快就会发生变化。然而,前端应该看到“旧”的数据,直到最新的数据被处理并缓存。处理和写入由单个(冗余)节点完成,而其他节点仅读取数据。换句话说:没有读取行为。
我正在研究像 memcached 这样的解决方案,然而这个特定的解决方案没有满足我们列出的所有要求,这些要求如下:
- 该解决方案必须至少具有Java客户端API,而且应该得到合理的维护,因为应用的其余部分是用Java编写的,而且我们是经验丰富的Java开发人员;
- 该解决方案必须完全弹性可扩展:应该可以添加新节点,而无需重新启动集群中的其他节点;
- 该解决方案必须能够处理故障转移。是的,我意识到这意味着一些额外开销,但是总体提供的数据量不大(最多1G),因此这不应该是问题。通过“故障转移”,我指的是在节点崩溃时,客户端执行无缝操作而无需硬编码/更改服务器IP地址,就像在memcached客户端中一样;
- 理想情况下,应该可以指定数据重叠的程度(例如,在DSM集群中存储相同数据的副本数量);
- 没有必要永久存储所有数据,但可能需要对其中一些数据进行后处理(例如将其序列化到数据库中)。
- 价格。显然,我们更喜欢免费/开源软件,但如果解决方案具有足够的价值,我们也愿意支付合理的费用。无论如何,必须提供付费 24 小时/天的支持合同。
- 整个系统必须托管在我们的数据中心,因此像 Amazon SimpleDB 这样的 SaaS 服务不在考虑范围之内。除非没有其他选择,否则我们才会考虑此选项。
- 理想情况下,解决方案应该是严格一致的(即 CAP);但是,可以将最终一致性视为一种选择。
提前感谢任何意见。