如何分发来自 TCP 侦听器的请求

How to distribute requests from TCP Listener

我正在使用 TcpListener (Clase) 示例 https://msdn.microsoft.com/es-es/library/system.net.sockets.tcplistener(v=vs.110).aspx 来处理 TCP 请求。

但似乎同时 TCP Listener 将接受多个请求,这些请求应稍后在几个 Web Services 中一起处理,结果必须返回到 TCP client.

我正在考虑执行以下操作:

  1. 获取一个用于读写的流对象NetworkStream stream = client.GetStream();并保存在特殊容器class.

  2. 把这个 class 放到特殊的 Queue 助手 class 就像这个 C#: Triggering an Event when an object is added to a Queue 一样。

  3. Queue 发生变化时,触发实现事件以使用 Task.

  4. 异步处理下一个队列项目
  5. Task 内与 Web Services 通信,并将响应发送到 TCP Client

请让我知道这个架构很重要,能够解决对 TCP Listener 的多个请求。

我推荐你 netmq。看看https://github.com/zeromq/netmq

使用队列绝对是可行的想法,但请考虑它的用途。它限制了您可以并行处理的请求数量。您可能需要在几种情况下限制它,最常见的是每个请求处理是否执行 CPU 绑定工作(繁重的计算)。那么你并行处理大量它们的能力是有限的,你可以使用队列方法。

在您的请求处理中执行 IO 绑定工作(等待 Web 请求完成)。这不会消耗太多服务器资源,并且您可以并行处理大量此类请求,因此在您的情况下很可能不需要队列。

即使您使用队列,一次只处理一个项目也很少有用。相反,使用 X 线程处理队列(其中 X 再次取决于工作是 CPU 还是 IO 绑定,对于 CPU X = 核心数你可能没问题,而 IO 你需要更多)。如果您使用太少的线程来处理您的队列 - 您的客户将等待更多时间,基本上什么也没有,甚至可能因超时而失败。