1

我们正在为现有的在线游戏构建一个新客户端以及一个缓存代理组件。当前设置如下所示:

  Server
  |     \
 TCP    TCP
  |       \
Client1  Client2

新设置将是:

 Server
 |   |
TCP TCP
  \   \
   Proxy          <-- (New!)
   |    \
  0MQ   0MQ
   |      \
Client1  Client2  <-- (New!)

代理组件将靠近现有的游戏服务器,向它使用基于旧线路的 TCP 协议,同时通过 0MQ 向新客户端使用基于 Google Protocol Buffers 的新协议。除了在服务器与其客户端之间转发和翻译消息外,代理还将缓存(protobuf)发往客户端的消息。

服务器响应客户端请求,但也可能向特定客户端或所有客户端发送未经请求的消息。由于代理将维护发往某个客户端的消息缓存,因此它需要保持与每个客户端相关联的某些状态。

我已经在 ZeroMQ Guide 中阅读了很多内容,但我仍然不确定它的哪些“模式”或套接字组合最适合这种设置。我希望那里有一些 ZeroMQ 向导,可以就这里的最佳方式提供一些建议。

问题不是特定于语言的,但代理组件将用 Java 编写,客户端用 C# 编写。

提前谢谢了!

4

3 回答 3

4

我认为异步客户端服务器模式会让你接近。您的每个客户端都会创建一个 DEALER 套接字,该套接字连接到您代理中的 ROUTER 套接字。查看示例 Java 源代码。您可以将代理基于 ServerTask 类,使用前端/ROUTER 套接字并省略后端/经销商套接字。

您的服务器将能够响应客户端请求并将未经请求的消息发送回任何客户端。在客户端至少发送一条消息后,您需要缓存每个客户端的套接字 ID。

您与游戏服务器的 TCP 连接在概念上类似于服务器和工作人员之间的后端 DEALER 套接字 - 但是,由于您的连接是经典 TCP 而不是 ZeroMQ,因此您不能使用 ZeroMQ 套接字并且需要做一些自定义的事情。当您与经典 TCP 套接字集成时,您的自定义解决方案要求您不违反 ZeroMQ 的并发规则。

这是一种方法 - 使用一组 PAIR 套接字(我们称它们为 A 和 B)和 BlockingQueue 充当 ZeroMQ 和 TCP 套接字之间的桥梁。并创建 3 个线程 - TCPRead、TCPWrite 和 ZeroMQ。

TCPRead 从 TCP 连接读取游戏服务器。它将它们转换为 protobuf 消息并通过 A 套接字转发它们。

TCPWrite 轮询 BlockingQueue 中的消息。当它收到一条消息时,它会转换它并通过 TCP 连接将其发送到游戏服务器。

最后,大部分工作都在 ZeroMQ 线程中。它使用 ZeroMQ 轮询并不断轮询它的路由器套接字(用于来自所有客户端的所有消息)和 B 套接字(用于来自游戏服务器的消息)。向客户端发送消息很简单,通过将消息发送到路由器套接字来处理,并在消息前面加上客户端的套接字 id。通过将消息添加到 BlockingQueue 来完成向服务器发送消息。它将被 TCPWrite 拾取并转发到游戏服务器。

一旦你让这个基本设计工作起来,你就可以按照各种模式中的描述发疯并添加工人等。

希望这可以帮助。

于 2013-01-16T17:59:57.777 回答
1

您还可以在原始模式下使用 0MQ ROUTER 套接字,这意味着您可以使用两个 ROUTER 套接字编写代理。除了父子线程管道外,我会远离 PAIR 套接字。

于 2013-01-16T21:54:06.493 回答
0

阅读 ZeroMQ 文档需要一些时间,尽管它非常出色。我做了并得出结论,异步客户端-服务器接近我最初想要的。

但这并不完全。所以我然后开始建造。

我真正想要的是基于我从各种例子中学到的东西。对我最终得到的内容的完整描述以及可能有一些用途的代码,供参考或作为实际库。

于 2014-07-05T14:35:56.353 回答