代理与无代理
RabbitMQ 团队一直在与 Martin Sustrik 合作,为RabbitMQ 和 ZeroMQ 结合使用提供代码和文档。 为什么这是一个好主意? 因为代理和无代理方法是互补的。 我们将在代码库发展过程中发布更多相关内容。 这篇文章是入门级的,可以看作是对Ilya Grigorik 关于 ZeroMQ 的精彩介绍和InfoQ 对 Ilya 文章的总结的评论。
我喜欢 ZeroMQ 并认为它很有用 - 下面会详细介绍。 但是我看到了一些关于它的夸大宣传。 这可能导致混淆。
那么“无代理”模型是什么? 在 Ilya 和 InfoQ 文章的评论中,ZeroMQ 被比作 SCTP 和 JGroups。 这些都是重要的技术,为思考无代理消息传递模式提供了有用的起点。 让我们看看如果将消息传递(如 SCTP)与发布/订阅组(如 JGroups)结合起来以使用“无代理”对等体创建任意网络,您可能需要什么。
无代理网络中您可能需要的一些东西
如果您建立了一个无代理消息网络,您可能需要三件事:发现、可用性和管理。
发现是维护系统可以向其发送消息的对等体名册以及哪些对等体可以加入此名册的问题。
可用性是处理对等体不时消失的问题。 例如,如果您有 50 个订阅者订阅一个提要,并且只有 40 个订阅者可以接收更新,您是否应该保留其消息的副本直到它们重新出现? 这可能意味着“很长时间”。 而且,如果您确实保留消息和“谁看过什么”的列表,那么最好在哪里执行此操作?
当消息接收者没有快速响应时,这也是一个问题。 引用ZeroMQ 的 Martin Sustrik 的话,“您永远无法区分‘网络错误’和‘未收到响应’。 TCP 也一样。 您必须接受这一点或坚持使用一个盒子。”
管理也是一个有趣的分析领域。 ZeroMQ 的模型将消息传递与套接字紧密结合。 这意味着,就像在 TCP 中一样,'任何' 通信网络都可以以提供某些消息传递功能的方式实现。 但是,网络可能非常复杂。 例如,除非您不在乎(而且您可能不在乎),否则管理“谁连接到谁,以及谁可以连接到谁”可能会变得复杂。 这种管理问题随着您扩展的规模变得更加困难。 像 JGroups 这样的模型通常通过做出简化的假设来消除此问题,即:组中的每个人都与组中的其他人通信。 简单 :-)
我并不是说您总是需要这些东西。 ZeroMQ 的理念是专注于网络,这创造了焦点。 但是,如果您确实需要它们,那么您可能最终需要自己实现它们。 进入代理...
**代理如何帮助解决这些问题**
代理可以为发现、可用性和管理提供解决方案。 它们还可以形成可靠的网络,例如用于电子邮件传递和即时消息服务。
首先:什么是“代理”? 它既是领导者,又是中间人。
代理是领导者。 在分布式计算中,管理、发现和可用性问题通常通过在分布式组件集中选举领导者来解决。 在“消息传递”领域,这样的领导者通常被称为“代理”。 说明为了成为领导者,您需要成为代理,这使得确定谁是领导者比在完全无代理的系统中“任何人都可以领导,但没有人知道如何”更容易。
代理也是中间人。 例如,与其让组中的每个人都直接连接,通信者只需连接到代理(或代理)。 代理也可用于解决诸如“脱机消费者”之类的可用性问题,方法是代表无法自行执行此操作的系统提供持久性和管理恢复。
因此,代理通过做出合理的假设来简化网络设计。 当然,当这些假设不成立时,您可能不希望使用代理。
代理不是“集中式”的
关于代理的一个普遍误解是它们是“集中式”的。 代理不一定是“集中式”的解决方案。 中介可以是分散的。 您可以在单个网络中拥有多个代理以提高吞吐量和可用性。 有时,这些服务器网络被称为联合体。 请注意,为了拥有冗余的服务器网络,各个代理不需要“高可用性”。
例如,电子邮件 (SMTP) 和 XMPP 网络就是这样工作的。 电子邮件和即时消息都是代理模型,并且都以简单且冗余的方式使用多个代理。 例如,邮件传输代理为电子邮件提供交付和路由网络。 在没有重新发明“特殊对等体”(也称为代理)的情况下,很难提出完全对等的对等设计。
那么哪个模型最简单?
对等模型本身并不比代理模型更简单或更复杂。 如果您不需要发现、可用性、管理或中介,那么可能更简单地不使用它们。 但是,如果您需要它们,那么可能更简单地不自己实现它们。
服务器(代理)网络并不比客户端(对等体)网络更冗余或更分散。 代理和无代理模型在可靠性和其他方面(例如延迟)方面都有其优缺点。
这两个模型解决不同的问题。
例如,RabbitMQ 和 ZeroMQ 是互补的。 从 RabbitMQ 的角度来看,ZeroMQ 是一种“智能客户端”,可以像队列一样使用其缓冲区。 在某些情况下这很有用。 从 ZeroMQ 的角度来看,RabbitMQ 是一种网络设备,提供您可能不希望自己实现的服务。
我们希望我们的客户和用户始终拥有最佳的工具集,因此我们提供了供您使用的 Github 代码库。 再次感谢 Martin Sustrik 为此做出的贡献。
敬请关注此有趣的工作和讨论领域的更多内容。