我正在使用mmorpg游戏服务器,该服务器同时为数百个,有时数千个玩家提供服务。发送到此服务器的某些播放器操作需要数据库访问(sql),例如:当用户选择其中一个字符时,从sql服务器检索与该字符关联的所有数据(项目,级别,位置),即使此应用程序没有& #39;与sql server有任何(直接)连接。该软件通过将特定数据包发送到外部数据服务器来实现此目的,该外部数据服务器的作用类似于"代理"到sql server。 (所有这一切都是为了避免使用慢速数据库查询阻止网络线程池)
说明它的工作原理:
注意:每个客户都有一个ID,假设客户端已经过身份验证并且在字符选择屏幕上。
按顺序:
[客户] - > (字符名称) - > [GameServer] - > (玩家ID +角色名称) - > [DataServer] - > (玩家ID +角色信息) - > [GameServer] - > (字符信息) - > [客户端]
这就是整个架构今天的工作方式。但对我而言,维护过于复杂,因为我必须维护两个独立的软件,并处理这些服务器之间的网络连接以及创建新请求,新响应,解析这些等所有相关内容。我正在讨论这个问题。与同事一起,他说外部服务器的性能会更好,但我正在考虑使用C ++功能(lambdas)来实现这一点,所以我考虑创建一个线程池,每个线程都有自己的数据库连接。此线程池将等待数据库工作到达(作为std :: function<>调用),因此我可以更轻松地在同一进程内处理请求,而不必担心阻塞网络队列(iocp)。
那么,在同一个进程上使用线程池而不是使用外部进程有什么优缺点?我应该期望它表现得更好,更差,还是完全一样?
答案 0 :(得分:1)
“那么,在同一个流程上使用线程池而不是使用外部流程有什么优缺点?”
最重要的对立点是
“我应该期望它表现得更好,更差,还是完全相同?”
从上述观点(特别是第二点)开始,在与子流程进行沟通时,应该会有更糟糕的表现。
很抱歉,在您描述用例时,我实际上看不到任何专业人士使用外部流程。