我有一项任务是为大规模可扩展的分布式共享内存(DSM)应用程序构建原型.原型只能作为概念验证,但我希望通过选择稍后将在真实解决方案中使用的组件来最有效地利用我的时间.
此解决方案的目的是从外部源获取数据输入,流失它并使结果可用于许多前端.那些"前端"只会从缓存中获取数据并在没有额外处理的情况下提供服务.这些数据的前端命中量实际上可以达到每秒数百万.
数据本身非常不稳定; 它可以(而且确实)变化很快.然而,在最新的处理和缓存之前,前端应该看到"旧"数据.处理和写入由单个(冗余)节点完成,而其他节点仅读取数据.换句话说:没有直读行为.
我正在寻找像memcached这样的解决方案,但是这个特殊的解决方案并不能满足我们下面列出的所有要求:
该解决方案至少必须具有相当好的维护的Java客户端API,因为其余的应用程序是用Java编写的,我们是经验丰富的Java开发人员;
解决方案必须是完全弹性的:应该可以添加新节点而无需重新启动集群中的其他节点;
解决方案必须能够处理故障转移.是的,我意识到这意味着一些开销,但整体服务的数据大小并不大(最大1G),所以这应该不是问题."故障转移"是指在节点出现故障时无需硬编码/更改服务器IP地址(如memcached客户端)的无缝执行;
理想情况下,应该可以指定数据重叠的程度(例如,应该在DSM集群中存储多少份相同数据的副本);
不需要永久存储所有数据,但可能需要对某些数据进行后处理(例如,序列化到数据库).
价格.显然我们更喜欢免费/开源,但如果解决方案值得,我们很乐意支付合理的金额.无论如何,支付24小时/天的支持合同是必须的.
整个事情必须在我们的数据中心托管,因此像Amazon SimpleDB这样的SaaS产品超出了范围.如果没有其他选择,我们只考虑这个.
理想情况下,解决方案将严格一致(如CAP); 但是,最终的一致性可以被视为一种选择.
提前感谢任何想法.
看看Hazelcast.它是纯Java,开源(Apache许可证)高度可扩展的内存数据网格产品.它确实提供7X24支持.它确实解决了我试图在下面解释每个问题的所有问题:
它有一个本机Java客户端.
这是100%动态.动态添加和删除节点.无需改变任何东西.
一切都是动态的.
您可以配置备份节点数.
Hazelcast支持持久性.
Hazelcast提供的所有内容都是免费的(开源),它确实提供企业级支持.
Hazelcast是单个jar文件.超级好用.只需将jar添加到类路径中即可.看看主页面中的屏幕投射.
Hazelcast严格一致.你永远不能读取过时的数据.
我建议你使用基于Redisson - Redis的内存数据网格来实现Java.工具(BitSet
,BloomFilter
,Set
,SortedSet
,Map
,ConcurrentMap
,List
,Queue
,Deque
,BlockingQueue
,BlockingDeque
,ReadWriteLock
,Semaphore
,Lock
,AtomicLong
,CountDownLatch
,Publish / Subscribe
,RemoteService
,ExecutorService
,LiveObjectService
,SchedulerService
)之上Redis的服务器!它支持主/从,前哨和集群服务器模式.还支持自动群集/标记服务器拓扑发现.这个lib是免费的开源软件.
借助AWS Elasticache支持,完美地在云中运行