0

假设我们要实现一个网络应用程序,例如与中央服务器和多个客户端聊天:我们假设所有通信都必须通过中央服务器,然后它应该从一些客户端获取消息并将它们转发给目标客户端,并且很快。

无论使用何种技术(套接字、Web 服务等),都可以认为存在一些生产者线程(生成消息)和一些消费者线程(读取消息)。

例如,您可以对传入和传出消息使用单个队列,但使用单个队列,您不能同时接收和发送消息,因为一次只有一个线程可以访问该队列。

也许使用两个队列更合适:例如,本文介绍了一种管理双队列的方法,这样生产者和消费者几乎可以同时工作。如果只有生产者和消费者,这种情况可能很好,但如果有很多客户:

  • 如何使中央服务器可以同时从多个输入流接收数据?
  • 如何使中央服务器可以同时将数据发送到多个输出流?

为了解决这个问题,我的想法是为每个客户端使用一个双队列:在中央服务器上,每个客户端连接可能与两个队列相关联,一个用于来自该客户端的传入消息,一个用于发送到该客户端的传出消息。通过这种方式,中央服务器可以在几乎所有与客户端的连接上同时发送和接收数据......

可能还有其他管理队列的方法......确定需要多少个队列以及如何组织它们的参数是什么?有不需要排队的情况?

4

1 回答 1

1

对我来说,每个客户端使用一个队列或每个客户端使用多个队列的想法似乎没有抓住重点。首先,绝对有可能构建一个可以由 2 个线程同时访问的队列(一个线程可以将一个项目入队,而另一个线程可以将另一个项目出队)。如果您想知道如何,请发布有关此的特定问题。

其次,即使我们假设一次只有 1 个线程可以访问一个队列,即使我们假设服务器将同时向/从所有客户端接收或发送数据,它仍然不能证明您需要每个客户都有不同的队列。为了避免限制系统性能,您只需要允许足够的并发性来利用所有服务器的 CPU。即使使用单个系统范围的队列,如果与服务器正在执行的其他工作相比,出队/入队消息足够快,它可能不会成为瓶颈。(并且通过有效的实现,简单地插入一个项目或从队列中删除一个项目应该非常快。这是一个非常简单的操作。)要使消息队列成为限制性能的瓶颈,要么您需要大量的 CPU,要么服务器正在执行的其他所有操作都必须非常快。在这种情况下,您可以制定一些具有 2 或 4 个系统范围队列的方案,以允许 2 倍或 4 倍的并发性。

在多线程系统中使用工作队列的整个想法是,它们 1) 允许多个消费者从一个位置全部获取工作,因此生产者可以“转储”他们需要在该单个位置完成的任何工作,而不用担心哪个消费者会这样做,并且 2) 充当消费者的负载平衡机制。(此外,如果生产者临时为消费者生成工作太快,则工作队列可以充当“缓冲区”。)如果您有一对专用的生产者-消费者线程,每个线程客户端,它质疑为什么你需要使用队列。为什么不直接从专用生产者同步“传递”到相应的专用消费者?或者,为什么不为每个客户端使用一个同时充当生产者和消费者的线程呢?以您提议的方式使用队列似乎并没有真正获得任何好处。

于 2012-06-24T23:34:01.337 回答