小编典典

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

algorithm

在cs.stackexchange ..上问了这个问题。.因为我不是很清楚..所以我将在这里尝试更加具体。

Q-设计一个数据结构以在最近1分钟内返回到Web服务器的连接数。

假设-

  1. 该服务器有大量传入的连接..如印度铁路预订或社交网站等。
  2. 假设如果这是一个大数据问题..那么我有一个基础设施来运行一个大数据工作..

我在寻找:

  1. 效率-是否可以在O(1)中做到这一点?如果,例如,我们在O(n)中进行此操作,那么问题是,如果花费N毫秒来计算答案,那么在该N ms中将有更多连接入队。我该如何解决。 。或我只能忽略小的延迟,并且O(n)是可以的表现

  2. 推理/方法-在生产中进行的许多部署中,我们是否都执行类似的操作?还有类似的问题吗?

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

我的努力:我知道-

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

方法-

  1. 一旦将连接放入队列,就将其写入文件..(至少是其时间戳和连接的句柄/唯一标识符)
  2. 客户端请求“在最近1分钟内给我num个连接”后,..处理文件以找出连接数..我们知道当前时间(以毫秒为单位),我们必须找到其时间戳记为currentTime的连接- 60秒
  3. 可以使用map reduce运行此作业。我也知道文件已对数据进行排序(按时间戳)。

我还运行一个守护程序,该守护程序会删除10分钟以上的条目/文件..这样我就不会存储不需要的数据


阅读 271

收藏
2020-07-28

共1个答案

小编典典

排队方法

  • 使用队列。

  • 每当收到新请求时,将其入队。

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

  • 由于您说每秒有很多请求,因此 每当您收到新请求时 ,您也可以 使旧条目出 队,这应该使队列保持在正确的大小附近,从而最大程度地减少了计数操作所花费的时间。

这将是O(k)两个入队和获得计数,其中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,206毫秒为单位的计时器间隔再次使用。以6毫秒为单位的最大请求数将是4(即1,2,3,5,在期间内发生1-6)。

这是“大数据”吗?

好吧,这实际上取决于您每秒收到的请求数。对于大数据,我们通常会谈论许多terrabyte的数据(随着计算机功能的增强,数据还会增加),我不认为只有最后一分钟的请求会接近这些数字。

基于计数的方法

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

有一个固定大小的队列(比方说60,每个元素表示对给定秒数的请求-是一个简单的整数值)。这可以实现为圆形数组。

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

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

当我们收到一个新请求时,请使所有表示秒的时间比一分钟前更长的元素出队,count以出队值递减,并与一起增加队列的后面(最后插入的值)count

当我们需要获取最后一秒的请求数时,将指示秒数比一分钟前更长的所有元素count出队,并以出队值递减,然后返回count

假设我们的队列是固定大小的,那么每个操作最多将花费O(1)(或者,如果您愿意,队列的大小O(m)在哪里m)。

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

2020-07-28