控制具有整数的事件每秒发生的次数不超过N次

时间:2012-12-23 15:33:20

标签: c#

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

  • 如果我在最后一秒收到这个事件超过3-10次而不是我需要忽略它
  • 否则我需要处理它。

所以我只需要控制并忽略具有相同数字的事件的“泛滥”。

有两个要求:

  • 洪水控制的开销应该像在HFT交易中使用的那样非常小。
  • 同时我不需要“完全”控制我只需要“大致”防洪。即可以在每秒3到10个事件之间停止接收事件。

所以我的建议是:

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

因此,洪水控制只需一次Intrerlocked.Increment操作和一次比较操作。

你有什么想要推荐更好的东西?

1 个答案:

答案 0 :(得分:1)

你的方法有一个问题 - 如果你每秒都清除一次计数器 - 可能是你在第二次结束之前就已经有了洪水,但是因为你刚刚清除它,你将继续接受新的事件。登记/> 对你来说可能没问题,因为你只对近似有好处。

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

我想你可以运行一些基准测试,看看它的速度有多慢,是否符合你的需要。