0

我的系统生成带有整数的事件。从 1 到 10 000 总共有大约 10 000 个事件。每次我收到带有数字的新事件时,我都需要检查在最后一秒内我已经收到了多少次带有这样数字的事件:

  • 如果我在最后一秒收到此事件超过 ~3-10 次,我需要忽略它
  • 否则我需要处理它。

所以我只需要控制和忽略具有相同数量的事件的“洪水”。

有两个要求:

  • 洪水控制的开销应该是最小的,因为它在高频交易中使用
  • 同时我不需要“精确”控制,我只需要“大致”控制洪水。即可以在每秒 3 到 10 个事件之间停止接收事件。

所以我的建议是:

  • 创建 int[10 000] 数组
  • 每秒将该数组中的所有项目刷新为0(数组项目的刷新操作是原子的,我们也可以毫无问题地迭代数组并且没有锁定,因为我们不插入或删除项目,但是可能有人可以推荐特殊功能“零”数组,考虑到我可以同时从另一个线程读取数组)
  • 每次收到新事件时,我们 a)Interlocked.Increment数组中的对应项,并且只有当结果小于阈值 (~3) 时,我们才会处理它。

因此,防洪只是一项Intrerlocked.Increment操作和一项比较操作。

你觉得有什么好推荐的吗?

4

1 回答 1

1

您的方法的一个问题是,如果您每秒清除一次计数器,则可能是您在第二秒结束之前遇到了洪水,但是由于您刚刚清除了它,因此您将继续接受新事件。
对您来说可能没问题,因为您只擅长近似值。

另一种方法可能是拥有一组时间戳队列。当一个新事件出现时 - 您从数组中获取相关队列,并从其头部清除过去一秒以上发生的所有时间戳。
您检查队列的大小,如果它大于阈值,您什么也不做 - 否则您将新的事件时间戳输入队列并处理它。
我意识到这种方法可能比仅仅增加整数要慢,但它会更准确。

我想您可以运行一些基准测试并了解它有多慢以及它是否符合您的需求。

于 2012-12-23T16:23:49.640 回答