跳到主要内容

ZeroMQ 不等于 Erlang

·3 分钟阅读
Michael Bridgen

最近我看到一条推文说“ZeroMQ 让一切 Erlang 化!”或者类似的话。虽然我知道并非网上发布的所有内容都是认真的,但似乎最近出现了一股类似的说法潮流,应该阻止一下。

在文章《多线程的魔力1》中,Pieter Hintjens 和 Martin Sustrik 令人信服地解释了为什么消息传递比锁和共享内存更适合并发。我认为他们的分析是公平的——除了暗示使用 ZeroMQ 会将你选择的编程语言转变为家用的 Erlang。

文章中途有一个障眼法。在提到 Erlang 的成分后,文章只选择其中一个——消息传递——作为关键成分,而忽略了其余的。但其他的至少同样重要!让我们看看所有这些成分:

  • 快速进程创建/销毁
  • 能够支持超过 10000 个并发进程,且特性基本保持不变。

编程模型中,进程是轻量级的值——而一个好的调度器——使得并发编程更加容易,类似于垃圾回收。它让你从资源微观管理中解放出来,以便你可以花更多时间思考其他事情。

  • 快速异步消息传递。

这就是 ZeroMQ 给你的。但它以不同于 Erlang 的形式给你:在 Erlang 中,进程是值,消息传递通道是匿名的;在 ZeroMQ 中,通道是值,进程是匿名的。ZeroMQ 更像 Go 而不是 Erlang。如果你想要 Actor 模型(Erlang 基于此),你必须在你选择的语言中自己编码实现它。

  • 复制消息传递语义(无共享并发)。

值得注意的是,Erlang 强制执行这一点。在其他语言中,共享内存以及使用它的陷阱(通常是不自觉地)并不会消失。

  • 进程监控。

Erlang 附带一个庞大的库,经过数十年的实战检验,用于构建高度并发、分布式和容错系统。其中关键的是进程监控——进程终止通知。这允许复杂的进程管理策略;特别是,使用监督者层级将系统的核心部分与更容易发生故障的部分隔离开来。

  • 选择性消息接收。

你可以将 poll 与 ZeroMQ 一起使用,以在一个进程中高效地使用许多通道;但是,你无法阻塞特定类型的消息,这意味着你必须缓冲你不想立即处理的消息,或者保留复杂的状态。

ZeroMQ 是一个很棒的工具包,我不会反驳这一点。我的观点是,它不会神奇地给你提供万无一失的并发编程;Erlang 也不会,但它比你可能被引导相信的要领先得多。使用 ZeroMQ,你仍然需要发明许多东西,无论是模仿 Erlang 还是其他方式。

脚注

  1. 多线程的魔力。非常值得一读。

© . All rights reserved.