首页 > 解决方案 > 无人机管理数据库设计

问题描述

概述

我目前正在构建一个原型来跟踪和控制一群无人机。

原型由一个服务和一个 Web 应用程序组成。在网络应用程序中,每架无人机的位置都会实时显示在地图上,用户可以向每架无人机发出基本命令。该服务是自动化的,还可以在某些情况发生时随机向每架无人机发出命令。

我正在使用 HiveMQ(一个 MQTT 代理)来促进无人机、Web 应用程序和服务之间的通信。Web 应用程序和服务都订阅了“遥测”主题,以接收有关无人机网络的实时数据。代理将通过使用 HiveMQ 的扩展功能将每架无人机的遥测数据直接存储到数据库中。

只有满足特定条件才能执行特定命令。

例如:要向无人机发出“执行任务”命令,服务或 Web 应用程序将调用 API。API 将:

  1. 检查无人机当前未执行任务(无人机状态值必须为空闲)
  2. 检查任务发生地区的天气状况是否可接受

(注意,“任务”是指无人机自动飞到一系列设定的位置)。

如果不满足条件,则会向请求者(Web 应用程序或服务)返回指示此情况的响应。如果满足条件,API 将通过 MQTT 代理向相应的无人机发出命令,并向请求者发送响应。

要求

我需要一个满足以下条件的存储机制:

  1. 我需要确保 Web 应用程序和服务之间不会发生争用情况。也就是说,如果 Web 应用程序正在发出向无人机发出命令的请求,那么此时服务发出的请求应该会被自动拒绝。
  2. 服务和 Web 应用程序之间的无人机状态不是同步的,因此,它们需要一个同步点来检查无人机状态。
  3. 无人机将每秒更新一次状态,每 10 - 30 秒调用一次 API 来发出命令。这个原型中将有 5 架无人机,但我想要一个可以扩展到 50 架无人机的解决方案。

考虑的解决方案

我的解决方案是关系数据库的解决方案——使用带有“request_lock”字段的单独表,该字段使用行级锁。

当进行 API 调用时,它会检查此字段是否为真,如果为真则拒绝请求。如果为假,则将字段设置为真执行必要的条件检查,然后在命令到达无人机后将“request_lock”字段设置为假。

我担心每架无人机的状态更新频率不适合关系数据库模型并且不能很好地扩展。我是在正确的轨道上,还是应该以某种方式包含一个 NoSQL 数据库来处理状态更新?

感谢任何花时间回答的人。

标签: sqldatabasenosql

解决方案


这里有很多问题,所以我将尝试选择似乎最重要的问题:

我担心每架无人机的状态更新频率不适合关系数据库模型..

我应该使用关系数据库还是非关系数据库?

首先,让我们计算一下每秒无人机状态更新的最大次数。

无人机将每秒更新一次状态,API 调用 [原文如此] 以发出命令将每 10 - 30 秒进行一次。这个原型中将有 5 架无人机,但我想要一个可以扩展到 50 架无人机的解决方案。

  • 50 架无人机 * 每秒 1 次无人机更新 = 每秒 50 次无人机更新
  • 50 架无人机 * (10 / 60) 每秒无人机指令 = 8.3 无人机指令每秒

那么,关系数据库每秒可以处理约 60 个查询吗?

是的。假设查询复杂度合理,这在传统关系数据库的能力范围内。我也不认为数据库需要非凡的系统资源。

如果您想通过基准测试来确认这种性能水平,我建议您使用pgbench之类的工具。


推荐阅读