2017-08-12 66 views
0

我正在制作一个应用程序,用户要与之交互以收集各种数据(以各种方式编译来自多个物理设备的数据)。关于构建单客户端服务器应用程序的建议

为此,我决定使用基于Web的用户界面,因此大部分应用程序都在控制设备的“服务器”上运行,并使用websockets与此UI进行通信。我已使用Autobahn(在用于处理设备的各种其他软件包中)在Python中编写了此服务器。

应用自然有很多状态:何时收集数据,收集哪些数据,把它放在哪里,等等

不顾一切为设备代码,主服务器布局像:

. 
├── handlers 
│   ├── handler1.py 
│   └── handler2.py 
├── router.py 
└── server.py 

现在我有主服务器的对象(AutobahnWebSocketServerFactory),该公司拥有国家作为一个枚举。它还拥有一台路由器,它将来自客户端的消息传递给它。路由器将这些消息路由到正确的处理程序,该处理程序对消息作出反应并发送响应。

处理程序需要访问服务器的状态,并且还能够更改它。然而,给每个处理程序提供一个服务器对象的引用感觉就像是糟糕的形式(例如,如果我想在处理程序中导入服务器以执行静态类型检查,那么我会得到循环导入:server -> router -> handler1 -> server)。

什么是结构良好的方式来处理这种良好的形式?我在这里应该试图遵循的有用的设计模式,我明显忽略了吗?

可能注意到:为了让服​​务器控制各种设备,我使用的是发布/订阅系统。这使得各种处理程序(以及我正在使用的类来收集和存储我想要的数据)很容易简单地订阅来自设备的数据流。

回答

0

整个服务器的全局状态是一个非常糟糕的主意。想象一下你有100个客户,他们同时发送不同的请求。服务器状态的竞争条件会导致在最坏的情况下以最好或无法回答的方式拒绝服务。所以你需要以某种方式重新考虑请求路由和服务器行为。如果可能的话,服务器应该将请求发送到处理程序,或者放入队列一段时间或拒绝请求。

作为一个可能的解决方案,路由器将收集类似的请求,然后发送给处理批量的工作,路由器开关内部状态,然后得到的结果,更新其状态和数据返回到服务器 服务器(解析请求) - >路由器(有状态) - >处理器1 - >路由器(有状态) - >服务器(准备响应)

更新我只注意到你有单个客户端。

无论如何,我建议服务器不应该有状态和路由器(aka控制器)调度处理程序denepnding在其内部状态

相关问题