Python restapi体系结构设计与实现

Python restapi体系结构设计与实现,python,multithreading,rest,design-patterns,restful-architecture,Python,Multithreading,Rest,Design Patterns,Restful Architecture,目前我正在设计和编程一个控制一系列设备的软件。该软件计划有一个REST接口,通过它您可以远程控制软件(和设备) 现在,架构的一个非常基本的抽象可以如下所示: 正如您所注意到的,该系统由一个主控制器组成,然后主控制器处理和监视彼此不依赖的不同模块。前端模块是图中的一个示例,而其他模块是模块的一般抽象,但它们可以是任何模块(数据库模块、MessageBus模块等)。 对于实际的REST接口,既有数据检索、数据存储,也有正在实现的控制命令 我的“问题”是,我无法决定这些“命令”应该如何传播下去。 可

目前我正在设计和编程一个控制一系列设备的软件。该软件计划有一个REST接口,通过它您可以远程控制软件(和设备)

现在,架构的一个非常基本的抽象可以如下所示:

正如您所注意到的,该系统由一个主控制器组成,然后主控制器处理和监视彼此不依赖的不同模块。前端模块是图中的一个示例,而其他模块是模块的一般抽象,但它们可以是任何模块(数据库模块、MessageBus模块等)。 对于实际的REST接口,既有数据检索、数据存储,也有正在实现的控制命令

我的“问题”是,我无法决定这些“命令”应该如何传播下去。 可能的命令的某些情况:

  • 请求打开/关闭、重新启动、控制由另一个模块处理的设备的命令
  • 请求重新启动/重新加载软件的命令
  • 从另一个模块检索数据的命令
现在我看到了一些实际逻辑实现的可能方式:

  • 所有接收到的REST命令都通过消息总线发送。在这种情况下,每个请求都应该接收一个唯一的标识符,然后可以使用该标识符检索请求的状态
  • 所有接收到的REST命令都直接调用其他模块
这两种方法各有利弊: 第二种做任何事情的方法很容易陷入意大利面条式的代码中,并且很难调试和扩展,因为通过不同的模块有很多多线程的利用率。但这可能是处理命令和检索数据的最快方式。尤其是因为项目需要速度和响应能力。 第一种方法没有第二种方法的优点,但是它有助于保持代码和体系结构的整洁,并清除来自其他模块的依赖关系。此外,还计划了一个控制台通道,理论上可以使用相同的方法来实现

在头脑风暴时,我想到了另一种方法: 强制REST通道将传入请求转发给实际的FronEnd模块,然后“等待”直到收到响应。前端模块随后必须直接调用其他模块以获取所请求的任何信息或操作。 然而,该方法与方法nr 2“不同”

有人能提供一些建议吗?可能是关于实施或设计决策的想法


如果您想知道,该软件是用Python编写的,但我认为这与这个问题无关。

因此,基本上我们决定放弃RESTful方式,只使用套接字(特别是WebSocket)的方法

通过websockets发送的命令格式为JSON,在某种程度上类似于REST(基本上,请求包含一个“URI”、一个“Action”[get、put、post等]和一个“body”)


命令到达系统的前端控制部分,然后被推送到消息总线,系统的另一部分已经订阅了这些命令。在处理数据或执行命令后,数据通过消息总线返回,并通过websocket发送到客户端。

IMO,您的上下文对于使用某些消息代理系统(如Apache Kafka()或RabbitMQ())来说是一个很好的上下文。这些模块可以以比简单的RESTAPI更健壮的方式生成/使用与主设备和通信设备之间的消息。(还建议用于处理多个设备,以及日志记录功能)。也许这不是你想要的,但值得研究。非常感谢。已经有这样一个系统用于模块之间的内部通信。由于RESTAPI将被用来进行一些操作员(前端用户)控制,因此如果我也使用消息总线进行REST,我会对任何可能的延迟问题保持警惕。此外,可能存在操作员需要立即反馈的情况,但对于消息总线系统,您需要进行另一次调用(或使用WebSocket)来检索请求的响应。这增加了时间和额外的资源使用。