使用 MySQL 和套接字消息队列是否被视为实时系统?

Is using MySQL and a socket message queue considered a realtime system?

我正在使用 PHPratchet,我正在处理如何创建事件从服务器端并将其推送到客户端。

我知道我可以使用ZeroMQ,但这也会产生开销,每次必须通知事件时,都会建立一个新的套接字连接。

所以我想知道,如果有一个始终从名为“SocketQueue”的 MySQL table 中选择的线程使用内存作为引擎,那不是更好吗?

这种架构会不会让app失去"Realtime"的属性?

让我们先跳过营销术语
并专注于严谨的系统设计

虽然可以阅读很多标签,例如 real-timeultra-fast低延迟,这些在严格的系统设计决策中并不代表相同的重要性,并且具有很大不同的重要性。

是的,速度是一个很好的功能,但并不总是可以以合理的成本实现或统一保证,包括生产生态系统中的最坏情况。所以“快速”有帮助,但不是实时系统设计的基石。

低延迟

这里也是一样,latency是审核中交易必须支付的主要成本。同样,如果延迟规模不会先验地破坏系统设计,那很好,但是一旦原则上可行,实时系统设计将重点放在延迟抖动上,而不是延迟值本身,因为我们必须接受现实,并且系统必须被证明能够稳健地处理所有不同的延迟级别,作为生产生态系统现实不可分割的一部分。

实时

嗯,一个系统可以称为实时系统,如果它有这样一个属性,那么该设计已通过严格的先验 证明 交叉验证,在所有可能的情况下,实时执行调度都稳健地满足给定的内部时间范围,在该时间范围内,系统它有能力始终及时”处理所有内部处理子任务。

In case
any item
from this semidefinition above
is not present - be it:
- R/T-design internal scheduling time horizon
- R/T-design validation
- R/T-design positive proof of it's robustness in "being always in time" under conditions above
the efforts fail to be rigorously real-time
and cannot hold an attribute of "Real-Time"

细心的 reader 已经注意到,实时性规则没有说明内部调度时间范围将持续多长时间。

是的,实时系统可以设计并积极证明其能力能够稳健地满足 1 [us] 或 1 [ms] 或 1[s] 或 1 [min] 或范围内的所有子任务1 [小时],而在所有情况下,实时执行都被视为 严格的实时系统。

实时系统,有大约一个小时的调度,还有一些原因吗?当然,它们已经并且是一个非常常见的设计目标,想象一下地球/深空-Space 卫星无线电向上link 和地面控制站操作在 link 之间协调,这需要一些时间几个小时来回获取任何 telemetry/control 数据。

是的,并非所有现实世界的进程都能承受如此长的调度范围,并且需要将此阈值与奈奎斯特稳定性标准保持安全距离,因为受控进程为 stable(即鲁棒)控制。

同时,走到实时调度范围另一端的远端,太紧的调度时间范围不需要保存项目,因为设计必须适应所有实时硬件 material限制(没有人可以发送比光速更快的信号(忘记量子纠缠,即使这样也不能救你)功率-消耗限制并且仍然在经济上可行,包括系统设计、编程和验证的成本。

适度扩展是必须的

回到素描组件。

ZeroMQ 应该被认为是一个相当持久的通信+信令层。我的分布式系统应用程序使用 ZeroMQ 并从这种方法中受益并提供合理的服务,在适当的照顾下,减少到几十个 [us] 调度框架。

任何尝试设置 ZeroMQ 临时套接字的想法都是行不通的,因为设置开销不符合实时设计意图。这是一个必要的工程实践来设置这些先验,一旦系统启动并执行自诊断任务,然后整个生态系统可以在 R/T 模式下声明为 RTO。

您的 [消息+信号] 层设计不需要对任何 MySQL table 有外部依赖性来决定消息/信号分发的正确路由。可能需要在 ZeroMQ 内部花费更长的时间,但这是 ZeroMQ 专业化的最强大功能之一。

为了实时操作模式,ZeroMQ 不依赖于任何 Message-Broker 实体,这将使您的实时设计另一个层面的噩梦,因为你的设计不能在 messaging/signalling 层的这个(顺便说一句,一个核心)元素上有任何 tools/controls,而你的子任务都严重依赖于平滑,只是 - Broker 介导的 message/signal 交付的足够长的延迟。

MySQL 引擎在 "being always in time" 中的差异最大。提供一套合理的非传统编程方法,以承担积极证明子任务调度鲁棒性的责任,需要付出巨大的工程努力。