NCache 旨在为您的应用程序提供最佳性能,而实现这一点需要一个无缝且经济高效的缓存环境。由于 NCache 作为内存数据存储运行,主要问题是单个物理服务器上可用的内存有限,其次是计算限制。除此之外 基本的 CRUD 操作, NCache 支持许多高级功能,例如 发布/订阅, 查询、基于条件的提取调用等。随着客户对这些功能的需求增长,对更多处理能力的需求也随之增加。这意味着您的缓存服务器迟早会达到其最大处理限制。当这种情况发生时, NCache 不会让你陷入困境——相反,它会提供解决方案。
关键精华
通过分布式架构实现线性可扩展性: NCache 允许您向运行中的集群添加服务器节点,从而在不降低性能的情况下实现事务容量和存储的线性增长。
通过流水线技术降低 CPU 开销: 通过将多个客户端请求批量合并到单个 TCP 调用中, NCache 最大限度地减少昂贵的“用户到内核”模式转换,并减少网络通信。
利用对象池实现高效内存管理: 该引擎会重用内部对象,而不是不断地创建和销毁它们,这大大减少了高负载期间 .NET 垃圾回收 (GC) 的暂停。
通过客户端缓存进行本地化数据访问: 将常用数据直接存储在应用服务器(InProc 或 OutProc)上,可以消除不必要的与集群缓存的网络往返,从而进一步提高读取密集型应用的性能。
线性可扩展性 NCache
当您的环境达到上述限制时, NCache 允许您向缓存集群添加新的服务器节点(或多个节点)。这涉及通过 NCache 管理中心 or NCache PowerShell 工具 它可增强整体内存并为您提供额外的资源来处理不断增长的传入请求量。

图 1:通过向系统中添加服务器节点实现线性可扩展性 NCache 簇。
这种方法可确保线性可扩展性。如何实现?您添加的节点越多,应用程序的性能就越好。使用 NCache,向集群添加节点不会产生任何开销,从而导致一致的吞吐量下降。根据最近的性能基准, NCache 实现 2 个服务器节点,每秒 5 万次操作!如果这都不算胜利,那就很难说什么才是胜利了!

