后端开发人员必备的前6个队列系统

本文概述

  • Redis
  • RabbitMQ
  • ActiveMQ
  • Amazon MQ
  • Amazon SQS
  • Beanstalkd
你在寻找队列系统吗?或者, 也许你正在寻找更好的产品?这是你需要的所有信息!
队列系统是后端开发中最有效的秘密。
不用写赞美队列系统的诗, 我要说的是, 一个初级后端开发人员在学会了将队列集成到系统中后就成为了中级后端开发人员。队列改善了客户体验(我们将了解如何), 降低复杂性并提高系统的可靠性。
当然, 对于流量几乎为零的非常简单的Web应用程序和手册网站而言, 队列可以是整体队列(如果你在典型的共享主机环境中, 甚至无法安装队列), 但是非琐碎的应用程序都将从队列中受益系统和大型应用程序是不可能不排队的。
在开始之前, 有一个免责声明:如果你已经熟悉队列系统并且想比较各种选项, 那么接下来的几个介绍性部分将使你大面积入睡。 ????因此, 随时可以向前跳。简介部分适用于那些对队列系统只有朦胧的想法或只是在顺便听到这个名字的人。
什么是队列系统?
让我们首先了解什么是队列。
队列是计算机科学中的一种数据结构, 可以模仿我们在周围看到的现实世界中的队列。例如, 如果你去售票柜台, 你会注意到你必须站在队列的尽头, 而排在队列开头的人将首先获得票。这就是我们所说的” 先到先得” 现象。在计算机科学中, 可以编写将这样的任务存储在队列中的程序, 并以相同的先后顺序进行处理。
后端开发人员必备的前6个队列系统

文章图片
请注意, 队列本身不会进行任何实际处理。它只是各种类型的临时存储, 任务会等到它们被某物拾取后再进行存储。如果这听起来有点抽象, 请放心。这是一个抽象的概念, 但是在下一节中, 我们将看到清晰的示例。 ????
为什么需要队列系统?
无需赘述, 我要说的是队列系统的主要需求是由于后台处理, 并行执行以及从故障中恢复。让我们借助示例来看看这些:
后台处理 假设你正在开展一项电子商务营销活动, 其中时间至关重要, 并且你构建了自己的应用程序, 以便它在客户完成付款之前触发确认电子邮件, 并显示” 谢谢” 页面。如果你要连接的邮件服务器已关闭, 则该网页将消失, 从而破坏用户体验。
想象一下, 你将获得大量的支持请求!在这种情况下, 最好将此电子邮件发送任务推送到工作队列, 并向客户显示成功页面。
并行执行 许多开发人员, 尤其是那些主要编写简单, 低流量应用程序的开发人员, 都习惯于使用cron作业进行后台处理。这很好, 直到输入的大小增大到无法清除为止。例如, 假设你有一个cron作业, 可以编译分析报告并将其通过电子邮件发送给用户, 并且你的系统每分钟可以处理100个报告。
一旦你的应用程序增长, 并且开始平均每分钟收到超过100个请求, 它将开始落后于越来越多的应用程序, 并且永远无法完成所有工作。
在队列系统中, 可以通过设置多个工作人员来避免这种情况, 这些工作人员可以选择一个工作(每个工作包含100个报告)并并行工作以更快地完成任务。
从故障中恢复 我们通常不会将失败视为网络开发人员。我们认为服务器和我们使用的API始终保持在线是理所当然的。但是现实是不同的-网络中断非常普遍, 并且你依赖的出色API可能由于基础架构问题而下降(在你说” 不是我!” 之前, 请不要忘记大规模的Amazon S3中断)。因此, 回到报告示例, 如果你的一部分报告生成要求你连接到支付API, 并且该连接断开了2分钟, 那么200条失败的报告会如何处理?
但是, 队列系统确实涉及相当大的开销。当你进入一个全新的领域时, 学习曲线非常陡峭, 应用程序和部署的复杂性增加, 并且队列的作业无法始终以100%的精度进行控制。也就是说, 在某些情况下无法构建没有队列的应用程序是不可能的。
顺便说一句, 让我们看一下当今队列后端/系统中的一些常见选项。
Redis Redis被称为键值存储, 仅存储, 更新和检索数据字符串而无需了解数据结构。尽管早些时候可能确实如此, 但如今Redis拥有高效且高度有用的数据结构, 例如列表, 排序集, 甚至是Pub-Sub系统, 因此非常适合队列实现。
后端开发人员必备的前6个队列系统

文章图片
Redis的优点是:
  • 完全在内存中的数据库, 从而实现更快的读写速度。
  • 高效:可以轻松支持每秒超过100, 000个读/写操作。
  • 高度灵活的持久性方案。你可以在出现故障的情况下以最大的性能损失为代价, 或者以完全保守的模式进行设置以牺牲性能以保持一致性。
  • 开箱即用支持的集群
请注意, Redis没有任何消息传递/队列/恢复抽象, 因此你需要使用软件包或自行构建轻量级系统。一个示例是Redis是Laravel PHP框架的默认队列后端, 该框架的作者已在其中实现了调度程序。
学习Redis很容易。
RabbitMQ Redis和RabbitMQ之间有一些细微的区别, 所以让我们先将它们弄清楚。
首先, RabbitMQ具有更专门的, 定义明确的角色, 因此它的建立是为了反映这一点-消息传递。换句话说, 它的优点是可以充当两个系统之间的中介者, 而充当数据库的Redis则并非如此。结果, RabbitMQ提供了Redis缺少的一些其他功能:消息路由, 重试, 负载分配等。
后端开发人员必备的前6个队列系统

