0

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

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

例如:

服务器 1:

应用程序[“counter1”] = 120

服务器 2:

应用程序[“counter1”] = 130

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

我想知道的是我怎样才能做到这一点。我虽然关于使用 Amazon ElasticCache,所以即使我在负载均衡器下有 10 个服务器,我也可以通过 API 访问 ElasticCache 变量,我从哪个服务器访问 memcache 变量并不重要,它会获取/设置相同的变量,因此我可以实现保持跨服务器全局变量的目标。

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

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

4

1 回答 1

1

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

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

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

于 2012-07-21T16:57:13.503 回答