寻找使用TCP / IP套接字将相同消息发送到多个目标的最佳方法。我正在使用Windows上现有的VS 2010 C ++应用程序。希望使用标准的库/设计模式方法,如果可能的话,已经解决了很多复杂问题。
这是我正在考虑的一种方法。一个主线程从数据库中检索消息并将它们添加到某种线程安全队列中。对于某个目标服务器,每个客户端套接字连接也有一个线程。这些线程中的每一个都将从线程安全队列中读取,并通过tcp / ip套接字发送消息。 可能有比这更好/更简单/更强大的方法..
我必须关注的问题主要是延迟。目的地可以是任 消息必须以精确的FIFO顺序进入所有目的地。
另外一个目的地将被视为主要目的地..所有消息必须到达此目的地,没有例外。对于其他目的地,即非主要目的地,消息只是副本,如果非主要目的地没有收到一些消息,则这并不是绝对关键。在任何时候,其中一个非主要目的地可能成为主要目的地。如果其中一个目的地落后太远,那么该线程将需要赶上主要目的地,但跳过一些消息。
寻找任何建议。到目前为止的初步研究,我的情况似乎类似于单个生产者和多个消费者模式,或者可能是Java中的主工作者模式。
我需要在Windows上用C ++实现它,并且应用程序必须使用现有定义协议的tcp / ip套接字。
非常感谢任何帮助。
答案 0 :(得分:0)
您需要两个线程,一个使IO通道饱和到数据库,另一个使IO通道饱和到通向12台服务器的网络。除非你有多个网络接口(你应该考虑一下!),否则你不能通过使用多个线程来更快地发送内容。此外,由于您没有多个线程来处理网络,因此您无需同步它们。
你肯定需要知道的是select()。在WinSock的情况下,还要看一下WSAEventSelect / WaitForMultipleObjects。基本上,您从队列中接收消息,然后在准备好后将其发送给所有客户端。 select()告诉您何时一组套接字中的一个已准备好接受数据,因此您不必浪费时间等待或阻止尝试发送数据。您需要提供的是在断开连接后重新连接的模式,何时将消息丢弃到滞后客户端等。另外,如果不同目标的吞吐量变化很大,您需要考虑并行处理多个消息。如果它们很小(小于网络数据包的有效载荷),那么无论如何要合并它们是有意义的,以避免开销。
我希望这个简短的概述有助于您入门,否则我可以详细说明。