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

时间:2018-04-23 06:57:33

标签: python-3.x zeromq latency distributed-system pyzmq

我正在阅读ZeroMQ-目前在第4章的指南,供那些了解的人使用。

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

我在python中使用绑定pyzmq。

作者说我们应该忘记关于并发编程的所有知识,不要使用锁和关键部分等。

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

我的问题 是:

我应该锁定这段数据,以避免竞争条件(如通常那样),以便序列化访问,或者这是否在使用ZeroMQ时要避免,因为存在更好的替代方案?

我记得作者说应该始终使用 inproc:// ipc:// (对于进程)在线程之间共享数据,但我是不知道这是怎么回事。

1 个答案:

答案 0 :(得分:1)

这样做有很多令人兴奋的乐趣,确实

是的,Pieter HINJENS并没有建议在他的Zen-of-Zero之外做任何一步。什么都不分享,什么都不锁......正如你已经多次在他的好书中注意到的那样。

问题的基石是什么 - 保护数据库服务的数据片段的 [TIME] - 域一致反映。

中,[TIME] - 域问题跨越非奇异景观,因此更多问题开箱即用。

如果我们知道,没有与系统相关的救生技术(监管+安全验证很乐意在这里不适用),可能有一些技巧可以用ZeroMQ解决游戏并且没有任何必要的锁定。

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

值得注意的另一点是,Python线程模型仍处于GIL-lock-stepping之下,因此主要的冲突避免已经就位。

一个确实非常困难的宠物项目:
(ZeroMQ不能也不会避免出现问题)

<强>要么
共同确定决策过程,以便在对更新数据做出决策时具有几乎 - 零延迟,

允许非本地决策,但基于未补偿的的延迟(在Managed Quantum Entanglement API发布并且确实在我们的服务中工作之前主要是不可能的),使它们具备一些强大的规则 [TIME] -domain标记的事件通知 - 因此还有一组规则可控制机会来缓和数据库数据 - 反射的一致性极端情况,其中任何&#34;更早&#34; - 已提供服务的DB- READ &#34;附近&#34;或&#34;之后&#34;已知的DB- WRITE 已更改其值 - 远程观察者在几乎 - 同时可见。

数据库自身的数据一致性由DBMS引擎本身维护。这里无需关心。

让我们想象一下数据库访问是通过&#34;通过&#34; ZeroMQ通信工具。风险不在于性能扩展,其中ZeroMQ享有几乎 - 线性扩展,问题在于所述[TIME] - 所服务的&#34;答案&#34的域一致性;任何地方&#34;落后&#34;一旦我们进入领域,DBMS引擎的边界就越多。

为什么?

DBMS引擎&#34;本地&#34;数据一致&#34;回答&#34;在UTC:000,000,000.000 000 000 [s]时刻由DBMS引擎提供的读取请求将沿着预期的分发路径进行特定于传输级别的旅程,但是 - 由于主要原因 - 无法交付到{&#34; -platform直到UTC:000,000,000.??? ??? ??? [s](取决于相应的传输级和中间平台&#39;工作负载)。

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

放在一起,人们可能(并且应该)作为一群狮子而战斗,以便在延迟成本的同时削减延迟成本。尽管如此,获得最低+可预测的延迟比任何容易实现的低成果更令人满意。

DB- READ -s似乎很容易服务,因为它们之间可能看起来像无锁和无编排,但是第一个DB- < strong> WRITE - 请求可能是已经安排好的&#34;答案&#34; -s,但尚未发送到线路上(每个此类数据应该已更新) /替换为DBMS本地 [TIME] -domain&#34; 最新 &#34;数据--- 由于没有人愿意与狗搏斗,所以从飞机上进一步接受射击的次数越少,那就是她刚刚被击落的,她是......?

这些是在收集智能设计作品时已经学到的讲座。经验(实时多人/大型动作SIM卡是最好的)。

inproc:// transport-class是共同定位决策的最佳工具,但在基于Python的生态系统中无法帮助您(参见GIL-lock-stepping强制执行纯串行执行,GIL释放的延迟比几乎 - &#34;直接&#34; -RAM读/写s高出约3~5个数量级。

ipc:// 传输类套接字可能跨越共同位于同一主机上的进程间通信,但如果一方进入python,那么GIL-lock-stepping将会& #34;斩波&#34;您最大限度地减少累积延迟的努力,因为常规阻塞将出现在GIL间隔步骤中,并且增加延迟抖动是实时设计师梦寐以求的最糟糕的事情:o)