外部流程与线程和数据处理

时间:2015-02-25 01:09:25

标签: c++ sql-server windows multithreading c++11

我正在使用mmorpg游戏服务器,该服务器同时为数百个,有时数千个玩家提供服务。发送到此服务器的某些播放器操作需要数据库访问(sql),例如:当用户选择其中一个字符时,从sql服务器检索与该字符关联的所有数据(项目,级别,位置),即使此应用程序没有& #39;与sql server有任何(直接)连接。该软件通过将特定数据包发送到外部数据服务器来实现此目的,该外部数据服务器的作用类似于"代理"到sql server。 (所有这一切都是为了避免使用慢速数据库查询阻止网络线程池)

说明它的工作原理:

注意:每个客户都有一个ID,假设客户端已经过身份验证并且在字符选择屏幕上。

  1. [Player]将(数据包)发送到包含所选字符名称的[GameServer]。
  2. [GameServer]向包含(玩家ID +角色名称)的[DataServer]发送(数据包)
  3. [DataServer]执行所有必需的查询,并将包含请求者ID和所有字符信息的(数据包)发送到[GameServer]
  4. [GameServer]使用返回的信息回复[客户端](DataServer发回客户端ID以识别客户端)
  5. 按顺序:

    [客户] - > (字符名称) - > [GameServer] - > (玩家ID +角色名称) - > [DataServer] - > (玩家ID +角色信息) - > [GameServer] - > (字符信息) - > [客户端]

    这就是整个架构今天的工作方式。但对我而言,维护过于复杂,因为我必须维护两个独立的软件,并处理这些服务器之间的网络连接以及创建新请求,新响应,解析这些等所有相关内容。我正在讨论这个问题。与同事一起,他说外部服务器的性能会更好,但我正在考虑使用C ++功能(lambdas)来实现这一点,所以我考虑创建一个线程池,每个线程都有自己的数据库连接。此线程池将等待数据库工作到达(作为std :: function<>调用),因此我可以更轻松地在同一进程内处理请求,而不必担心阻塞网络队列(iocp)。

    那么,在同一个进程上使用线程池而不是使用外部进程有什么优缺点?我应该期望它表现得更好,更差,还是完全一样?

1 个答案:

答案 0 :(得分:1)

  

“那么,在同一个流程上使用线程池而不是使用外部流程有什么优缺点?”

最重要的对立点是

  1. 通过复制父进程的整个环境,创建另一个子进程比创建另一个子线程(或者只是委托给可从池中访问的子线程)要昂贵得多。
  2. 与子进程进行通信也需要更多资源,而且与使用简单子线程交换数据的选项相比,它的优化程度要低得多
  3.   

    “我应该期望它表现得更好,更差,还是完全相同?”

    从上述观点(特别是第二点)开始,在与子流程进行沟通时,应该会有更糟糕的表现。

    很抱歉,在您描述用例时,我实际上看不到任何专业人士使用外部流程。