波士顿代码营 31

优化 ASP.NET Core 分布式缓存的性能

伊克巴尔汗
总裁兼技术传播者

ASP.NET Core 在开发高流量 Web 应用程序方面正迅速流行起来。 了解如何优化 ASP.NET Core 使用开源 .NET 分布式缓存处理极端事务负载而不会减慢速度的性能。 本次演讲涵盖:

  • ASP 快速概览.NET Core 性能瓶颈
  • 分布式缓存概述以及它如何解决性能问题
  • 您在哪里可以在应用程序中使用分布式缓存
  • 一些重要的分布式缓存特性
  • 使用开源的动手示例 NCache 作为分布式缓存

好的,谢谢大家,大家能听到我的声音吗? 好的,我忘了包括幻灯片,感谢所有赞助商。 我只是要去网站,给你看所有赞助商的标志。 顺便说一句,我们是其中之一,所以,我也会在最后展示这一点。 这是主办方告诉我们的。 所以,我将讨论这个话题,如果可能的话,我希望让这个对话更具互动性。 所以,如果你有任何问题,请随时阻止我。 让我确保一切都在录制。

那么,今天的主题是如何优化 ASP.NET core 分布式缓存的应用程序性能? 我将使用一个名为的开源产品 NCache. 这里有多少,听说过 NCache 前? 这是一个很好的数字。 好的,我会用 NCache 举个例子。 这个谈话不是关于 NCache, 这是关于 ASP.NET Core 性能以及如何使用缓存? 所以,我确定你来这里是因为 ASP.NET core 已经流行,越来越流行,它是新的干净的轻量级架构,它是跨平台技术,.NET 的重新架构是开源的,有很多 ASP.NET 遗留应用程序也在迁移到 ASP.NET core。 ASP.NET core 将成为您在 .NET 中开发 Web 应用程序的主要技术。

因此,现在越来越多的人正在开发需要可扩展性的应用程序。 所以,ASP.NET core 当然也需要可扩展性。 让我快速定义什么是可扩展性? 我相信你们中的大多数人已经知道这一点,但为了完整起见,我将对此进行定义。

什么是可扩展性?

可扩展性是如果您有一个应用程序,它具有非常好的响应时间,它在五个用户时表现非常好,如果您可以在五千、五万、五十万用户时保持相同的性能,那么您的应用程序是可扩展的。 如果您的应用程序在五个用户中表现不佳,那么您还有其他问题,我们不打算在这里讨论。 因此,我将讨论如何从五个用户到五万或五十万用户保持良好的性能。

线性可扩展性

线性可扩展性意味着您的应用程序的架构使得您可以随着负载的增长在生产中添加更多的服务器,并且随着您添加更多的服务器,您的事务容量也会增长,如果您能够维护,这就是为您提供良好性能的原因线性可扩展性。 如果您无法保持线性可扩展性,那么就会出现某种瓶颈,当您添加更多服务器时,您的应用程序将很快面临瓶颈,很快您是否添加更多服务器都将无关紧要,您将刚刚遇到瓶颈,有,我会谈谈瓶颈。

以下应用程序需要可扩展性

那么,哪些应用程序需要可扩展性? 通常,服务器应用程序,这些是 Web 应用程序,ASP.NET core, Web 服务,由其他 Web 应用程序使用。 Web 服务可以是外部应用程序使用的独立应用程序,也可以是您正在开发的 Web 应用程序的一部分,无论哪种方式,如果它们是高事务性的,它们也需要可伸缩性。

微服务现在正在成为一个热门的新流行语,这就是您想要重新架构您的应用程序的方式。 微服务也将成为他们的服务器端技术,它们用于高事务应用程序并且需要可扩展性。 对于任何其他服务器应用程序,许多大型组织在后端都有批处理,他们需要在后端进行工作流。 一堆只需要尝试处理大量事务的后端服务器应用程序,它们也需要可扩展性。 因此,如果您的公司或您从事任何这些类型的应用程序并且您希望获得良好的性能,那么这就是您的话题。

可扩展性问题

那么,既然我们已经确定这些应用程序需要可伸缩性,那么是否存在可伸缩性问题? 是的,有但不在应用层,ASP.NET core 随着事务负载的增长,您可以非常轻松地添加更多服务器,通常,您在应用层前面有一个负载均衡器,它将流量均匀地引导到所有服务器,并且随着用户越来越多,您只需添加更多的盒子,没有问题。 问题当然是数据存储或数据库。 这些是您的关系数据库,您的大型机,这是原因之一,为什么 NoSQL databases 开始受到关注,但事实证明,在大多数情况下,出于技术和非技术原因,您仍然必须使用关系数据库。 因此,如果您查看您已经完成或正在执行的大多数应用程序,您最终会使用关系数据库,在 .NET 的情况下,最流行的当然是 SQL 服务器。 所以,如果你不能使用 NoSQL database,它对可扩展性有什么好处? 原因是 NoSQL database 要求您放弃关系数据库并将数据移入 NoSQL,对于一些数据你可以,对于很多业务数据你不能,你所有的客户、你的账户​​、你的活动,所有这些仍然需要保留在关系数据库中。 所以,你必须用图中的关系数据库来解决这个可伸缩性问题,这就是我这么说的原因 NoSQL database 并不总是答案,因为您无法使用它。

