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

标签 java scalability amazon-ec2 terracotta

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

根据我目前的阅读,我了解到 Terracotta 的集群堆可以大于每台服务器上的可用 RAM。如果每台服务器仅支持 14GB,那么拥有 30GB 或更大的有效集群堆是否可行?

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

最佳答案

对此我的回答是肯定的。 Terracotta 确实允许您使用大于单个 JVM 大小的集群堆,尽管这不是最常见的用例。

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

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

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

从数字的角度来看,可以索引 30GB 的数据,因此这离任何硬性限制都不近。

关于java - 我可以使用 Terracotta 来扩展 RAM 密集型应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/117455/

相关文章:

nosql - 是否可以在表现出最终一致性的数据存储中管理用户/身份?

c# - .NET - 使用 AWS CDK 为 .NET 的低级 CloudFormation 资源构造标记 EC2 实例

java - SpringWebSockets 不从服务器发送消息

java - 如何在 Java 中使用 PHP 正则表达式从字符串中检索主题标签?

c# - 是否有快速且可扩展的解决方案来保存数据?

mysql - AWS : Can't connect EC2 instance to RDS instance after configuring security groups

ubuntu - 访问 Amazon EC2 实例的替代方法应该 sshd 死吗?

java - 将 nvarchar 转换为 datetime 时出错

java - 将 Spark DataFrame 转换为 Pojo 对象

php - 评论和改进已经编写的程序的过程?