C# Web API - 将数据存储和持久化到内存缓存中

5
我正在编写一个REST API,需要与我们组织的ActiveDirectory提供集成服务,具体是查询用户和组数据,然后在API中提供自动完成字段查询的端点。
我们组织的ActiveDirectory非常大,约有130K个用户和组对象的组合。
查询所有这些对象并将它们存储在我们当前的后备存储(MongoDB)中需要大约40分钟。
我们决定检查是否有跳过使用Mongo的选项,并将所有查询的AD对象存储在Web API内存中。
查看SO中的其他问题后,我意识到Singleton不起作用,因为存储在其中的数据每次重置IIS应用程序池时都会丢失,然后API无法提供数据,这是不能发生的40分钟。
我还查看了this问题,该问题涉及命名空间System.Runtime.Caching。但是,由命名空间提供的MemoryCache也会在重置IIS应用程序池时丢失所有数据。
我的问题是,是否有其他解决方案可以将AD中的数据存储在Web API内存中。我们目前希望避免使用持久存储(关系型或文档数据库)来保存信息,但如果没有可行的解决方案出现,我们可能会坚持使用Mongo(除非提供更好的存储方式)。
1个回答

1

从可扩展性的角度看,将数据保存在内存中似乎不是个好主意。如果您想要负载均衡您的 API,您可能需要在多个内存副本中存储这些数据,但它们都可能略有不同,导致当 API 的一个实例处理请求或另一个实例处理请求时出现不同的结果。

保存在内存中可能意味着列表,或者更好的方式是使用 Redis 服务器,它支持多个节点,并将数据存储在内存中。它类似于字典,您可以将键值对存储为 <string, string>。您的 API 的所有实例都可以指向同一个 Redis 集群,因此您将获得一致性、可扩展性和性能。

您还可以考虑使用 Service Fabric,它具有特殊的集合,允许您在有状态和无状态服务之间共享状态。与 Redis 类似,数据被序列化并存储在 Service Fabric 集群中。它具有很强的容错能力,具有内置的 HA 和 DR。

然而,就性能而言,没有什么比 Singleton 字典更好的选择,所以这取决于您现在和未来所需的内容。


注意:ConcurrentDictionary - Tomer W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接