1

我正在使用 .NET System.Runtime 内存缓存将瞬态资源存储在基于 WebAPI 的 REST 服务中。该资源代表一个“查询”。当客户端通过 HTTP 发出 POST 时,我们生成一个 ID 并将查询粘贴到缓存中。可以在此处找到有关该场景的更多详细信息。

当客户端发出 GET 时,从内存缓存中检索资源并执行“查询”。这通常可以正常工作,但在负载平衡的情况下会失败,因为客户端可以点击实例 1 来发布“查询”并点击实例 2 来获得结果。

我正在寻找选项,以使其能够在负载平衡的情况下工作。从性能的角度来看,将“查询”对象写入数据库是不可行的,而且由于查询的瞬态特性。

一种可能的解决方案是使用分布式缓存服务,例如“AppFabric”,但我想在性能和实现复杂性方面将其与其他选项进行权衡。

非常感谢您的想法/指导。

TIA

4

2 回答 2

3

只是为了涵盖所有基础,有两种缓存数据的方法:

进程内

在 Proc 缓存中,将数据存储在当前应用程序域中(在应用程序进程内)。当您的应用程序在单个服务器上运行时,这可以正常工作,但在涉及多个 Web 服务器的负载平衡场景中,正如您所提到的,此设置会失败。客户端的初始 POST 可能由一个 Web 服务器处理,但接下来可能由另一个没有客户端第一个请求记录的服务器处理。

输出过程

OutProc 缓存允许您将会话和应用程序数据存储在应用程序进程之外的单独机器上。ASP。NET 允许 OutProc 缓存有 3 个选项:

  • 状态服务器

StakeServer 允许您从 Web 场缓存数据,以解决您最初的问题,但由于序列化和反序列化,它的性能很慢。还有可靠性和可扩展性问题,因为您只能拥有一个可能成为单点故障的 StateServer。

  • SQL 服务器

SQL Server 提供会话模式,允许您存储会话数据。由于这会将数据存储在数据库中,因此会影响性能,但它确实为您提供了可靠和安全的会话管理

  • 自定义提供程序

这些是提供分布式缓存的自定义缓存解决方案。这些解决方案提供的功能比 StateServer 和 SQL Server 提供的功能更多。

您提到的 AppFabric 是我的 Microsoft 提供的一种 .NET 分布式缓存解决方案。它为您提供了基本的分布式缓存功能,但缺少一些关键功能,例如允许您将缓存数据与数据库同步的数据库同步和“热应用”,您可以在不停止缓存的情况下从缓存集群中添加或删除节点. AppFabric 使用主/从架构来组织其缓存集群,这对于大多数应用程序来说都很好,但如果“主节点”出现故障,它可能会出现可用性问题。

NCache 是另一个 .NET 分布式缓存解决方案,它提供了许多 AppFabric 所缺少的功能。它使用点对点集群架构,提供具有高可用性的高弹性缓存。NCache 还为 NHibernate 提供对象关系映射支持。您可以在他们的网站http://www.alachisoft.com/ncache/上查看 NCache 。他们提供免费使用的NCache Express 。

于 2013-10-10T09:34:30.550 回答
2

你知道CacheCow吗?非常容易设置和集成到您当前的 webapi 项目中作为消息处理程序。
使用 Redis 实现(内置选项)也应该是集中的并且非常快速。

于 2013-10-08T09:23:05.707 回答