我的系统生成带有整数的事件。从 1 到 10 000 总共有大约 10 000 个事件。每次我收到带有数字的新事件时,我都需要检查在最后一秒内我已经收到了多少次带有这样数字的事件:
- 如果我在最后一秒收到此事件超过 ~3-10 次,我需要忽略它
- 否则我需要处理它。
所以我只需要控制和忽略具有相同数量的事件的“洪水”。
有两个要求:
- 洪水控制的开销应该是最小的,因为它在高频交易中使用
- 同时我不需要“精确”控制,我只需要“大致”控制洪水。即可以在每秒 3 到 10 个事件之间停止接收事件。
所以我的建议是:
- 创建 int[10 000] 数组
- 每秒将该数组中的所有项目刷新为0(数组项目的刷新操作是原子的,我们也可以毫无问题地迭代数组并且没有锁定,因为我们不插入或删除项目,但是可能有人可以推荐特殊功能“零”数组,考虑到我可以同时从另一个线程读取数组)
- 每次收到新事件时,我们 a)
Interlocked.Increment
数组中的对应项,并且只有当结果小于阈值 (~3) 时,我们才会处理它。
因此,防洪只是一项Intrerlocked.Increment
操作和一项比较操作。
你觉得有什么好推荐的吗?