1

这个问题是针对有经验的建筑师的——大男孩是怎么做的?:)

概述

我正在构建这个基于 .NET 的高流量、类似分析的解决方案,它最终将托管在 Azure 上。假设这个 Web 应用程序每天将收到 5 亿+“事务”,这些对我们的服务器的访问速度非常快,几乎不需要对每个数据库进行查询,几乎所有繁重的工作都将在服务器端按设定的时间间隔完成. 我很确定我必须实现某种队列来存储所有传入的命中并在后端实现“聚合器”,该后端将每分钟左右运行一次以处理队列中的新项目。

建议的解决方案

如果我错了,请纠正我,但我认为将这些事务直接写入数据库(某种日志表)将是一个错误,所以我将使用 Azure 存储帐户(表)作为我的队列并分拆几个Azure 工作角色(根据需要)来处理数据和更新数据库。想法?

重要的是要记住,Azure 存储主要基于每个事务模型,因此我必须为所有传入事务(写入)和聚合器(读取)的事务付费。因此,每天 5 亿次写入和 5 亿次读取,这大约是 100 美元/天。那有意义吗?此外,通过使用 Azure 存储,我可以读取一组行(以考虑单个事务)还是我必须同时读取队列一条记录?

最后,为每一行执行数据库插入/更新对于我的聚合器来说是一种过度杀伤,所以我认为每个聚合器都应该聚合内存中的工作负载,然后将其清除到数据库中。

4

1 回答 1

3

我同意更新存储中的分析数据的请求应该通过丢弃到队列的消息来完成,以便工作角色可以在后台处理这些消息而不会影响实时用户。您甚至可以使用 AzureWatch @ http://www.paraleap.com之类的工具,根据队列中的数据量自动扩展服务器

我敦促您考虑每个队列每秒最多可以支持 500 个事务的事实。如果您需要更多,请考虑托管多个队列并为您的队列设置一个模式(可能就像拥有可以随机连接的 X 个队列一样简单:“Queue001..Queue100”。工作角色将检查所有 100 个队列,而您的 Web 服务器将生成 1 到 100 之间的随机数并连接到该队列

交易量实际上可能要大得多:每天 5 亿次点击您的服务可能意味着:

  • 500M 写入队列
  • 从队列中读取 500M
  • n * 500M 写入存储(其中 n 可能是倍数,如果您的存储结构要求您在写出之前先读取内容,允许批量事务等)
  • x * 24*60*60/delay 检查队列以查看是否存在新消息(x 是队列数,延迟是每次检查之间的延迟秒数)

现在,如果您希望最小化队列的写入/读取量,请考虑将来自 Web 服务器的请求缓冲到队列中,以便不是每个数据点都作为单独的消息发送,而是将一堆一起发送。这将限制对也算作事务(读取和写入)的队列的命中。您可以在您的网站中使用带有静态变量的锁来捕获命中,以便所有内容都存储在内存中,然后不时刷新到队列中

如果您希望最小化表存储的存储事务量,请考虑尽可能使用本地存储来预聚合数据,并且只将预聚合的数据同步到表存储。这可能会有所帮助

每当我们缓冲数据写入时,假设如果带有缓冲数据的机器由于某种原因出现故障并且缓冲区尚未被刷新,则可能会丢失一些数据。由于我们在这里不处理货币交易,我假设您对数据丢失的容忍度略高于 0,并且写入缓冲所节省的成本抵消了潜在的罕见数据丢失

高温高压

于 2013-02-11T21:02:41.663 回答