解决方案(分布式缓存)

因此,解决这个问题的方法当然是使用分布式缓存,这就是在您的环境中部署分布式缓存的方式。

分布式缓存

所以,这是应用层,在某些情况下,你可能在前面有一个负载均衡器,它将流量引导到所有应用服务器。 在某些情况下,可能没有负载均衡器,可能有其他方式共享负载,因为这些是一些后端应用程序,但无论如何,您有多个服务器正在运行您的应用程序。 因此,这是非常可扩展的,但是您无法继续添加越来越多的数据库。 现在,关系数据库公司正在尝试尽可能多地扩展自己的终端,例如,他们拥有内存中的表,这些表要快得多。 我认为 SQL Server 也没有在它们所在的地方引入只读副本的概念,所以如果你将内存表与只读副本结合起来,你会得到性能提升,但正如你将看到的,我将进入这。 您创建的副本越多,您就越头疼,因为每次更新任何内容时都必须在所有副本上进行更新。 因此,要获得具有可扩展性的最佳性能,就是确保您拥有的副本不超过一个。 因此,每条数据都有一个主副本和一个副本,同时,您必须能够扩展。 所以,他们不能这样做的原因是关系数据库不能像分布式缓存那样分区。 NoSQL database 可能是因为分布式缓存和 NoSQL 是键值对,这是与关系数据库非常不同的设计,但最终,您必须在应用程序层和数据库之间放置一个分布式缓存作为缓存层。

那么,就配置而言,这是什么样的呢? 因此,通常这些不是非常昂贵的盒子。 这些通常是 8 核到 16 核盒、大量内存 16 到 32 千兆位内存和 1 到 10 千兆位网卡。 有时你有两张网卡,一张用于集群,一张用于客户端的工具类,但仅此而已,这与使用高端、大量处理能力的数据库服务器来完成你的工作非常不同,因为只有其中一个或很少。 所以,没有其他方法可以解决这个问题。 我们告诉我们的客户每盒不能获得超过 64 GB 的 RAM,因为当您在 .NET 环境中拥有超过 64 GB 的 RAM 时,必须通过垃圾收集来收集该内存,并随着您收集越来越多的内存而收集比你需要更多的处理能力。 所以,然后你会遇到同样的问题,即开始购买非常昂贵的盒子。 最好获得 32、16 到 32 位、16 到 32 千兆内存,但更多的盒子会更便宜。

分布式缓存如何工作?

那么,分布式缓存有什么作用呢? 它实际上构建了一个集群,我再次从一个 NCache 透视图,还有其他喜欢的 Redis 做类似的事情,但以不同的方式。 所以,分布式缓存将构建一个集群,它是一个基于 TCP 的集群,集群中最重要的是,就像您不希望数据库在生产中停机一样,您也不希望缓存要么下去。 所以,这个集群必须是高可用的。 因此,使其对客户高度可用的最佳方法是确保它具有对等架构,其中每个节点都是平等的公民,任何节点都可以关闭,或者您可以添加更多盒子,没有主 - slave,因为这会产生复杂性和高可用性问题。 因此,它将资源、内存、CPU和网卡作为资源进行池化。 因此,当您添加更多时,假设您有越来越多的流量或越来越多的交易,您以后会以 4 比 1、5 比 1 的比例添加更多服务器,您通常会添加更多盒子。 最少两台缓存服务器,然后你继续添加更多,所以你会从两台开始,你会开始有越来越多的负载,突然一切都会开始变慢,你添加第三个盒子,当你添加更多时,一切都会改善加载并添加更多盒子,这里的事情开始减慢到某个点。 您添加第四个框,然后图片就可以了。

