跳至主内容

ZeroMQ =/= Erlang

·3 分钟阅读
Michael Bridgen

最近我看到一条推文说“ZeroMQ 让一切都 Erlang 化!”之类的。虽然我意识到并非网上发布的所有内容都是认真的,但似乎最近有一股类似的说法应该被遏制。

在文章《多线程的魔力》1 中,Pieter Hintjens 和 Martin Sustrik 有说服力地解释了为什么消息传递比锁和共享内存更能实现并发。我认为他们在分析中也很公正,除了暗示使用 ZeroMQ 会将你选择的编程语言变成一种“家用的”Erlang。

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

  • 快速创建/销毁进程
  • 支持 » 10 000 个并发进程,且特性基本不变的能力。

一个进程是轻量级值的编程模型——以及一个好的调度器——使并发编程更加容易,这类似于垃圾回收。它让你摆脱了对资源的微观管理,因此你可以花更多时间思考其他事情。

  • 快速异步消息传递。

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

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

值得注意的是,Erlang 强制执行了这一点。在其他语言中,共享内存及其使用陷阱(通常是无意中)并没有消失。

  • 进程监控。

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

  • 选择性消息接收。

你可以使用 ZeroMQ 的 poll 来一次性有效地使用单个进程中的多个通道;但是,你无法阻塞等待特定类型的消息,这意味着你必须缓冲你还不想处理的消息,或者保持复杂的状态。

ZeroMQ 是一个很棒的工具,我不会否认这一点。我的观点是,它不会神奇地为你提供防弹的并发编程;Erlang 也不会,但它比你可能被告知的要先进得多。使用 ZeroMQ,你仍然需要自己发明许多东西,模仿 Erlang 或其他方式。

脚注

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

© . This site is unofficial and not affiliated with VMware.