我正在使用TcpListener
(Clase)示例https://msdn.microsoft.com/es-es/library/system.net.sockets.tcplistener(v=vs.110).aspx来处理TCP请求。
但似乎同时这个TCP Listener
会接受多个请求,这些请求应该稍后在几个Web Services
中处理,并且结果必须返回到TCP client
。
我想做以下事情:
获取用于读取和写入NetworkStream stream = client.GetStream();
的流对象,并将其保存在特殊的容器类中。
将此类放入特殊Queue
辅助类,如此C#: Triggering an Event when an object is added to a Queue。
更改Queue
时,触发实现事件以使用Task
异步处理下一个队列项。
在Task
内与Web Services
进行沟通,并将回复发送至TCP Client
。
请告诉我这个架构至关重要,能够解决对TCP Listener
的多个请求。
答案 0 :(得分:2)
我建议你使用netmq。看看https://github.com/zeromq/netmq
答案 1 :(得分:1)
使用队列绝对是可行的想法,但要考虑它的用途。它限制了您可以并行处理的请求数量。在某些情况下,您可能需要限制它,最常见的是每个请求处理执行CPU绑定的工作(繁重的计算)。那么你并行处理大量数据的能力是有限的,你可以使用队列方法。
在您的请求中,处理执行IO绑定工作(等待Web请求完成)。这不会消耗太多的服务器资源,并且您可以并行处理大量此类请求,因此在您的情况下很可能不需要队列。
即使您使用队列,一次只处理一个项目也很少有用。相反,处理具有X个线程的队列(其中X再次依赖于工作是CPU还是IO绑定,对于CPU,您可能没问题,X =核心数,IO需要更多)。如果您使用太少的线程来处理您的队列 - 您的客户端将基本上没有等待更多,甚至可能因超时而失败。