什么是 ZeroMQ 中锁和关键部分的替代方案(指南)

What are alternatives to Locks and critical sections in ZeroMQ (guide)

我正在阅读 ZeroMQ 指南,目前在第 4 章,适合那些知道的人。

http://zguide.zeromq.org/page:all

我正在 python 使用绑定 pyzmq。

作者说我们应该忘记我们所知道的关于并发编程的一切,永远不要使用锁和临界区等

现在我正在用 ZeroMQ 做一个有趣的宠物项目,我有一段数据,它在一些线程之间共享(别担心我的线程,不要传递套接字)。他们共享一个数据库,

我的问题是:

我是否应该锁定那段数据,以避免竞争条件,就像通常情况下那样,以便序列化访问,或者这是在使用 ZeroMQ 时要避免的事情,因为存在更好的选择?

我记得作者说过,应该始终使用 inproc://ipc:// 在线程之间共享数据(对于流程),但我不确定这里是否合适。

这样做确实有很多激动人心的乐趣

是的,Pieter HINJENS 不建议任何超出他的零禅的步骤。不共享,不锁定...正如您已经在他的好书中多次注意到的那样。

问题的基石是什么 -- protecting [TIME]-domain consistent reflections of the Database-served条数据。

中,[TIME] 域问题跨越非单一景观,因此更多问题 spring 开箱即用。

如果我们知道,没有连接到系统的救生技术(监管+安全验证很高兴在这里不适用),可能有一些技巧可以使用 ZeroMQ 解决游戏并且没有任何命令锁。

使用 .setsockopt( { ZMQ.CONFLATE | ZMQ.IMMEDIATE }, 1 ) 基础设施,.setsockopt( ZMQ.AFFINITY, ... ).setsockopt( ZMQ.TOS, ... ) 延迟调整硬件基础设施 + O/S + 内核设置端到端,如果可能的话。

值得注意的一点是 Python 线程模型仍在 GIL 锁步下进行,因此主要的碰撞避免已经到位。


一个确实很硬的宠物项目:
(ZeroMQ不能也不会回避问题)

或者
共同定位决策过程,以便几乎-零延迟对更新数据做出决策,

允许非局部决策,但要让它们根据未补偿的延迟配备一些稳健的规则(在托管量子纠缠API发布并确实为我们服务之前基本上是不可能的) [TIME] - 域标记事件通知 - 因此还有一组规则控制机会来缓和数据库数据反射的一致性极端情况,其中任何 "earlier"-服务的 DB-READ 已交付 "near" 或 "after" 一个已知的 DB-WRITE 已经更改了它的值 - 远程观察者都可以在 几乎 的同时看到。

数据库自身的数据一致性由 DBMS 引擎本身维护。这里不用管了

让我们想象数据库访问被调解"through" ZeroMQ 通信工具。风险不在于性能扩展,ZeroMQ 享有 几乎 线性扩展,问题在于所服务的 [TIME] 域一致性 "answer" 任何地方 "behind" DBMS 引擎的边界,一旦我们进入 领域。

为什么?

DBMS 引擎的 "locally" 数据一致 "answer" 读取请求,由 DBMS 引擎在 UTC:000,000,000.000 000 000 [s] 时刻提供服务,将进行传输-class 特定的旅程,沿着预期的分发路径,但是——由于主要原因——直到 UTC:000,000,000.??? ??? ??? [s] 才交付到 "remote"-平台(取决于各自的运输方式-class 和中介平台的工作负载)。

接下来,可能会有并且将会有一个额外的主体诱导延迟,这是由其他不协调的进程请求的工作负载引起的,主要是在它们各自的外观上是并发的,后来以某种方式对齐到一个纯串行队列中,可能是由于ZeroMQ Context() 的工作或其他人的工作。这些阶段中队列管理和资源(非)可用性的动态增加了另一层延迟不确定性。

总而言之,一个人可能(也应该)像一群狮子一样为削减延迟成本而战。沿着 }-the-paths,但获得最小 + 可预测的延迟比任何容易实现的低悬果更像是一个愿望。

DB-READ-s 看起来主要是易于服务,因为它们可能看起来是无锁的,并且彼此之间没有协调,但是第一个 DB-WRITE-request 可能是一些已经安排好的 "answer"-s,还没有发送到网络上(并且每个这样的数据应该已经更新/替换为 DBMS-local [TIME]-domain " freshmost》 一个数据--- 既然没人愿意狗斗,越少再接一架飞机的炮弹,那架飞机就知道刚才已经被击落了,是她。 .. ? )

这些是在收集 智能设计经验(实时多人/大规模操作 SIM 是最好的)过程中已经学到的讲座。

inproc:// transport-class 是同地决策的最佳工具,但在 Python-based 生态系统(参考 GIL-lock-stepping 强制执行纯串行执行,GIL-release 的延迟比 almost-[=134 高出约 3~5 个数量级=]-RAM-read/write-s.

ipc:// transport-class sockets 可能跨越同位于同一主机上的进程间通信,但如果一侧进入 python,GIL-lock-stepping 仍然会 "chop" 你最小化累积延迟的努力,因为常规阻塞会出现在 GIL-interval 步骤中,增加的延迟抖动是实时最糟糕的事情 设计师正在梦想 :o)