我的问题是关于在Amazon EC2上跨多个服务器快速访问的聚合数据。在ASP.NET应用程序中,我可能会将这些数据存储在Application [“somevar”]变量中,以便所有用户可以快速访问它(在内存中)。
当我希望收集聚合数据并且其值在所有服务器上相等时,问题就开始了。如果我选择部署两台服务器,则用户可能每次都将数据传输到不同的服务器(服务器位于负载均衡器或ElasticBean下),例如,如果我计算用户请求页面的次数,则每台服务器都是Application var将具有不同的值
例如:
服务器1:
申请[“counter1”] = 120
服务器2:
申请[“counter1”] = 130
我想要的是一个在所有服务器上都相同的变量。我想在类似Application的变量中使用数据的原因是我希望内存中的数据能够快速访问,然后我可能会将该数据写入数据库。
我想知道的是如何实现这一目标。我虽然使用Amazon ElasticCache,所以即使我在负载均衡器下有10台服务器,我也可以通过API访问ElasticCache变量,无论从哪个服务器访问memcache变量,它都会得到/设置相同的变量,因此,我可以实现保持跨服务器全局变量的目标。
我想知道这是一个好的做法,以及哪里有更好的方法来实现这样的功能。
我正在使用ASP.NET C#和MySQL开发我的应用程序。还要考虑到应该将一些聚合数据写入数据库,并且这样做是为了同时防止大量写入,并在达到20次写入后写入数据,然后将数据写入数据库。
答案 0 :(得分:1)
只是为了清理一些事情。首先,请确保我们了解如何使用ElasticCache。 ElasticCache的API不会在缓存集群上提供任何CRUD操作,Amazon的API严格用于管理服务器和配置。您将需要使用.NET的memcached库连接到群集。使用像memcached这样的缓存是一个很好的解决方案,因为你是第一个问题。它将在分布式环境中轻松快速地存储简单的应用程序变量。即使使用较小的应用程序,使用缓存通常也是一种很好的做法。
我不确定你拥有多少用户或者你期望拥有多少用户,但我在编程时学到的一件事就是过度优化通常是一个坏主意。过度优化是指在真正需要之前开始优化代码。以你提出的优化为例。我们知道,对数据库进行1次写入比写入20次更快,当然一般来说。但是,除非您的数据库是应用程序中实现此类功能的瓶颈,否则会引入大量复杂性,从而无法立即获益。如果memcached群集服务器崩溃了,那么等待写入数据库的数据就会丢失。如果你真的有很多用户,那么你必须开始考虑并发和锁定memcached项目。
在不了解您的应用程序的情况下,我无法提出任何真正的建议,除非在您花时间增加应用程序的复杂性之前确保需要进行优化。