这个问题适合经验丰富的建筑师 - 大男孩们如何做到这一点? :)
概述
我正在构建这种高流量,基于.NET的解决方案,它最终将托管在Azure上。让我们假设这个网络应用程序每天都会收到500M +“交易”,这些都是我们服务器非常快速的点击,每个都需要很少的数据库查询,几乎所有繁重的工作都会在设定的时间间隔内在服务器端完成。我非常确定我必须实现某种类型的队列,该队列将存储所有传入的命中并在后端实现“聚合器”,这些聚合器将每隔一分钟左右运行以处理队列中的新项目。
建议的解决方案
如果我错了,请纠正我,但我想将这些事务直接写入数据库(某种日志表)将是一个错误,因此我将利用Azure存储帐户(表)进行队列和旋转关闭几个Azure Worker Roles(根据需要)处理数据并更新数据库。想法?
重要的是要记住Azure存储主要基于每个转换模型,因此我必须为所有传入的转换(写入)和我的聚合器(读取)的事务付费。因此每天500M写入和500M读取,每天约100美元。那有意义吗?此外,使用Azure存储可以读取一行(用于说明单个事务)或者我当时必须读取一个记录的队列吗?
最后,对每行执行数据库插入/更新对我的聚合器来说是一种过度杀伤,所以我认为每个人都应该在内存中聚合工作负载,然后将其清除到数据库。
答案 0 :(得分:3)
我同意更新存储中的分析数据的请求应该通过丢弃到队列的消息来完成,这样工作者角色可以在后台处理这些消息,而不会影响实时用户。您甚至可以使用AzureWatch @ http://www.paraleap.com
之类的内容,根据队列中的数据量自动扩展服务器我建议您考虑每个队列每秒最多可支持500个事务的事实。如果您需要更多,请考虑托管多个队列并为您的队列设置模式(可能就像拥有可以随机连接的X队列一样简单:“Queue001..Queue100”。工作者角色将检查所有100个队列,而您的Web服务器将生成1到100之间的随机数并连接到该队列
交易金额实际上可能要大得多: 每天500M点击您的服务可能意味着:
现在,如果您希望最小化队列的写入/读取量,请考虑将来自Web服务器的请求缓冲到队列,以便不是每个数据点都作为单个消息发送,而是一起批量处理。这将限制对队列的命中,这些队列也算作事务(读取和写入)。您可以在网站中使用带有静态变量的锁来捕获命中数,以便将所有内容存储在内存中,然后一次性刷新到队列
如果希望最小化针对表存储的存储事务量,请考虑使用本地存储来预先聚合数据,并仅将预先聚合的数据同步到表存储。这可能会有所帮助
每当我们缓冲数据写入时,假设如果由于某种原因具有缓冲数据的机器出现故障且缓冲区尚未刷新,则可能会丢失一些数据。由于我们在这里没有处理货币交易,我假设您对数据丢失的容忍程度略高于0,并且通过缓冲写入来节省成本可以抵消潜在的罕见数据丢失
HTH