【问题标题】:Most suitable node-server communication design最合适的节点-服务器通信设计
【发布时间】:2019-04-06 16:25:49
【问题描述】:

我在设计我的项目的一部分时遇到了困难。 这个想法是 N 个节点(每个节点都有一个摄像头)将不断地向服务器发送帧以进行对象检测,然后服务器将向每个节点重新发送包含一些信息的响应。

目标是尽可能独立地处理每个节点,并能够同时接收下一帧和处理前一帧。

与在 Python 中一样,并行运行的线程不是选项,我正在考虑一些方法(假设我有一个能够并行处理 N * 2 个线程的 CPU:

1) 服务器将为每个节点生成两个进程(相互通信)(一个用于接收帧,一个用于对象检测)。 (这些进程将独立于主进程运行)

2) 服务器将是单线程和异步的。每个接收到的帧都会被提交到进程池进行检测。

3) 服务器将为每个节点生成一个线程(一个线程将处理从一个节点接收帧)。每个接收到的帧都会被提交到一个进程池进行对象检测。

4) 服务器会为每个节点生成一个线程,并在该线程中生成两个单独的线程,一个用于接收,一个用于对象检测

哪种方法似乎最有意义?你会建议一些不同的东西吗?

【问题讨论】:

    标签: python oop asynchronous concurrency parallel-processing


    【解决方案1】:

    我喜欢建筑类的问题,如果我必须做这个项目,我会怎么做。:
    工作流程:

    1. 节点将向服务器发送请求,包括帧和节点 身份证
    2. 根据节点 ID 和帧,服务器将使用内存存储中的 redis 在队列中创建一个作业,以跟踪节点发送的作业并将每个请求存储到数据库中
    3. 服务器将通过在服务器上运行一个工作器来处理每个作业,该工作器将从 redis 队列中获取和处理每个作业。
    4. 更新作业记录:一旦完成,作业将被标记为已完成并保存结果。
    5. 节点可以调用服务器以获取节点发布的每个作业的状态。

    您需要在服务器上创建 REST API 接口以从节点发布作业并将该请求保存到数据库并根据该请求创建作业并将其推送到 redis 队列。 Worker 会自动从 Redis 队列中拉出作业,并根据处理结果更新 DB 记录。

    您需要在服务器端进行以下操作:
    - REST API
    - Redis 队列 (RQ) Link
    - 数据库服务器

    使用这种架构,您可以轻松地将轻量级结果立即返回给客户端,并使所有作业都处于处理状态。 RESTful 架构是广泛使用的架构,但对于耗时的作业,我们使用队列处理器,客户端将向我们发出请求以检查发布到服务器的任何作业的状态。如果您需要,我可以绘制包含更多细节的架构。

    简而言之:如果您有客户端服务器架构,如果客户端发布的请求是耗时的过程并且有多个步骤,则使用 REST API 进行通信并将每个请求发布到内存队列存储中要做的工作。使用这种架构,您可以发布任意数量的作业以及多个工作人员、负载均衡器以提高性能。

    【讨论】:

    • 看着您详尽的回答,我不难同意您喜欢架构问题。非常感谢,我需要阅读更多关于 Redis 的内容(到目前为止,我认为它只是一个典型的数据库)和 REST API。我目前的理解如下:通过这种方法,我可能不需要在每个节点和服务器之间建立开放连接,但是每个单独的节点可能会提交请求,然后询问结果或作业状态
    • 我主要担心的是,提交作业后,节点可能会反复向服务器发送调用(中间有一些等待时间(T)),直到它响应作业完成,但我实际上希望服务器尽快重新发送响应,这就是为什么我仍然相信某种异步方法在这种情况下可能会更好。 (因为如果作业花费了 (T+1) 时间,那么节点可能会在 (2T) 时间内开始接收它,因为在 (T) 之后它还没有准备好)
    • 不需要,服务器可以将所有作业放入队列中,并一一处理,并在数据库中更新作业的状态和结果。如果您想向节点推送通知,请使用 Web 套接字或推送器。
    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 2018-02-02
    • 2017-06-25
    • 1970-01-01
    • 2011-05-25
    • 2021-10-25
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多