多租户方法的 Apache Ignite 性能

Posted

技术标签:

【中文标题】多租户方法的 Apache Ignite 性能【英文标题】:Apache Ignite performance of multi-tenant approaches 【发布时间】:2016-08-25 07:48:15 【问题描述】:

我正在一个项目中工作,该项目必须在缓存中维护大量记录(Apache Ignite),这些记录由公司划分。

例如:

公司;产品;数量

CompA;一种; 15

CompA;乙; 10

组合B;一种; 20

组合B;乙; 12

我怀疑在同一个缓存中创建条目与键(公司 + 产品)附加租户之间的性能,并为每个租户创建一个新缓存,例如:

CacheConfiguration<String, String> cfgCompanyA = new CacheConfiguration<>();
cfgCompanyA.setName("CompanyA");
IgniteCache<String, String> cacheCompanyA = ignite.getOrCreateCache(cfgCompanyA);

CacheConfiguration<String, String> cfgCompanyB = new CacheConfiguration<>();
cfgCompanyB.setName("CompanyB");
IgniteCache<String, String> cacheCompanyB = ignite.getOrCreateCache(cfgCompanyB);

【问题讨论】:

【参考方案1】:

我建议为每个租户创建单独的缓存。这两种方法的性能应该没有区别,但数据会更好地相互隔离,从而简化代码。

【讨论】:

【参考方案2】:

这取决于您的要求。我不是 Apache Ignite 专家,所以我将在一般层面上解决这个问题。

单独缓存的参数:

访问效率更高,key中没有租户 一个租户的缓存和处理可以共同定位,更容易移动 缓存配置基于每个客户端,使您能够控制保证延迟和每个客户端的资源使用情况

反对单独缓存的论点:

共享缓存为您提供可控的最佳资源使用率。如果您为租户提供单独的缓存,即使租户数月未使用您的应用程序,缓存也可能会耗尽资源 如果要动态添加租户,您需要想出一个概念来管理所有缓存配置

一个很好的选择是使用两者的混合物:

将租户一直放在缓存键中 实现一个可以获取每个租户数据的缓存池 允许多个缓存池以及将缓存池分配给租户的能力

这允许您:

即使有多个租户,也有一个用于开发和(单元)测试的缓存池。简化开发设置。 将高容量租户分配给独占缓存池 将低容量租户分配给共享缓存池,优化资源使用率 新租户从共享池中开始,或者您可能拥有具有其他资源限制的“免费增值”和“试用”池。 低容量租户可以在不更改缓存配置的情况下进出

【讨论】:

【参考方案3】:

我用这段代码 (scala) 做了一些测试:https://github.com/neoramon/scala-ignite-muiti-tenant 随着更多的 100k 记录开始被租户更有效地使用缓存。

机器: 4核, 8 RAM(堆 4GB) 固态硬盘。

【讨论】:

你能告诉我一些细节为什么使用单独的缓存更好吗?

以上是关于多租户方法的 Apache Ignite 性能的主要内容,如果未能解决你的问题,请参考以下文章

多租户和多应用怎么对应

管理多租户数据库连接

对多租户应用程序使用授权码流不起作用

Apache Ignite 索引性能

知识拓展Oracle 12c多租户容器数据库简介

Azure AD 多租户,.Net Core Web API 与 JWT 令牌