Database 关系数据库是否适用于软实时系统?

Database 关系数据库是否适用于软实时系统?,database,performance,scalability,real-time,Database,Performance,Scalability,Real Time,我正在开发一个实时视频分析系统,它逐帧处理视频流。在每个帧上,它可以生成几个事件,这些事件应该被记录下来,有些通过网络传送到另一个系统。该系统是软实时的,即消息延迟超过25ms是非常不可取的,但不是致命的 关系数据库(特别是MySQL和Postgres)是否适合作为此类系统的数据存储 当DB安装在自己的服务器上,并且通过网络输入了约50个25fps的单行SQL插入流时,我能期望它工作得很好吗 编辑:我认为总体性能不会有问题,但我担心延迟变化。如果它偶尔会延迟1000毫秒,那将是非常糟糕的 哦,系

我正在开发一个实时视频分析系统,它逐帧处理视频流。在每个帧上,它可以生成几个事件,这些事件应该被记录下来,有些通过网络传送到另一个系统。该系统是软实时的,即消息延迟超过25ms是非常不可取的,但不是致命的

关系数据库(特别是MySQL和Postgres)是否适合作为此类系统的数据存储

当DB安装在自己的服务器上,并且通过网络输入了约50个25fps的单行SQL插入流时,我能期望它工作得很好吗

编辑:我认为总体性能不会有问题,但我担心延迟变化。如果它偶尔会延迟1000毫秒,那将是非常糟糕的


哦,系统全天候运行,因此数据库可以任意增长。这会降低插入延迟吗?

在选择关系数据库而不是其他类型的数据存储时,我不会太担心性能,选择最能满足以后访问该数据要求的解决方案。但是,如果您确实选择了一个RDBMS,但在网络上选择一个,那么您可能需要考虑到本地磁盘上的缓冲事件。使用单独的线程、进程或其他方法将事件推送到数据库中,以保持实时系统不受影响。

在选择关系数据库而不是其他类型的数据存储时,我不会太担心性能,请选择最能满足您日后访问该数据要求的解决方案。但是,如果您确实选择了一个RDBMS,但在网络上选择一个,那么您可能需要考虑到本地磁盘上的缓冲事件。使用单独的线程、进程或其他方法将事件推送到数据库中,以保持实时系统不受影响。

最大的问题是延迟将如何不可预测,以及它如何从不下降,总是上升。但现代硬件需要拯救的是,指定一台具有足够cpu核心的机器。你可以指望至少有两个,得到四个是很容易的。因此,您可以启动一个线程,并将一个核心用于数据库更新,从而将其与软实时代码隔离。现在,您不关心延迟的可变性,至少只要数据库更新不会花费太长的时间,您生成数据的速度不会超过它所能消耗的速度


设置一个数据库服务器,并用假数据加载,这是您认为需要存储的数据量的两倍。在开发过程中不断测试,添加所需的检测代码,以测量项目早期阶段的性能。

最大的问题是延迟将如何不可预测,以及延迟如何从不下降,始终上升。但现代硬件需要拯救的是,指定一台具有足够cpu核心的机器。你可以指望至少有两个,得到四个是很容易的。因此,您可以启动一个线程,并将一个核心用于数据库更新,从而将其与软实时代码隔离。现在,您不关心延迟的可变性,至少只要数据库更新不会花费太长的时间,您生成数据的速度不会超过它所能消耗的速度


设置一个数据库服务器,并用假数据加载,这是您认为需要存储的数据量的两倍。在开发过程中不断进行测试,添加所需的检测代码,以在项目的早期阶段测量其性能。

正如我所写的,如果您将需要保存的行排队,并以异步方式保存它们(以便不停止“主”线程),那么应该不会有任何问题。。。但是

您想将它们保存在数据库中。。。因此,其他人将在写入行的同时读取这些行。可悲的是,通常很难告诉DB“这项工作的优先级很高,其他所有工作都可以暂停,但不是这项”。因此,如果有人这样做:

BEGIN TRANSACTION
    SELECT COUNT(*) FROM TABLE
    WAITFOR DELAY '01:00:00'
(我在这里使用的是T-Sql…但我认为这很清楚。询问表的计数(*),以便表上有一个锁,然后等待一个小时)


然后写操作可能会暂停并进入超时状态。通常,如果您将除应用程序外的所有人都配置为只能执行读取,则这些问题不应存在。

如我所述,如果您将需要保存的行排队,并以异步方式保存它们(以便不停止“主”线程),则不应出现任何问题。。。但是

您想将它们保存在数据库中。。。因此,其他人将在写入行的同时读取这些行。可悲的是,通常很难告诉DB“这项工作的优先级很高,其他所有工作都可以暂停,但不是这项”。因此,如果有人这样做:

BEGIN TRANSACTION
    SELECT COUNT(*) FROM TABLE
    WAITFOR DELAY '01:00:00'
(我在这里使用的是T-Sql…但我认为这很清楚。询问表的计数(*),以便表上有一个锁,然后等待一个小时)


然后写操作可能会暂停并进入超时状态。通常,如果您将除应用程序外的所有人都配置为只能进行读取,则这些问题不应出现。

作为补充说明,您只需要MySQL和Postres就可以“正常”保存帧。如果他们“正常”需要20毫秒来保存帧,那么就可以了。您可以有一个需要保存的缓冲区异步队列。@xanatos:该队列可能会带走ACID,这可能不是此应用程序的问题。另一种可能性是在实时操作系统上工作。但我真的希望“运行良好”在很大程度上取决于RTOS运行的硬件。@CodeInChaos的行数约为1kb,有几十个整数和浮点数。至于硬件,现在我们有了相当新的、功能强大的Core i7设备,希望转向更便宜的视频处理设备+一台功能强大的DB服务器。另外,请注意,您只需要MySQL和Postres就可以“正常”保存帧。如果他们“正常”需要20毫秒来保存帧,那么就可以了。您可以有一个需要保存的缓冲区异步队列。@xanatos:该队列可能会带走ACID,这可能不是此应用程序的问题。一