我正在编写一个从多个客户端接收数据的网络应用程序:当接收到数据包时,应用程序读取并修改标头,然后将数据包转发到一个或多个客户端。我想为到客户端的每个连接使用一个输出队列,因此应用程序能够监视每个输出队列的填充水平并检测每个客户端上的负载。
传入数据包的路由可以通过单个线程实现,该线程应分析每个数据包的标头以确定目标客户端:该线程还访问路由表以正确转发数据包。
如何处理传入的消息?我可以为每个连接使用一个共享队列或一个输入队列:
- 如果我使用单个共享队列,路由线程和处理与客户端连接的线程将同时访问它;
- 如果我为每个输入连接使用一个输入队列,则路由线程和唯一处理来自客户端的连接的线程将同时访问它。
在第一种情况下,路由线程的作用相当简单,因为它应该只从队列中取出下一个数据包并将其转发给另一个客户端。相反,在第二种情况下,路由线程应该一一检查所有输入队列。第二种方法的优点是避免最快的连接填满共享队列,从而增加其他连接发现队列已满的可能性。
第二种方法将要求路由线程应遵循确保与输入队列相关的公平行为的策略。在这种情况下可以使用什么策略?
此外,还有哪些其他原因可能导致人们选择第一种或第二种解决方案?两种解决方案的优缺点是什么?