使用 Observable Singleton Class 来处理网络调用不好吗?
Is using a Observable Singleton Class to handle network calls bad?
我必须开发一个 client/server 游戏,它使用大量网络请求来完成它的任务。
客户端和服务端都通过socket接收多个Command
。
为了处理这些命令,我创建了一个 NetworkHandler
class,它在单独的线程上侦听新的输入,并允许我发送新的命令。
这些 "commands" 确实是异构的,并且被不同的 class 人使用。
(例如 "client ready" command
被 Main
服务器 class 使用,而 "client wants a card"
被 Game
class 使用)。
所以我创建了一个 CommandDispatcher
class 来监听 NetworkHandler
(可观察模式)并将不同的命令发送到正确的接收器。 (全部通过接口)
问题是每个想要注册为 "command receiver"
的 class 都需要调用 CommandDispatcher
将自己设置为侦听器。
因为有多个 class 需要此引用,所以我正在考虑将 CommandDispatcher
转换为可以随处访问的单例 class。
我知道 Singleton 和 global class 不好,我隐藏了一个依赖关系,很难测试,但我看到的唯一选择是从 CommandDispatcher
Main
Class 所有其他 classes.
你能帮我找到更好的解决方案吗?
谢谢。
编辑:我想澄清一下我的应用是回合制游戏,所以我没有大量的并行请求。
这是一种常见模式,已在许多环境中多次解决。
您需要解决的主要问题是到达命令的发送速度。您必须确保任何命令都不会阻塞系统,否则您将获得不可预测的响应时间。为此,您必须尽可能少地应对它的到来。
对此的经典解决方案是让您的网络侦听器对命令执行最少的工作并将其交给队列。本质上,您应该只抓取到达的消息,将其放入队列中,然后返回收听。甚至不反序列化它,把它扔到队列中。
在队列的另一端,可以有一个或多个进程提取命令、构建适当的对象并在它们上执行您想要的任何功能。这可能是您的听众应该聆听的地方。通常情况下,反序列化的对象将被分派到另一个合适的队列进行处理,因此您可能会在这些队列的另一端找到更合适的监听点。
网络侦听器和命令处理器通常都可以用线程池来实现。
Is using a Observable Singleton Class to handle network calls bad?
不好?不——但它经不起高吞吐量。您最好取消网络侦听器与命令调度程序的关联。
我必须开发一个 client/server 游戏,它使用大量网络请求来完成它的任务。
客户端和服务端都通过socket接收多个Command
。
为了处理这些命令,我创建了一个 NetworkHandler
class,它在单独的线程上侦听新的输入,并允许我发送新的命令。
这些 "commands" 确实是异构的,并且被不同的 class 人使用。
(例如 "client ready" command
被 Main
服务器 class 使用,而 "client wants a card"
被 Game
class 使用)。
所以我创建了一个 CommandDispatcher
class 来监听 NetworkHandler
(可观察模式)并将不同的命令发送到正确的接收器。 (全部通过接口)
问题是每个想要注册为 "command receiver"
的 class 都需要调用 CommandDispatcher
将自己设置为侦听器。
因为有多个 class 需要此引用,所以我正在考虑将 CommandDispatcher
转换为可以随处访问的单例 class。
我知道 Singleton 和 global class 不好,我隐藏了一个依赖关系,很难测试,但我看到的唯一选择是从 CommandDispatcher
Main
Class 所有其他 classes.
你能帮我找到更好的解决方案吗? 谢谢。
编辑:我想澄清一下我的应用是回合制游戏,所以我没有大量的并行请求。
这是一种常见模式,已在许多环境中多次解决。
您需要解决的主要问题是到达命令的发送速度。您必须确保任何命令都不会阻塞系统,否则您将获得不可预测的响应时间。为此,您必须尽可能少地应对它的到来。
对此的经典解决方案是让您的网络侦听器对命令执行最少的工作并将其交给队列。本质上,您应该只抓取到达的消息,将其放入队列中,然后返回收听。甚至不反序列化它,把它扔到队列中。
在队列的另一端,可以有一个或多个进程提取命令、构建适当的对象并在它们上执行您想要的任何功能。这可能是您的听众应该聆听的地方。通常情况下,反序列化的对象将被分派到另一个合适的队列进行处理,因此您可能会在这些队列的另一端找到更合适的监听点。
网络侦听器和命令处理器通常都可以用线程池来实现。
Is using a Observable Singleton Class to handle network calls bad?
不好?不——但它经不起高吞吐量。您最好取消网络侦听器与命令调度程序的关联。