所以,这就是它线性扩展的方式,理论上,没有什么是无限的,但它可以在更多情况下扩展,它以无限的方式扩展,没有瓶颈。 因此,这使您不会让您的数据库成为瓶颈。 因此,这已成为您的应用程序架构的基本最佳实践。 如果你在做高事务应用程序,你必须合并分布式缓存,因为这是唯一的方法,你将能够获得性能,因为它都是在内存中的,任何接触磁盘的东西都不会像在内存中一样快-内存和可伸缩性,因为它是分布式的。 在我去之前有什么问题吗? 实际上,在 NCache 您可以。 NCache 支持 .NET 和 Java,但如果您有其他应用程序,如 Python 或其他应用程序,则无法使用 NCache,然后您必须使用其他缓存解决方案,但应用程序需要处于可扩展环境中。 基本上,无论您使用什么语言,功能都保持不变。 有一些好处,如果您是 .NET 应用程序,那么 NCache 它为您提供了许多 .NET 特定的好处,它是一个完整的 .NET 堆栈,它的 .NET 课程堆栈,因此非常适合。 Java 方面也有类似的产品,它们也被称为内存数据网格,因此它们非常适合 Java 堆栈。 例如,我将分享一些信息。 所以, NCache 有 Java API,但唯一使用 Java API 的人是购买者 NCache 或使用 NCache 从 .NET 的角度来看。 所以,他们有 NCache 在内部,他们说不妨将它用于 Java,Java 商店会寻找基于 Java 的内存数据网格,.NET 商店会寻找 NCache. 因此,由于所有专业知识,这就是市场细分的方式,如果您是 .NET 商店,那么您拥有与 Java 相比的所有 .NET 专业知识。 那么,为什么要把图片复杂化呢? 对于数据库,那么非SQL数据库可以用任何数据库吗? 任何人,任何人,因为您访问数据库的方式是通过您自己的位于缓存层上的自定义代码。

因此,我将介绍的另一个功能是,确保缓存与数据库保持同步的基本功能之一是您的自定义代码需要存在于缓存服务器上。 如果您将缓存设置为黑匣子,则缓存中除了数据之外没有任何内容,就像拥有没有触发器和存储过程或其他东西的关系数据库一样。 因此,这限制了您对缓存的使用。 因此,缓存开始只是一个黑匣子。 Memcached 是一个流行的缓存,它什么也没做,只是一个商店,随着时间的推移,它们演变成一个适当的智能实体,它们也可以在其中运行你的代码。 任何 NoSQL,任何关系型数据库都可以使用。 再说一次,我所说的所有这些功能都是开源的和企业级的。 所以,这就是我提到它的原因,因为它是开源的。 还有其他问题吗? 处理的时候 NCache 它主要是自动缓存还是您使用 API 来缓存? 因此,我将更详细地介绍,但这取决于您要缓存的内容? 某些类型的缓存使用是自动的。 例如,如果您将 ASP.NET core session 那么它是一个可插入的模块,它只是插入并开始将会话存储在缓存中,因此您无需做任何事情,但是如果您要缓存应用程序数据,这就是大部分好处所在,所以你必须调用一个 API 来确定你想要缓存什么? 你想缓存多久? 你想如何将它与数据库同步? 还有很多其他的事情,你必须记住。 因此,我将介绍您应该如何使用分布式缓存的所有这些功能,例如 NCache 确保您可以缓存各种数据,但有一个 API。 是的。

使用分布式缓存

好的。 所以,既然我们已经确定分布式缓存很重要。 它为您提供了性能和可扩展性,让我们来看看如何使用分布式缓存,您可以通过三种可能的方式使用它。 三大技术用例。

应用数据缓存

第一个是应用程序数据缓存,这就是我迄今为止一直在谈论的内容,我将很快详细介绍。 在应用程序数据缓存中,有一件事是您必须牢记数据存在于数据库和缓存中。 那么,数据存在于两个地方,当数据存在于两个地方时,最常见的可能出错的地方是什么? 它们可能会不同步,因此客户可以从银行两次从缓存中提取这百万美元,从数据库中提取一次,因此您不希望出现这种情况。 过去这种情况非常糟糕,以至于当你提到缓存这个词时人们会使用,大多数人的想法是我只是要缓存只读数据。 数据永远不会改变,因为如果我缓存任何改变的东西,我就不可能有麻烦。 因此,我将介绍如何确保不会发生这种情况,但这是在应用程序数据缓存中要记住的最重要的事情。

ASP.NET Core 特定缓存

第二个用例是 ASP.NET core- 特定的缓存,您可以从 ASP 缓存两件事.NET core. 一个是会话,几乎每个 ASP.NET core 应用程序使用会话,而您在以前的 ASP.NET 环境中,Microsoft 提供了三个存储选项 InProc、状态服务器和 SQL,第四个是自定义。 前三个实际上不起作用,但第四个允许您插入缓存但在 ASP 中.NET core 他们实际上已经从 git 代码中做了正确的事情,他们实际上已经对其进行了架构,使其基于 IDistributedCache 接口。 因此,它允许您插入第三方商店,您可以插入类似的东西 NCache 它会自动开始存储您的会话,我将向您展示这是如何完成的。

