设计一个数据结构,以便在最后1分钟内返回到Web服务器的连接数

abi*_*ipc 5 algorithm data-structures

在cs.stackexchange上问这个..得到了一个downvote ..因为我不是很清楚..所以我会尝试在这里更具体..

问:设计一个数据结构,以便在最后1分钟内返回到Web服务器的连接数.

假设 -

  1. 服务器连接数量很大..如印度铁路预订或社交网站等.
  2. 假设这是一个大数据问题..然后我有infra运行大数据工作..

我在寻找:

  1. 效率 - 是否可以在O(1)中执行此操作?例如,如果我们在O(n)中这样做..问题是如果计算答案需要N毫秒......还有一些连接已经在N ms中排队了.我应该如何解决这个问题.或者我只能忽略小延迟而O(n)是一个好的表现

  2. 推理/方法 - 我们在生产中的无数部署中是否做了类似的事情?有类似的问题..?

  3. 这是"大数据"吗?用于存储连接的数据是否是大数据问题的最后N(N是10阶)分钟?

我的努力:我知道 -

  1. 与Web服务器的连接在被线程提供之前放入队列中
  2. 每个连接都有一个时间戳

方法 -

  1. 只要在队列中放入连接,就将其写入文件..(至少它的时间戳和连接的句柄/唯一标识符)
  2. 一旦客户端请求"在最后1分钟给我num连接"..处理文件以找出连接数...我们知道以毫秒为单位的当前时间,并且我们必须找到其当前时间的当前时间戳的连接 - 60秒
  3. 这个工作可以使用map reduce运行.我也知道文件已经排序了数据(按时间戳).

我还运行一个守护程序,删除超过10分钟的条目/文件..所以我不存储不需要的数据

Duk*_*ing 12

队列方法

  • 使用队列.

  • 每当有新请求出现时,请将其排队.

  • 每当我们需要在最后一分钟获取请求数时,首先将所有发生的条目出列的时间超过一分钟(这是有效的,因为队列中的条目按顺序插入,因此队列已排序).然后返回队列的大小(可以O(1)通过存储变量来返回大小).

  • 由于您说每秒有大量请求,因此每当您收到新请求时,您也可以将旧条目出列,这样可以使队列保持接近正确的大小,从而最大限度地减少计数操作所需的时间.

    这将是O(k)enqueue和get count两者,其中k是在任何时间段内发生的最大请求数t,其中t是任意两个请求之间的最大持续时间(例如,如果我们在接下来的毫秒内获得请求:1,2,3,5,15,20,最大持续时间是20-15 = 5,以5毫秒为单位发出的最大请求数4(即1,2,3,5发生在该时间段内1-5)).

  • 另一种方法是运行一个定时器,使旧条目出列.

    这种性能将O(1)用于入队和O(m)定时器运行并获得计数,其中m长度等于定时器频率的任何长度的最大请求数.例如,1,2,3,5,15,20再次使用,计时器间隔为6毫秒.以6毫秒为单位的最大请求数将是4(即1,2,3,5在该时段中发生1-6).

这是"大数据"吗?

那么,这实际上取决于您每秒获得的请求数量.我们通常会谈论大数据的许多数据(并随着计算机变得更强大而增加),我不认为只有最后一分钟的请求会接近这些数字.

基于计数的方法

如果您对一个小错误感到满意,可以执行以下操作:

有一个固定大小的队列(假设60,每个元素指示给定秒的请求 - 是一个简单的整数值).这可以实现为圆形阵列.

count=一个变量,指示最后一秒的请求数,初始化为0.

有一个变量存储最后一个请求的第二个值(以便能够确定队列中的一个元素用于哪个秒).

当我们得到一个新的请求时,将所有指示秒超过一分钟的元素出列,count按出队的值递减,然后递增队列的后面(最后插入的值)count.

当我们需要获取最后一秒的请求数时,将表示秒超过一分钟的所有元素count出列,按出列值递减,然后返回count.

鉴于我们的队列是固定大小的,每个操作最多需要O(1)(或者,如果你愿意,队列的大小O(m)在哪里m).

这将给你一个最多1秒的错误.你当然可以玩弄错误.例如,如果您想要一个半秒的错误,只需将队列的大小加倍,然后每半秒转到下一个元素.