可扩展套接字事件队列处理
时间:2020-03-06 14:24:42 来源:igfitidea点击:
我的Cclass必须能够处理通过tcp流样式套接字连接接收到的大量事件。类的套接字从tcp服务器接收的事件消息的数量是完全可变的。例如,有时它将在十秒钟的时间内仅收到一条事件消息,而在其他时间,它将在一秒钟内收到60条事件消息。
我正在使用Socket.ReceiveAsync接收消息。如果接收操作未决,则ReceiveAsync返回true;如果线路上已经有数据,并且接收操作同步完成,则返回false。如果操作未决,套接字将在IO完成线程上调用我的回调,否则,我将在当前(IOC)线程中调用自己的回调。此外,与事件消息混在一起,我还收到对发送到此tcp服务器的命令的响应。响应消息立即被处理;通过解雇线程池工作者来实现。
但是,我想将事件消息排队,直到它们有" N"个,或者直到没有更多的消息为止……然后解雇线程池工作程序来处理一批事件消息。另外,我希望所有事件都按顺序处理,所以我一次只希望一个线程池工作者对此进行处理。
事件消息的处理器只需要将消息缓冲区复制到一个对象中,引发一个事件,然后将消息缓冲区释放回环形缓冲区池即可。所以我的问题是...我们认为实现此目标的最佳策略是什么?
我们需要更多信息吗?让我知道。谢谢!!
解决方案
我不会每秒调用60个事件。在这样低的活动水平下,任何套接字处理方法都可以。我仅使用select就使用比当前机器功能差很多的硬件在一个线程上每秒处理5,000个事件。
我要说的是,如果我们打算扩展规模,则在线程之间单独传递消息将是一场灾难。我们需要批处理,否则上下文切换会降低性能。