ASP 中的第二件事.NET Core 是响应缓存,也就是可以缓存的页面输出。 因此,下次调用该页面时,甚至不应该执行该页面,如果它没有更改,它应该只返回输出。 如果它要再次重现相同的输出,那么他们为什么要重新运行或执行页面? 为什么不只提供输出,所以这就是在 ASP.NET 中调用的输出缓存,现在称为响应缓存。 它现在基于更多的 HTTP 标准。 因此,您可以在边缘插入第三方内容缓存,这是不可能的,但我也会介绍。 应用程序数据缓存和 ASP 之间要记住的区别.NET core 缓存与应用程序数据缓存不同,数据存在两个地方,现在数据只存在于缓存中,因为缓存在内存中,如果任何缓存服务器出现故障,这些数据将丢失,除非有复制. 因此,请记住非常重要的一点,即任何不能为您提供良好复制的缓存都不适合缓存会话或数据中的其他趋势。

还有第三个 ASP.NET core- 特定的东西,称为 SignalR,我不打算讨论,如果你有实时网络应用程序,它可以提供实时反馈,假设股票价格必须一直更新。 因此,它也可以使用分布式缓存作为其背板,但我没有提到它。

安全的

前两个中的任何问题,如果需要,我会更详细地讨论这些问题。 因此,首先,缓存存在于您的应用程序后面。 它位于应用程序和数据库之间。 一般来说,在相当安全的环境中。 如果他们的应用程序位于 DMZ 中,我们的客户可能会将缓存保留在靠近防火墙的位置,而不是将缓存保留在 DMZ 中。 有时他们将其保存在 DMZ 中,但大多数时候,它处于安全状态,但我们的许多金融服务客户,如大银行等,他们对此并不满意,因此,他们想要更多的证券。 所以,这就是企业版的 NCache 具有可以进行加密的功能。 因此,您放入缓存中的所有数据都将自动使用 3DES 或 AES256 加密,然后还有安全性,所有到缓存的连接都将通过 Active Directory 进行身份验证,并且会有授权的事情。 因此,企业版中内置了完整的安全功能。

除非他们的数据是敏感的,否则普通客户不会使用加密。 因此,如果他们保留财务数据,则存在一些合规性问题或 HIPAA,因此,如果您一旦遇到合规性问题,那么即使您的环境是安全的,您也必须更进一步,这就是您要进行加密的地方. 所以, NCache Enterprise例如,将在客户端和缓存层之间进行 TLS 连接。 因此,该连接本身是完全安全的,而且您具有内置加密功能,因此无论数据保存在内存中,它也以加密形式保存。 这非常令人满意,我的意思是我们有很多金融服务客户,他们对此非常满意。

NCache 可以部署,我们的大多数客户仍然在本地环境中使用它。 因此,他们有自己的数据中心来部署他们的应用程序,所以他们部署 NCache 作为他们申请的一部分。 如果你在云端, NCache 在 Azure 和 AWS 中都可用,它可以作为 VM 使用,或者我们也即将启动托管缓存服务,无论哪种方式,我们都会确保 NCache 位于云中的虚拟网络中。 因此,在本地部署中,这不是问题,因为始终在您自己的环境中,您只需获得一堆虚拟机,或者如果您拥有自己的数据中心,您可以获得自己的服务器,然后将它们与应用程序一起部署。 你安装 NCache 作为软件,它用于内部安装,你也可以使用 docker,你看到了所有你期望现代应用程序能够做的事情, NCache 会做。 然后在云中,您可以获取 VM 或获取托管缓存,但在云中,如果是 AWS,我们将始终在您的 VPC 中创建它,如果是 Azure,我们将始终在您的 VPC 中创建它。 它在您的虚拟网络中。 所以,它接近你的应用程序,因为如果不是你必须跨越多个跃点增长,假设它是一个托管缓存,这对于小型应用程序来说可能没问题,但任何严重的事情, NCache 几乎总是在您通过该应用程序开展业务的关键任务应用程序中使用。 所以,这就是你要使用的地方 NCache.

因此,在这些情况下,您不能承受任何减速,如果您不能承受减速,那就是您想要所有控制并保持缓存尽可能靠近应用程序的地方。 这取决于您要做什么用例,例如,最大和最快的好处是会话,您可以立即将其插入而无需更改任何代码。 这只是一个配置更改。 在 ASP 的情况下.NET core,这不是配置更改。 这是一个启动文件代码更改,但非常小,但如果您想做应用程序数据缓存,那么它仍然是一个非常简单的更改。

让我快速向您展示一下 API 的样子。 所以,看看这个API。

缓存连接
Cache cache = NCache.InitializeCache("myCache");
cache.Dispose();
获取数据
Employee employee = (Employee) cache.Get("Employee:1000");
Employee employee = (Employee) cache["Employee:1000"];
bool isPresent = cache.Contains("Employee:1000");
写入数据
cache.Add("Employee:1000", employee);
cache.AddAsync("Employee:1000", employee);