文章图片
如果你考虑一下, 任务队列也可以被视为消息传递系统, 其中调度程序, 工作人员和作业” 子发送者” 可以被视为参与消息传递的实体。
RabbitMQ具有以下优点:
  • 更好的消息传递抽象, 如果需要消息传递, 则可以减少应用程序级的工作。
  • 对电源故障和停电具有更大的弹性(至少在默认情况下比Redis更强)。
  • 集群和联合支持分布式部署。
  • 用于管理和监视部署的有用工具。
  • 支持几乎所有非平凡的编程语言。
  • 使用你选择的工具(Docker, Chef, Puppet等)进行部署。
何时使用RabbitMQ?如果你知道需要使用异步消息传递但还没有准备好解决此列表中其他一些队列选项的复杂性(请参阅下文), 那将是一个不错的选择。
ActiveMQ 如果你正在进入企业领域(或正在构建一个高度分布式的大型应用程序), 而又不想一直重新发明轮子(并一路犯错误), ActiveMQ值得一看。 。
后端开发人员必备的前6个队列系统

文章图片
这是ActiveMQ的优势所在:
  • 它是用Java实现的, 因此具有真正的Java集成(遵循JMS标准)。
  • 支持多种协议:AMQP, MQTT, STOMP, OpenWire等。
  • 开箱即用地处理安全性, 路由, 消息到期, 分析等。
  • 对流行的分布式消息传递模式的内置支持, 可节省你的时间和代价高昂的错误。
【后端开发人员必备的前6个队列系统】这并不是说ActiveMQ仅可用于Java。它具有适用于Python, C / C ++, Node, .Net和其他生态系统的客户端, 因此将来不必担心崩溃。此外, ActiveMQ建立在完全开放的标准之上, 构建你自己的轻量级客户端应该很容易。
说完所有这些, 请注意, ActiveMQ只是一个代理, 不包含后端。你仍然需要使用受支持的后端之一来存储邮件。我将其包含在此处是因为它与特定的编程语言无关(例如Celery, Sidekiq等其他流行的解决方案)
Amazon MQ Amazon MQ在这里值得快速但重要地提及。如果你认为ActiveMQ是满足你需求的理想解决方案, 但又不想自己处理和维护基础架构, 那么Amazon MQ会提供托管服务来做到这一点。它支持ActiveMQ所做的所有协议-功能完全没有差异-因为它在表面下使用ActiveMQ本身。
好处是它是一项托管服务, 因此你无需担心使用它。对于在AWS上进行的那些部署而言, 这更有意义, 因为你可以直接从部署内部利用其他服务和产品(例如, 更快的数据传输)。
Amazon SQS 我们不能指望亚马逊在关键基础设施方面保持安静, 可以吗? ????
因此, 我们有了Amazon SQS, 这是由著名的巨型AWS提供的完全托管的简单队列服务(从字面上看)。同样, 细微的差异也很重要, 因此请注意, SQS没有消息传递的概念。与Redis一样, 它是一个用于在队列中接受和分发作业的简单后端。
后端开发人员必备的前6个队列系统

文章图片
那么, 你什么时候要使用Amazon SQS?原因如下:
  • 你是AWS的粉丝, 不会碰其他任何东西(老实说, 那里有很多这样的人, 我认为这没什么不对)。
  • 你需要一个托管解决方案, 因此请确保故障率是零且没有任何作业丢失。
  • 你不想建立群集, 而必须自己监视它。或更糟糕的是, 当你可能需要使用监视时间进行生产性开发时, 必须构建监视工具。
  • 你已经在AWS平台上进行了大量投资, 因此保持业务联系是有意义的。
  • 你需要一个集中的, 简单的队列系统, 而没有任何与消息传递, 协议等无关的绒毛。
总而言之, 对于想要将作业队列纳入其系统而又不必担心自己安装/监控的人, Amazon SQS是一个不错的选择。
Beanstalkd Beanstalkd已经存在很长时间了, 它是经过考验的, 快速, 易于后端的队列。 Beanstalkd的一些特征使其与Redis明显不同:
  • 严格来说, 这是一个工作队列系统, 仅此而已。你将工作推向工作, 稍后工作人员会拉动工作。因此, 如果你的应用程序甚至很少需要传递消息, 就希望避免使用Beanstalkd。
  • 没有高级数据结构, 如集合, 优先级队列等。
  • Beanstalkd是所谓的先进先出(FIFO)队列。无法按优先级安排工作。
  • 没有用于群集的选项。
Beanstalkd所说的所有这些都为一个驻留在单个服务器上的简单项目提供了一个流畅而快速的队列系统。对于许多人来说, 它比Redis更快, 更稳定。因此, 如果你在使用Redis时遇到问题, 无论如何都无法解决, 而且你的需求很简单, 那么Beanstalkd值得一试。
总结
如果你已经读了那么多书(或在这里读了????), 那么你很有可能对队列系统感兴趣或需要一个队列系统。如果是这样, 除非你正在寻找特定于语言/框架的队列系统, 否则此页面上的列表将非常适合你。
希望我能告诉你, 队列很简单, 而且100%可靠, 但事实并非如此。这很杂乱, 而且因为它全都在后台并且发生得非常快(错误可能会被忽略, 并且代价很高)。尽管如此, 队列仍然是非常必要的, 而且你会发现它们是武器库中的强大武器(甚至是最强大的武器)。祝好运! ????

    推荐阅读