跳至主要内容

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. 多线程魔法。值得一读。

© 2024 RabbitMQ. All rights reserved.