仅使用一个端口一起设计两个服务器

时间:2018-02-22 15:04:39

标签: c++ server poco

我是一个使用服务器的新手,我有一个服务器设计问题。我目前有两个独立的应用程序服务器,它们以下列方式协同工作:

初始连接是与server1进行的,它做出了一些决定(关于端口号和其他参数),并在同一台机器上启动带有这些参数的server2(我可以访问所有创建的进程句柄)。所有进一步的请求直接来自每个客户端的每个服务器2。由于我们处理的数据,每个客户端需要单独版本的server2。 (我们的负担并不大,所以从来都不是问题)

选择的端口号是什么问题。它们并不总是对我们的客户开放。所以我的问题是如何重新设计这个系统,所以我仍然有各自版本的server2,但所有请求都来自于server1而不是只有它的端口在外部使用(所有端口都在服务器运行的机器内部可用) ?例如,是否可以使两台服务器“通话”。彼此以某种方式,可能让一个重定向到另一个?如果我尝试这样做,TCP规范会对多个客户端变得相同吗?完全可以这样做还是我必须重新考虑整个系统?

(如果它很重要,两个服务器都是用c ++编写的,正如Poco库在他们的文档中所建议的那样)

我不需要特定的代码,只是关于存在哪些可能性的指导。任何帮助和建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

不确定你在这里处理什么协议,但在我看来,你需要一台提供这两种服务的服务器(server1),比如说"你好"和"数据交换"。然后,server1应该能够识别它正在接收的传入连接的类型,以及它必须在哪里发送它。如果您需要为每个客户端提供单独的流程,那么您有一些可能性。一个简单的方法就是为每个新的数据交换连接分配一个新进程(我在这里用Unix术语说话,但对Windows来说也是如此,请参阅this question)。但是,这可能是过多的开销,相反,您可能更喜欢拥有长期存在的每个客户端server2实例。在这种情况下,一个选项是让server1充当代理,通过本地/ Unix套接字或其他一些IPC mechanism将客户端请求转发到相应的server2(在这种架构中,使用Reactor可能是有意义的) Poco中的框架);但是,这最终要求所有客户端的所有数据都通过server1,这可能是首先在多个进程中分解问题的原因。因此,您拥有的选项是在server2进程中复制客户端打开的连接套接字(然后关闭server1中的那个)。阅读thisthis关于如何在Unix上执行此操作的问题,或this documentation for Windows(我不知道Poco抽象执行此操作,但我再次了解一点关于Poco)。