假设一个简单的标准客户端/服务器游戏。对于服务器,是否值得拥有一个单独的进程来侦听客户端的连接和消息,并通过本地套接字或stdin将数据发送到运行实际游戏服务器的另一个进程?
另一种选择是使这两项都在一个过程中完成。对传入的消息进行排队并以正确的顺序执行它们,这不会造成停顿问题。
我想知道将两个“活动”分开的额外资源是否真的值得。我应该如何决定?我想听听任何利弊。
假设一个简单的标准客户端/服务器游戏。对于服务器,是否值得拥有一个单独的进程来侦听客户端的连接和消息,并通过本地套接字或stdin将数据发送到运行实际游戏服务器的另一个进程?
另一种选择是使这两项都在一个过程中完成。对传入的消息进行排队并以正确的顺序执行它们,这不会造成停顿问题。
我想知道将两个“活动”分开的额外资源是否真的值得。我应该如何决定?我想听听任何利弊。
Answers:
从API设计的角度来看,在决定制作多个单独的通信程序还是仅制作一个通信程序时,问题是:每个程序都可以有意义地发挥功能,而无需其他程序吗?答案将根据您的项目和偏好而有所不同。
如果他们做不到,那是不值得考虑的。显然,它们是如此紧密地联系在一起,以至于它们并不是真正独立的过程。
如果可以,并且您会看到自己希望将来使用不同的组件来替换它们,则OS提供的流程抽象可能会有所帮助。
究竟有多少帮助取决于您其余的技术堆栈。例如,Erlang已经在内部将事物建模为进程,因此将其拆分为OS进程也不会从概念上获得很多好处。除非您考虑使用其他语言重写服务器的那些部分。C ++程序的内部组件通常紧密耦合在一起,因此很难交换出来,因此,如果可以预见到这样的重新安排,将它们拆分为不同的OS进程可以节省以后的工作。
是否值得有一个单独的进程来侦听客户端的连接和消息,并通过本地套接字或stdin将数据发送到运行实际游戏服务器的另一个进程?
要回答是否值得,您必须先问自己,通过添加专用排队服务要解决的问题是什么。如果它解决了这个问题,那是值得的。如果它不能解决问题,或者您一开始就没有问题要解决,那么可能就不会。
让我们看看一些服务器为何使用多层体系结构的原因:
可能不是,大多数语言都具有异步套接字,这些套接字允许您一次使用多个连接,而不会在数据等待时阻塞。这会将“套接字服务器”部分转移到OS /内核。
使用显式套接字服务器,当您通过本地套接字传递数据时,您将招致一些额外副本的费用。会破坏可伸缩性的一件事是不需要它们的多余副本。