图2: NCache 吞吐量基准测试表明,在 5 节点集群中具有线性可扩展性。
而关于这一切的最好的部分是 动态性质 NCache 集群。您可以在不中断现有流程、应用程序或节点的情况下向集群添加新节点。这种无缝可扩展性可确保不间断运行并轻松扩展缓存基础架构。
让我们深入挖掘一下,看看有哪些功能 NCache 带来可扩展性。
可扩展性的客户端操作
NCache 客户端具有内置功能,可以自动连接每个服务器节点。 NCache 分布图可帮助客户端识别哪个节点具有其所需的数据。因此,来自客户端的操作不会经过多个跳转和节点。相反,它只需一次直接跳转即可到达具有特定数据的服务器。这个简单而智能的功能有助于扩展您的环境。
操作可扩展性的并行性
NCache 支持各种高级操作,如 查询, 批量操作, 标签以及许多其他跨多个节点的操作。它不是以循环方式将这些操作发送到每个节点, NCache 允许您将每个操作并行发送到每个节点。
例如,客户端想要查询缓存中存储的数据,因此它会将该查询发送到集群的所有节点。每个节点都将在其数据集上本地运行该查询并与客户端共享结果。客户端会合并来自所有服务器节点的结果,并向所有终端应用程序返回单一响应。这种并行执行不仅增强了可扩展性,而且还通过同时在所有节点上分配工作负载来加速系统性能。
管道化如何改进 NCache 可扩展性?
与受“嘈杂”网络通信影响的传统缓存机制不同, NCache管道化减少了往返的总次数。 NCache 使用 流水线 创建需要通过单个 TCP 调用通过网络发送的操作块。此技术减少了单独发送多个请求并等待其确认的开销。
例如,如果 NCache 客户端向服务器发送 100 个操作,这通常会导致 100 个单独的 I/O 操作。每个操作都需要从用户模式转换到内核模式,这会消耗大量 CPU 能力。过多的 CPU 消耗是昂贵的,并且可能导致应用程序性能下降。但是,使用客户端流水线,这些操作被组合成对服务器的单个 I/O 调用。
服务器端流水线确保服务器在一次简单调用中接收多个 I/O 调用,并且服务器发回的响应也会一起接收。不仅如此,服务器还会尝试一次性对这些传入操作生成最大响应。因此,服务器在一次调用中接收了通过专用调用发送到服务器的 100 个操作。并且服务器在一次调用中发送了它得到的操作结果。这种技术有助于极大地扩展系统。
分区副本中的可扩展后台复制
当客户端对服务器节点执行更新操作时, NCache 处理到副本服务器的复制,以实现容错和高可用性。此复制在后台进行,无需任何客户端参与。除了作为后台进程之外,此复制还以批量方式进行,以节省最大成本。此方法通过将复制工作负载卸载到后台来增强可扩展性,同时确保您的缓存保持高可用性。这是一个双赢的解决方案,可以提高性能和可靠性。
后写缓存以实现可扩展性
当客户端请求写入数据时, NCache 确保数据同时写入缓存和数据库。这是通过一种称为 后写启用 Write-behind 后,服务器最初将数据写入缓存,然后快速将控制权返回给客户端,从而最大限度地减少计算延迟。在后台, NCache 采用批处理系统以异步方式使用缓存数据更新数据库。此方法可确保缓存和数据库保持同步,同时保留内存缓存的高性能。
后写机制通过将数据库写入操作卸载到后台来增强可扩展性,使您的应用程序能够有效地处理更多事务而不影响性能。
通过内存管理中的对象池实现可扩展性
在 .NET 环境中,当自动垃圾收集器 (GC) 激活时,应用程序中正在进行的所有活动都会停止,从而导致内存数据计算暂停。这些暂停会严重影响应用程序的性能。您创建的对象越多,GC 启动的次数就越多,影响就越大。
为了避免这些长时间的 GC 暂停, NCache 作为本机 .NET 缓存使用对象池技术作为其自己的内存管理。 在这个机制中, NCache 服务器将对象池化并重用它们,而不是创建新的对象,从而减少调用 GC 的需要。 这种需求越少,您从应用程序中获得的性能就越高,因此可扩展性就越高。
客户端缓存以提高可扩展性
关于可扩展性, 客户端缓存 是最重要的特征 NCache。它将集群缓存中最常用的数据存储在应用程序运行的同一台机器上。在应用程序和集群缓存之间使用客户端缓存可为您提供位于应用程序附近的本地缓存资源。此缓存将处理应用程序的大多数读取请求,这必然会降低 I/O 成本。因此,您不仅可以快速访问更新的数据,而且应用程序还可以扩展。
如果您从 输出程序 客户端缓存 进程内 客户端缓存通过减少访问本地节点的成本。
下表总结了本文讨论的驱动核心架构特性。 NCache处理极端交易负载的能力:
| 可扩展性功能 | 技术角色 | 对性能的影响 |
|---|---|---|
| 流水线 | 将多个客户端命令批量合并到单个 TCP 请求中。 | 减少网络 I/O 开销和每次操作所需的 CPU 周期。 |
| 对象池 | 在内部重用对象 NCache 引擎。 | 最大限度减少高负载期间的垃圾回收 (GC) 暂停。 |
| 客户端可扩展性 | 将请求处理分布到多个客户端实例上。 | 防止应用层成为瓶颈。 |
| 客户端缓存 | 将常用数据存储在本地(进程内/进程外)。 | 显著降低读取密集型负载的 I/O 成本和延迟。 |
结语
在充分利用您的应用程序的同时,您可能会遇到两个主要挫折。 要么缓存上的计算负载增加,要么达到数据存储的设定界限,这两者都可以通过扩展得到显着改善 NCache. 您可以完全控制 NCache 功能丰富,可为您的环境带来可扩展性。您还在等什么?下载 NCache !
常见问题
问:怎么做 NCache 如何避免在增加服务器节点时出现“瓶颈”效应?
A: NCache 它采用分布式架构,数据处理和请求处理都分布在集群中的所有节点上。这确保了随着服务器数量的增加,CPU 和存储容量线性增长,从而防止任何单个节点成为性能瓶颈。
问:为什么“用户模式到内核模式”的转换会影响可扩展性?
答:每一次网络 I/O 操作都需要 CPU 从用户模式切换到内核模式。在高事务处理环境下,成千上万次的这种切换会造成显著的 CPU 开销。 NCache的流水线技术通过将多个操作合并为一个操作来解决这个问题,从而大幅减少了所需的转换次数。
问:在 .NET 环境中使用对象池的具体优势是什么?
答:在 .NET 中,频繁创建和销毁大型对象会触发垃圾回收器 (GC),从而暂停应用程序执行。对象池可以解决这个问题。 NCache 重用现有的内部对象,保持“堆”的稳定,并确保即使在极端负载下缓存也能保持响应。
问:对于客户端缓存,架构师何时应该选择进程内缓存(InProc)而不是进程外缓存(OutProc)?
答:虽然 OutProc 客户端缓存为缓存提供了一个本地进程,但 InProc 客户端缓存更适合实现最大可扩展性,因为缓存驻留在应用程序自身的内存空间中。这消除了“本地进程间通信成本”,从而能够以最快的速度访问常用数据。






