2011-10-10 47 views
0

我们有一个会员系统,每天可以计算数百万次横幅印象/点击次数。
目前它向SQL写入每个在每个请求上实时发生的Impression/Click。重负荷的点击次数计数设计

Web应用程序提供这些请求。

我们面临着两个问题:

  1. 如果我们有很多每秒并发请求时,SQL是 开始非常努力地插入Impressons /点击数据和 作为导致问题#2。

  2. 如果SQL现在很慢,请求正在累积,并且 正在Web服务器上的队列中等待。因此,我们在Web应用程序上有一个缓慢的 ,并且请求没有被处理。

    现在我们正在考虑通过取出写入SQL逻辑从Web应用程序的改变设计(写一些本地存储,而不是:我们在高层认为

设计)并制作独立服务,该服务将从本地存储中读取,并最终将汇总的印象数据/点击数据(不是实时)写入后台的SQL。

我们的约束:

  • 10 web服务器(负载平衡)
  • 1 SQL服务器

你认为建议的设计是什么?
你会使用NoSQL作为每个Web服务器的本地存储吗?
建议您的选择。

+0

考虑CQRS体系结构 –

回答

1

您的问题似乎是您的前端代码在等待后端代码更新数据库的同时被阻止。

将前端和后端分离,例如,通过在前端能够以低延迟和高吞吐量写入队列的中间插入队列。后端可以花时间将排队的数据处理到其目的地。

可能或可能不需要使队列可重启(即在崩溃后不丢失数据)。取决于此,您有多种选择:

  • 内存中队列,快速但不防崩溃。

  • 数据库队列,有道理的,如果原始请求数据写入到一个简单的数据结构比写的最终数据到它的目标数据结构更快。

  • 冗余队列,用于掩盖崩溃。

+0

队列问题是我们必须验证每个印象的唯一性。这意味着我们必须将特定日期的所有队列数据存入内存并筛选出非唯一的展示。为什么不在这种情况下使用NoSQL DB并将Map Reduce算法应用于此数据? –

+0

主要想法是在稍后阶段异步执行独特的展示过滤,以便让您的员工快速恢复工作。过滤器的实际设计是次要的。 – Bernd

0

我与贝恩德,但我不确定如何专门使用队列。

所有你需要的是你可以调用的异步的东西;这种记录印象的行为非常多余。

+0

那么,不要太直接地用“排队”一词。我们不太了解实际的环境,以推荐具体的解决方案恕我直言。 – Bernd

+0

正确!我猜“适当”队列的好处在于,它将是保存数据以及引入异步行为的好方法,因为点击/印记=金钱/合同。 –