cache.Insert("Employee:1000", employee);
cache.InsertAsync("Employee:1000", employee);
cache["Employee:1000"] = employee;

Employee employee = (Employee) cache.Remove("Employee:1000");
cache.RemoveAsync("Employee:1000");

它只是一个很小的cache.get、cache.add、Insert、remove。 所以,你有一个键和一个值作为你的对象。 所以,很容易合并,但你必须去做,所以每当你从数据库中获取数据时,你首先检查缓存,如果缓存有它,你从缓存中取出它,否则你去数据库得到它,你把它放在缓存中,这就是模型。 确切地。 我要加快速度,否则我不会成功。 我会给你看 NCache 稍晚一些。

Pub/Sub 消息传递和事件

因此,发布/订阅消息传递也是一个非常强大的功能。 今天的许多应用程序必须协调工作。 我今天和某人交谈,他说他们需要做很多基于事件的编程。 因此,发布/订阅消息传递为您提供了一个非常强大的事件驱动编程模型,因为您拥有一个基础架构,它现在是应用程序中的内存中可扩展平台,您可以将其视为消息传递总线。 它不适用于分布式环境。 它适用于同一个数据中心的一种位置类型的情况,但它非常快,因为它都在内存中并且是可扩展的。 因此,这是使用分布式缓存的第三个用例,例如 NCache. 是的,确实如此,而且开源也支持它。 因此,所有这些功能都可以在开源和企业中使用,事实上,所有的 NCache API 在开源和企业之间几乎相同。

我们再次看到 pub/sub 的情况是,如果您有一个高流量应用程序、高事务,那么您真的需要 pub/sub 引擎超级快,这就是 NCache 真的很闪耀。

ASP.NET Core 应用数据缓存

好的。 因此,应用程序数据缓存。 你怎么做呢? 所以,这也是在那里回答的,所以你可以通过三种方式来回答。

ID分布式缓存

可以使用 ASP 的 IDistributedCache 接口.NET core 附带,如果你已经针对它进行了编程,你可以插入 NCache 作为提供者。 因此,一旦您完成了 IDistributedCache API 编程,就没有进一步的代码更改。 因此,好处是您只需编程一次,就不会被任何一家缓存供应商所束缚。 缺点是它是最小公分母。 我会向你展示它的样子,仅此而已。 它有 Get 和 Put 就是这样。 您知道 Get、Remove 和 Set,而要充分利用缓存,您还需要做更多的事情,我们正在讨论您希望缓存与数据库同步的事实。 所以,它有利也有弊。

Entity Framework Core Cache

第二个是如果你有一个 EF Core 应用程序,你有一个 EF Core 应用程序,这是一种更简单的插入方式 NCache 我会告诉你的。 所以,我们实际上已经为 EF Core 实现了扩展方法,这也是开源和企业级的。 有 EF Core 示例。 好的。 所以,如果你有一个 EF Core 应用程序,你通常会有一个这样的 EF Core 查询,你会使用 LINQ 样式查询来获取一些东西。 所以,我们已经实现了一个扩展方法,比如说 FromCache,所以它们是一堆方法,这是其中之一,所以如果这个查询最后存储在缓存中,就会说转到缓存,从缓存。 如果它不在缓存中,请转到数据库,运行此常规 EF 核心查询,获取它并将其放入缓存中。 因此,只是一行或只是一个方法调用自动开始缓存来自数据库的所有数据。 因此,它简化了您的工作,并且您确切地知道在哪里插入,您不必做很多额外的 API 调用。

因此,对于 EF 核心应用程序,代码再次更改,但您可以做的尽可能少,并开始缓存数据。 所以,实际上,对于 EF 核心,它们是一堆方法,这是 FromCache,其中大部分来自,您可以使用大约四五个方法,FromCache,然后是 LoadIntoCache,FromCacheOnly。 因此,对于 EF Core,当您保存更改时,它还会在更新数据库之前或之后更新缓存,它也会更新缓存。 因此,缓存具有数据的更新版本。 缓存的完整性首先是通过确保您保存在缓存中的任何数据以及我将要跳转的数据来维护的,例如,这是一个缓存服务器。 假设您有两台服务器,假设您有三台服务器。 整个缓存被分成多个分区,每个分区都有自己的一组存储桶,因此您的数据仅驻留在其中一个分区中。 因此,然后将该数据复制到其他一些服务器,这称为副本,但在这种情况下为副本 NCache 不是主动的,它是被动的,您的应用程序不与副本对话。 您的应用程序只与分区对话。 因此,由于数据仅存储在一个位置,因此不存在同步问题。 每个人都去同一个服务器,但是因为它是分区的,所以不是每个人都去同一个服务器,一些密钥存储在这里,一些存储在这里,一些存储在这里。

分区副本

