我正在编写一个REST API,它需要用我组织的ActiveDirectory提供集成服务,特别是查询用户和组数据,然后在API中为自动补全字段查询提供端点。
我的组织的ActiveDirectory非常大,大约有130K个用户和组对象。
查询所有这些对象并将它们存储在我们当前的后备存储(MongoDB)中大约需要40分钟。
我们决定检查是否有一个选项可以跳过Mongo的使用,并将所有查询的AD对象存储在Web API内存中。
查看中的其他问题,我意识到Singleton不会工作,因为每次重置IIS应用程序池时,存储在其中的数据都会丢失,然后API在大约40分钟内无法提供数据,这是不可能发生的。
我还研究了涉及名称空间System.Runtime.Caching
的this问题。但是,在重置IIS应用程序池时,命名空间提供的MemoryCache
也将丢失其所有数据。
我的问题是,是否有其他解决方案可以将AD中的数据存储在Web API内存中。我们目前希望避免使用持久化存储(关系或文档DB)来保存信息,但如果没有可行的解决方案出现,我们可能会坚持使用Mongo (除非提供更好的存储)。
发布于 2017-02-16 22:36:13
从可伸缩性的角度来看,内存中听起来像是一个糟糕的计划。如果您想要对API进行负载平衡,您可能会在内存中拥有此数据的多个副本,但它们可能会略有不同,从而导致在API的一个实例处理请求或另一个实例时产生不同的结果。
在内存中,可能会推断出一个列表,或者更好的是一个字典。您可以考虑Redis服务器,它支持多个节点,并将数据存储在内存中。它类似于字典,因为您将键值对存储为<string, string>
。您的API的所有实例都可以指向相同的Redis集群,因此您可以获得一致性、可扩展性和性能。
您还可以考虑Service Fabric,它具有特殊的集合,允许您在有状态和无状态服务之间共享状态。像Redis一样,数据是跨Service Fabric集群序列化和存储的。它的容错能力非常强,内置了HA和DR.。
然而,就性能而言,没有什么能比得上Singleton Dictionary,所以它取决于您现在和将来需要什么。
https://stackoverflow.com/questions/42276646
复制相似问题