用整数控制事件每秒发生次数不超过N次

本文关键字:不超过 整数 控制 事件 | 更新日期: 2023-09-27 17:49:25

我的系统生成的事件是整数。从1点到1点总共有大约10000个活动。每次我接收到带有number的新事件时,我都需要检查在最后一秒钟我已经接收了多少次带有该number的事件:

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

所以我只需要控制和忽略具有相同数量的事件的"flood"。

有两个要求:

  • 洪水控制的开销应该是最小的,因为它用于高频交易
  • 同时,我不需要"完全"控制,我只需要"大致"控制洪水。也就是说,在每秒3到10个事件之间停止接收事件是可以的。

所以我的建议是:

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

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

你觉得你能推荐一些更好的吗?

用整数控制事件每秒发生次数不超过N次

你的方法的一个问题是,如果你清除计数器每秒-它可能是你有一个洪水在第二结束之前,但因为你刚刚清除它,你将继续接受新的事件。
这对你来说可能没问题,因为你只擅长近似。

另一种方法可能是使用一个时间戳队列数组。当一个新的事件进来时-你从数组中获得相关的队列,并从其头部清除过去发生超过一秒的所有时间戳。
当你检查队列的大小时,如果它大于阈值你什么都不做——否则你将新的事件时间戳输入队列并处理它。
我意识到这种方法可能比只增加整数慢,但它会更准确。

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