Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以使用Terracotta来扩展RAM密集型应用程序吗?_Java_Scalability_Amazon Ec2_Terracotta - Fatal编程技术网

Java 我可以使用Terracotta来扩展RAM密集型应用程序吗?

Java 我可以使用Terracotta来扩展RAM密集型应用程序吗?,java,scalability,amazon-ec2,terracotta,Java,Scalability,Amazon Ec2,Terracotta,我正在评估Terracotta,以帮助我扩展当前RAM受限的应用程序。它是一个协作过滤器,每个用户存储大约2千字节的数据。我想使用Amazon的EC2,这意味着我的内存限制为14GB,这给了我大约700万用户的有效每服务器上限。我需要能够超越这一点 根据我到目前为止的阅读,我推断Terracotta可以拥有比每台服务器上可用RAM更大的集群堆。如果每个服务器只支持14GB,那么拥有一个30GB或更多的有效集群堆是否可行 每个用户的数据(大部分是浮点数组)变化非常频繁,可能每分钟数十万次。这些更改

我正在评估Terracotta,以帮助我扩展当前RAM受限的应用程序。它是一个协作过滤器,每个用户存储大约2千字节的数据。我想使用Amazon的EC2,这意味着我的内存限制为14GB,这给了我大约700万用户的有效每服务器上限。我需要能够超越这一点

根据我到目前为止的阅读,我推断Terracotta可以拥有比每台服务器上可用RAM更大的集群堆。如果每个服务器只支持14GB,那么拥有一个30GB或更多的有效集群堆是否可行


每个用户的数据(大部分是浮点数组)变化非常频繁,可能每分钟数十万次。这些更改中的每一个都不必在发生时同步到集群中的其他节点。是否可以只定期同步某些对象字段

对于这一点,我认为答案是有条件的肯定。Terracotta确实允许您处理大于单个JVM大小的集群堆,尽管这不是最常见的用例

您仍然需要记住a)工作集大小和b)数据通信量。对于a),内存中必须有一组数据,以便在任何给定时间执行工作,如果该工作集大小>堆大小,则性能将明显受到影响。对于b),在集群堆中添加/更新的每个数据段都必须发送到服务器。在pojo图形中更改细粒度字段时,Terracotta是最好的。使用大型阵列并没有充分利用Terracotta的功能(这并不是说人们有时不会这样使用它)

如果您正在创建大量垃圾,那么Terracotta内存管理器和分布式垃圾收集器必须能够跟上这一点。如果不尝试,很难说您的数据量是否超过了那里的可用带宽

如果您运行多个服务器,并且数据按服务器分区,或者具有一定数量的引用位置,那么您的应用程序将受益匪浅。在这种情况下,您只需要堆中的一个服务器分区的数据,其余的不需要故障进入内存。如果需要故障切换/可用性,如果其他服务器出现故障,它当然会出现故障。这意味着,在分区数据的情况下,您并不是向所有节点广播,而是向服务器发送事务


从数字的角度来看,索引30GB的数据是可能的,因此这不接近任何硬限制。

快速跟进:我听说如果使用Terracotta的HashMap,那么值可以分布,但键将被镜像到任何地方。这是真的吗?不同的地图集合是否会有不同的行为?正确。HashMap、ConcurrentHashMap等将在所有节点上维护完整的密钥集。如果我们不这样做,就很难知道缺少密钥是由于非本地密钥还是缺少密钥。一个常见的替代方法是构建地图的地图,以允许更多的数据被调出。我应该指出,这是一个实现细节,是时间点。Alex是对的,这样做更容易,但使键集虚拟化并非不可能,这只是工作;)分片redis集群可能是一种更简单的方法,这种方法在这种情况下有效吗?