【问题标题】:Scalable socket event queue processing可扩展的套接字事件队列处理
【发布时间】:2008-09-19 04:31:40
【问题描述】:

我的 C# 类必须能够处理通过 tcp 流式套接字连接接收到的大量事件。类的套接字从 tcp 服务器接收到的事件消息的数量是完全可变的。例如,有时它会在 10 秒内只收到一条事件消息,而有时它会在一秒钟内收到 60 条事件消息。

我正在使用 Socket.ReceiveAsync 来接收消息。如果接收操作处于未决状态,则 ReceiveAsync 返回 true;如果线路上已有数据且接收操作同步完成,则返回 false。如果操作挂起,Socket 将在 IO 完成线程上调用我的回调,否则我在当前 (IOC) 线程中调用我自己的回调。此外,与事件消息混合,我还收到对发送到此 tcp 服务器的命令的响应。立即处理响应消息;单独地,通过触发线程池工作者。

但是,我想将事件消息排队,直到我有“足够”(N) 个事件消息,或者直到网络上没有更多消息……然后启动线程池工作程序来处理一批事件消息。此外,我希望按顺序处理所有事件,因此我只希望一个线程池工作人员一次处理此问题。

事件消息的处理器只需将消息缓冲区复制到一个对象中,引发一个事件,然后将消息缓冲区释放回环形缓冲区池。所以我的问题是……您认为实现这一目标的最佳策略是什么?

您需要更多信息吗?让我知道。谢谢!!

【问题讨论】:

    标签: c# sockets networking tcp stream


    【解决方案1】:

    我不会将每秒 60 个事件称为高音量。在这种低水平的活动中,任何套接字处理方法都可以。我已经在一个线程上每秒处理了 5,000 个事件,使用的硬件比当前的机器能力差得多,仅使用 select。

    我会说,如果您希望扩展,在线程之间单独传递消息将是一场灾难。您需要批处理,否则您的上下文切换会影响性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多