gpt4 book ai didi

java - (遗留)TCP 到 ZeroMQ 代理的 ZeroMQ 模式

转载 作者:行者123 更新时间:2023-11-29 08:01:08 25 4
gpt4 key购买 nike

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

  Server
| \
TCP TCP
| \
Client1 Client2

新的设置将是:

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

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

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

我已经阅读了很多 ZeroMQ 指南,但我仍然不确定它的哪些“模式”或套接字组合最适合此设置。我希望那里有一些 ZeroMQ 向导可以就什么是最好的方法提供一些建议。

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

非常感谢!

最佳答案

我认为 Asynchronous Client Server模式会让你接近。您的每个客户端都创建一个 DEALER 套接字,该套接字连接到代理中的 ROUTER 套接字。查看example Java source .您可以将代理基于 ServerTask 类,使用前端/路由器套接字并省略后端/经销商套接字。

您的服务器将能够响应客户端请求并将未经请求的消息发送回任何客户端。在客户端发送至少一条消息后,您将需要缓存每个客户端的套接字 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 拾取并转发到游戏服务器。

一旦您使这个基本设计生效,您就可以疯狂地按照各种模式中的描述添加工作人员等。

希望这对您有所帮助。

关于java - (遗留)TCP 到 ZeroMQ 代理的 ZeroMQ 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14362812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com