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

时间:2020-03-06 14:33:50  来源:igfitidea点击:

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

根据到目前为止的阅读,我发现Terracotta的群集堆可以大于每个服务器上的可用RAM。拥有30GB或者更多的有效群集堆(每个服务器仅支持14GB)是否可行?

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

解决方案

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

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

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

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

从数字的角度来看,可以为30GB的数据编制索引,因此这没有任何硬性限制。