asp.net - 每个用户或全局(对于所有用户)的跨服务器内存数据(作为变量)

标签 asp.net mysql caching amazon-web-services

我的问题是关于跨 Amazon EC2 上的多个服务器快速访问的聚合数据。在 ASP.NET 应用程序中,我可能会将该数据存储在 Application["somevar"] 变量中,以便所有用户都可以快速访问(在内存中)。

当我希望收集聚合数据并且其值在所有服务器上相等时,问题就开始了。如果我选择部署两台服务器,用户可能每次都会将数据传输到不同的服务器(这些服务器位于负载均衡器或 ElasticBean 下),例如,如果我计算用户请求该页面的次数,则每个服务器的应用程序变量将具有不同的值

例如:

服务器 1:

应用程序["counter1"] = 120

服务器2:

应用程序["counter1"] = 130

我想要的是一个在所有服务器上都相同的变量。我想要类似应用程序的变量中的数据的原因是我希望该数据位于内存中以便快速访问,然后我可以将该数据写入数据库。

我想知道的是如何才能实现这一目标。我想使用 Amazon ElasticCache,所以即使我在负载均衡器下有 10 个服务器,我也可以通过 API 访问 ElasticCache 变量,并且无论我从哪个服务器访问 memcache 变量,它都会获取/设置相同的变量,因此我可以实现保留跨服务器全局变量的目标。

我想知道这是否是一个好的做法,以及哪里有更好的方法来实现此类功能。

我正在使用 ASP.NET C# 和 MySQL 开发我的应用程序。还要考虑到一些聚合数据应该写入数据库,我这样做是为了防止同时大量写入,例如达到20次写入后才写入数据,然后将数据写入数据库。

最佳答案

只是为了澄清一些事情。首先让我们确保我们了解如何使用 ElasticCache。 ElasticCache 的 API 不为我们提供缓存集群上的任何 CRUD 操作,Amazon 的 API 严格用于管理服务器和配置。您将需要使用 .NET 的 memcached 库来连接到集群。使用像 memcached 这样的缓存是解决第一个问题的好方法。它将轻松快速地在分布式环境中存储简单的应用程序变量。即使对于较小的应用程序,使用缓存通常也是一个好的做法。

我不确定您有多少用户或您期望有多少用户,但我在多年的编程中学到的一件事是,过度优化通常是一个坏主意。过度优化是指在真正需要之前就开始优化代码。以您建议的优化为例。当然,我们知道,一般来说,对数据库进行 1 次写入比进行 20 次写入要快。但是,除非您的数据库是应用程序中实现此类功能的瓶颈,否则您会引入大量的复杂性,但不会立即带来好处。如果 memcached 集群服务器崩溃(它肯定会崩溃),那么等待写入数据库的数据就会丢失。如果您确实有很多用户,那么您必须开始考虑并发性和 memcached 项目上的锁定。

如果不了解有关您的应用程序的更多信息,我无法提出任何真正的建议,只能说,在您花时间徒劳地增加应用程序的复杂性之前,请确保需要进行优化。

关于asp.net - 每个用户或全局(对于所有用户)的跨服务器内存数据(作为变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592979/

相关文章:

ASP.NET Web 服务(复数)或具有多个类的 Web 服务

c# - 将 web.config 作为第三方 Web 服务提供商分发的正确方法

asp.net - 如何使 HTML5 input required 属性与 .NET 一起运行?

mysql - SQL 返回具有总和值

mysql - Easy PHP 和 mysql ..php 无法看到本地电脑上的数据库(所有工作都在服务器上)

python - 如何清除 memoize 缓存?

c# - MySQL - 当类似的 CREATE TABLE 不存在时,CREATE TABLE 会引发错误

javascript - 如何将这些值替换为 NodeJS 中的 sql 表达式?

php - 最快的 PHP 内存缓存/哈希表

sql - 预热数据库(将整个数据库放入缓存)