所以,这就是分布式缓存的样子 NCache 可以做SQL server做不到的,因为关系型数据库的本质是不能分区,而分布式缓存的本质是可以,这里分区的时候,这三个服务器,可能十个应用服务器共享每个应用服务器可能有四个或五个或六个或八个工作进程。 因此,有很多不同的客户端进程与缓存通信,不存在同步问题,因为实际数据仅存储在一个位置。 现在还有其他拓扑 NCache 被复制的,相同的数据存在主动-主动和多个,在这种情况下, NCache 必须同步更改。 它是基于令牌的,它是一种基于序列的更新算法,它的可扩展性不是很好。 因此,我们不建议将其用于高交易环境。

带复制的分区缓存是更好的策略,或者我们称其为更好的缓存拓扑。 所以,就是这样 NCache 确保在缓存中,数据始终正确。 这回答了你的问题吗? 那么,您所显示的端口,代码上是否有任何配置或设置,说明它必须从哪个缓存中获取它? 是的。 因此,例如,当您进入 app.config 时,您会看到它会说您使用 mycacheId,我会告诉您缓存是什么。 因此,当您在 NCache. 每个缓存都有一个名称,并且该名称在后台知道缓存在哪里,所以您要做的就是在此处指定名称,然后它知道从哪里获取缓存。 我会告诉你缓存实际上是什么样的。 一个缓存名称在所有这些服务器上,并且在同一台服务器中,您可以有多个缓存名称,在同一台服务器上,您可以有多个缓存,一个缓存可以存在于多个缓存上,并且是分布式缓存,一个缓存名称必须存在在多台服务器上是这样分布的,但是相同的服务器也可以用于其他缓存名称,并且每个缓存名称都具有其隔离性。 好问题。

高可用性

所以,这就是我所说的高可用性非常非常重要的地方。 如果您无法在运行时不间断地添加或删除服务器,那么您的应用程序确实不是高度可用的。 我们有客户一直在运行 NCache 数月乃至数年没有任何停顿。 因此,例如,假设您有一个两台服务器配置,并且您刚刚添加了第三台服务器,因为您的负载增加了。 因此,您需要添加第三台服务器,您所要做的就是添加第三台服务器,我将通过工具向您展示它,只需添加一个,然后 NCache 幕后会重新分区。 因此,这两个分区现在将转换为三个分区。 当应用程序运行时,此处和此处的一些存储桶将自动分配到第三个分区,您的应用程序甚至不会注意到这一点。 在幕后,现在存在第三个分区,并且现在副本也已创建第三个副本,因此假设副本 2 需要移动到此处,而副本 3 则在此处创建。

分区副本2

NCache 维护它,在这背后 NCache 使用键进行哈希映射,但它是动态完成的,所以就像一个分布映射,它就像一个桶映射,它被重新分区和重新分配。 因此,数据实际上会在运行时自动从一台服务器移动到另一台服务器。

位置关联性

因此,在某些情况下,您可能希望将一些数据一起保存在同一个分区上。 NCache 具有位置相似性功能,您可以在其中指定,然后您将指定它。 你会说这两条数据是相关的,我希望它在同一台服务器上,然后 NCache 将通过它在其上创建的额外密钥将其保存在同一台服务器上。 正如我所说,所有这些都是高级功能,如果您只使用最小公分母,您将无法获得这些功能,并且通过使用这些功能,您可以进行调整 NCache 根据您的需要具体到您的环境。

应用数据缓存功能

所以,我首先要介绍的是这些主题,这些非常重要。 对于应用数据缓存来说,最重要的是缓存永远是新鲜的,即新鲜意味着它有正确的数据,如果数据库中的数据发生变化,缓存有最新的数据。

基于时间的到期

所以,过期是缓存最常见的方式,几乎所有的缓存都有过期的特性。 NCache 也有。 有一个绝对到期,然后有一个滑动到期。 绝对过期是,假设您正在将数据添加到缓存中,可以在五分钟后说确定,因为我认为将其保存在缓存中超过五分钟对您来说是不安全的。 所以,你做出了一个有根据的猜测,将数据保存在缓存中五分钟是安全的,这对于某些数据来说已经足够了,但对于其他数据可能就不行了。

滑动到期更适用于存储会话并且在没有人使用它之后说好的,在每个人都使用完该会话之后将其删除。 所以,这更像是一个清理到期。 绝对过期是同步是为了保持它与数据库一致,滑动是清理,但过期是有根据的猜测,无论猜测是错误的

数据库依赖

在某些情况下,您可以让数据不一致,而在某些情况下您不能。 所以,如果你不能,那么你必须拥有其他功能,所以这就是 NCache 真正突出的是,例如,您可以将缓存与数据库同步。 所以, NCache 使用 SQL Server 中内置的 SQL 依赖项来监视 SQL Server。 所以,你可以为你缓存的每一个项目,你可以说 ok 将它映射到 SQL 数据库表中的相应行, NCache 监视它,如果该行发生变化, NCache 然后要么从缓存中删除该项目,要么重新加载它。 所以,现在你突然有了一个智能缓存,它能够确保无论你在缓存什么,它总是一致的,如果缓存是一个黑盒子,这是你无法获得的。

因此,您必须能够通过缓存获得这种类型的智能,并且 SQL 依赖项是 .NET 功能,所以这就是 NCache 如果您的数据库是 SQL,那么 .NET 会有所帮助。 现在,我们也是 Oracle 依赖项,它也使用 Oracle 数据库通知,还有另一种方法是我们基于轮询的通知,它更有效,但它不是实时的,然后您还可以与缓存同步非关系数据源。 您的数据可能位于 NoSQL database,它可能在云中,可能在任何地方,并且您希望能够对其进行监控。 因此,您可以创建我们称之为自定义依赖项的东西,即位于缓存服务器上的代码。 NCache 每隔一段时间调用它,它会检查你的数据源,如果数据发生变化,它会通知 NCache,好的,数据已更改,请删除或重新加载。

所以,这是一个领域 NCache 真的真的很强。 如果你想让你的数据保持新鲜,你必须能够做这些事情来确保缓存是新鲜的。

直读和直写

另一个特点是通读和通写。 所以,现在这与过期和数据库同步相结合。 这允许缓存从您的数据库中加载数据,例如,如果您有通读,我将向您展示通读的样子。 它只是您实现的一个接口,您的代码实际上驻留在缓存中,所以这里有一个您实现此代码的接口。 所以,有一个来自源调用的负载,它给你一个键,然后 NCache 调用你的方法,缓存服务器调用你的方法,这段代码在服务器上运行,所有的缓存服务器, NCache 调用此方法并说请继续加载此密钥,因为它不在缓存中。 所以,如果我做一个cache.Get,我认为那个键不在缓存中,我要么返回一个null,说这个键不存在,要么如果我有一个通读,我可以直接去缓存,和 NCache 可以去数据库为你读取。 所以,你将永远拥有它。 现在,这在许多情况下都非常有用,您只想将数据始终保存在缓存中。

因此,通读允许您在将通读与到期或数据库同步结合使用时,在数据到期时执行的操作 NCache 可以自动刷新,为什么要去掉? 如果您要重新加载它,无论如何下一次,因为需要该数据并且您将其过期只是为了保持新鲜。 那么,为什么不只是拥有 NCache 返回并重新加载它。 如果您已实施通读, NCache 如果数据库或数据源中的数据发生更改并且此同步功能表明数据库已更改,那么如果您实现了通读,它将自动执行并重新加载它会自动执行此操作.

类似地,直写给您带来另一个好处,即如果您有后写功能,您可以更新缓存。 所以,有些数据,它对更新不是那么敏感,我的意思是,如果它是金融数据库余额,你不想做后写,但在某些情况下,如果你可以排队更新就可以了。 所以,如果你更新缓存,更新缓存比更新数据库快得多,当然,更具可扩展性,因为它是分布式的,你更新缓存,你告诉 NCache 请继续更新这个,数据库在幕后异步。 所以,这就是后写特性,现在突然加速你的应用程序,因为瓶颈是什么? 从数据库读取并写入数据库。 读取可以缓存,这样您甚至不需要去数据库,但写入必须去数据库,你不能我的意思是数据库是主权限,所以没有办法绕过它,但后面写的那种这很容易。

所以,这是另一个功能,如果你有它, NCache 突然让您进一步提升您的应用程序。 问题:那么,以防万一,它无法写入数据库并进行异步,它会抛出异常吗? 是的。 它会抛出一个异常,你可以有一个被调用的回调 NCache 代码又是,这个后写代码在缓存服务器上运行,但回调在这里,所以它会通知客户端并且你的回调将被调用,所以你可以采取纠正措施。 一旦你适应了那个缓存, NCache 可以将缓存与数据库同步,你会缓存越来越多的数据。 你缓存的数据越多,缓存就越像数据库,这意味着获取数据的键值方式不够智能。 因此,您必须能够根据 SQL 查找数据,尤其是参考数据。

SQL搜索

当我们谈到 EF Core 查询时,您正在根据属性获取数据,而不仅仅是键。 因此,如果您能够使用 SQL 或 LINQ 查询或使用 EF 核心搜索数据,这会使缓存速度更快。 那是另一种方式 NCache 突出的是,一旦您将所有数据放入缓存中,您就可以搜索,您可以说给我所有位于波士顿或纽约的客户,它会为您提供缓存中的客户对象集合。 因此,它开始看起来更像一个数据库,并且您正在从它的数据库中消除所有压力,尤其是对于参考数据。 因此,SQL 搜索非常非常重要。

好的。 现在我想告诉你什么 NCache 看起来像或任何缓存看起来像? 所以,我登录到 Azure。 所以,我有两个缓存服务器虚拟机。 所以,我有两台缓存服务器,一台 Windows 客户端和一台 Linux 线路,因为有 .NET Core,您可以在 Windows 或 Linux 上运行应用程序,并且 NCache 实际上,缓存服务器也可以在 Linux 上运行,因为 .NET Core 因为 NCache 是 .NET Core 当地人。

天蓝色

创建缓存

所以,例如,我已经为 Windows 客户端做了一个远程桌面。 我将继续创建一个缓存,所以我的缓存将有两台服务器,我将有一个 Windows 客户端,一个 Linux 客户端,当我使用“客户端”这个词时,它实际上是您的应用程序服务器框。 好的。 所以,我要用这个 NCache 管理器工具。 现在这个工具是企业版的一部分,但是您可以通过开源命令行工具或配置文件来做所有相同的事情,但为了方便起见,我将继续创建缓存。

创建信息图

正如我所说的所有缓存都已命名,我将调用我的缓存演示缓存。

演示缓存

我会选择一个拓扑。 我将选择带复制的分区缓存。

分区缓存

我会做异步复制,所以有异步复制和异步复制。 同步复制是指当您希望将这些复制作为更新的一部分发生的更敏感数据、财务数据和其他内容时,您无法承担异步操作,这当然会减慢速度,但会使它们变得更多。

异步

所以,这是我的缓存服务器一,这是我的缓存服务器二,所以我刚刚创建了一个两服务器集群。 它还没有运行。 我将添加两个客户端节点。 这是我的窗户,有一个服务器。 所以,6 是我的 windows 客户端,7 是我的 UNIX 客户端。 好的。 所以,我通常有两个缓存服务器和两个客户端,正如我所说的,你至少有两个缓存服务器,客户端和服务器之间的比例是四比一,五比一。 所以,我现在才开始缓存。 同样,在一个地方,我可以在我们即将推出的下一个版本中完成所有这些工作,这都是基于网络的,所以在云中,你可以做到。 我要打开统计数据,这些就像监控一样,这些是性能统计数据。

统计

模拟压力并监控缓存统计信息

我要测试一下我的客户是否能够与之交谈,现在这个盒子是一个客户。 所以,我要打开 PowerShell 控制台。 我将有两个来自 windows 的部分,我在这里登录了两个 Linux,所以我在这里有一个 Linux,现在这里是 Linux。 对? 在这里,我需要启动 PowerShell,在这里,我还需要导入我不需要为 windows 做的模块,它已经为我准备好了,我需要在这里做同样的事情。 我需要在 Linux 上启动 PowerShell,现在我要启动一个客户端。 所以, NCache 自带这个压力测试工具,让你在自己的环境中进行压力测试变得非常容易。 所以,你可以确切地看到如何 NCache 施行? 因此,您不必对它的性能发表任何评论。 所以,假设在这里,我每台服务器每秒处理大约 500 个请求。

统计数据2

好的。 所以,我想增加负载,所以我要去第二个控制台,我会说再次运行压力测试。

CMD

现在,突然间你会看到这会增加一倍,对,让我继续增加压力。 我会谈到其中一个 Linux 的,我会说同样的话,突然间,每个请求我更像是 1500 个。 所以,现在我每秒总共处理大约 3,000 个请求,比如让我再做一个,现在我每秒处理更多的请求 4,000 个。 所以,如果我有更多的虚拟机,我可以继续添加更多,我可以或者我可以有更多的实例,你很快就会看到,它达到了最大值,这两个服务器应该每秒能够处理至少 50,000 个请求,但同样是在小数据集的情况下,随着对象大小的增加,这当然会下降,但是一旦我达到最大值,我就会一次又一次地继续前进运行正常,我没有第三个虚拟机,但我要做的就是执行此操作并添加第三个地址,然后我会说完成,它将在此处添加第三个框,它将完成所有分区或自动为您重新分区。

同样,如果我需要关闭任何虚拟机,它也会这样做。 是的,就是这样,我的演讲到此结束。 我们可以回答任何问题吗? 这是唯一的本机 .NET 解决方案,唯一的其他本机解决方案是 AppFabric 停产了。 所以, Redis 不是 .NET 解决方案,尽管它是 Microsoft 为 Azure 选择的,因为他们希望与技术无关,所以他们选择了它,但我们是原生的 .NET。 我们从第一天开始就是这样,据我们所知,我们是 .NET 最喜欢的选择。

接下来做什么?

 

注册每月电子邮件通讯以获取最新更新。

联系我们

联系电话
©版权所有 Alachisoft 2002 - 版权所有。 NCache 是 Diyatech Corp. 的注册商标。