RabbitMQ解释在5分钟或更短的时间内
今天我们将看到如何通过异步执行最重的处理来加快页面加载时间,所有这些都非常简单地由RabbitMQ管理。
应用程序或网站的稳定性和速度无疑是用户最重要的因素之一。有谁从未在看到第一页之前离开过一个网站,因为加载时间太长了呢?
RabbitMQ是什么
RabbitMQ 是一个开源、分布式和可扩展的messaging broker,用作生产者和消费者之间高效通信的中介。
RabbitMQ采用应用层消息传递协议AMQP,该协议专注于通过经纪人对生产者和消费者的消息接收确认来通信异步消息的投递保证。
RabbitMQ的工作原理
简单来说,RabbitMQ定义了队列,这些队列将存储由生产者发送的消息,直到消费应用程序获取消息并处理它。它使我们能够设计和实现分布式系统,其中系统被划分为相互通过消息通信的独立模块。
就像所有通信一样,我们需要一个生产者、一个消息和一个接收者。而在这个过程中的中间环节是RabbitMQ,它是消息等待接收者的位置。
通过了解表示消息交换的交换类型,我们可以更好地理解它的工作原理。
交换类型
通过交换,当我们通过RabbitMQ发送消息时,我们不直接发送到队列;为了让其他系统读取它,我们将其发送到一个交换,该交换负责将消息转发到不同的队列。
交换的类型包括Direct、Fanout、Topic和Readers。
直接交换
假设一个生产者需要向三个消费者发出购买确认消息。也就是说,系统需要与其他三个不同的系统进行通信以完成购买。
由于RabbitMQ将消息单独发送到每个队列,有机会使这些其他系统直接接收到这些消息。
通常,交换将消息转发到队列,但我们经常不希望我们的消息发送到所有队列。因此,我们可以应用多个条件使交换工作。
这样,您可以将消息发送给一个消费者,而不是发送给所有人。
绑定键:要将队列连接到交换,需要创建一个绑定,即队列与交换之间的关系,类似于连接器。
路由键:在这个绑定中,我们还可以创建一个称为路由键的元素,换句话说,它是将消息转发到特定队列的关键字。
如果有一个路由键X、一个路由键Y和一个路由键Z,例如具有路由键Y的消息将通过队列Y传递,并直接传递给您定义的接收消息的消费者。
这样,我们可以将多个队列连接到一个交换中,但同时它们也可以使用路由键与交换具有不同的关系。
扇形交换
当消息发送到交换时,它将发送到与其连接的所有队列。因此,如果您有10个连接到扇形交换的队列,所有队列都将接收到发送的消息。
主题交换
它是最灵活的交换之一,允许我们根据主题发送消息。根据您命名路由键的方式,可以创建规则和系统之间的关系模式。
例如:routing key (x.*); routing key(*.z); routing key (*.y.*).
RabbitMQ中的AQMP是什么
AMQP (高级消息队列协议)是一种开放的消息传输协议,用于定义多个应用程序之间的消息传输。它类似于HTTP和TCP协议,是一种基于传输层的协议,不同之处在于它允许异步传输。
RabbitMQ选择实现AMQP有几个原因。首先,与定义API的JMS不同,该协议被描述为中间件的标准。
包括Red Hat、思科系统和微软在内的国际联盟撰写了这个AMQP Specification。其次,这个协议的互操作性使得任何实现AMQP的应用程序都可以与AMQP代理进行通信。
AMQP不是RabbitMQ使用的唯一协议。下面的图像表示RabbitMQ实现和/或支持的所有协议、语言和API。
RabbitMQ的最佳功能
除了通过异步消息和不同位置的不同应用程序的集成,RabbitMQ还提供了其他功能,这些功能使得它在消息代理的世界中非常流行:
可靠的存储
RabbitMQ具有多种功能,使其能够保证消息传递。其中之一是在没有消费者可以接收消息时提供存储。它允许消费者接受消息传递,以确保它已经成功处理。
如果处理失败,RabbitMQ允许重新排队消息,以便由不同的消费者实例消费,或者在恢复时再次由最初失败的同一消费者处理。
RabbitMQ还保证消息的传递顺序;也就是说,它们按照到达RabbitMQ队列的顺序消费。
集群的创建
尽管RabbitMQ能够每秒处理数千条消息,但有时需要能够处理更多的消息数量而不影响应用程序的性能。
为此,RabbitMQ允许创建集群以水平扩展解决方案,对生产者和消费者都是透明的。
高可用性队列
在RabbitMQ中,队列可以在集群的多个节点之间复制,确保在节点故障或停机的情况下,代理仍然可以接收来自生产者的消息并将其传递给适当的消费者。
灵活的路由
在RabbitMQ中,可以定义灵活的路由规则,甚至按照某种模式来路由交换机和队列之间的消息,通过绑定实现。
多协议支持
除了支持AMQP协议外,RabbitMQ还通过插件支持STOMP、MQTT和HTTP。它还为每个代理的组件提供了authentication和访问控制机制。
RabbitMQ的实际用例
RabbitMQ最重要的用例是实现应用程序之间的异步性,减少应用程序之间的耦合,分发警报以及控制后台作业队列。
然而,RabbitMQ的实际用例是在eCommerce中,它用于将销售订单处理、处理和转发到其他部门的系统,如分发和发票开具。
在处理订单时,您可以将销售消息转发到配送中心和发票区域。在这种方案中,一切都按照水平方向工作,遵循发送消息的异步模式,但通常可以将一个动作发送到多个队列。
根据前面的例子,在客户购买商品并且需要准备配送、运输和发票时,此功能非常有用。
由于每个部门都是不同的系统,RabbitMQ的目标是将所有这些消息转发到相应的系统。
Rabbit MQ的替代方案:
RabbitMQ比看起来简单得多,有几个替代方案,包括:
#1. IronMQ
IronMQ是一个超快的消息队列软件。它在设计上高可用、耐用,并且更适合一次性传递。IronMQ是现代应用架构中最强大的原生云解决方案。
它支持推送队列、拉取队列和长轮询,可以保持轮询请求的打开时间更长。此外,它可以使用多个高可用数据中心,从而实现可扩展性。
您可以在云中、共享或专用硬件上部署,也可以在本地部署。它还提供了一系列具有易于阅读文档的客户端库。
#2. Apache Kafka
Kafka是一个在分布式事件流中具有强大存在的平台。在其核心,Kafka被设计为一个复制、分布、持久的提交日志。
它最大的可用性是用于事件驱动的微服务或大规模流处理应用程序,自动在集群中异步复制事件以实现容错性和高可用性。
#3. Apache ActiveMQ
ActiveMQ是一个基于Java的多协议消息代理。借助它,我们可以在应用层使用AMQP消息队列协议集成应用程序。
它实现了多个协议用于集成,例如JMS(原生Java)和Stomp(可以被PHP应用程序使用),等等。
此外,亚马逊有自己的“托管”版本称为Amazon MQ,这使得使用该服务变得更加容易。
最后的话
消息代理在组织架构中一直是一个重要的组成部分。但随着越来越多的用户通过不同的渠道进入公司系统,需要能够以较低成本水平横向扩展的产品。从而处理每秒大量的消息。
这就是像RabbitMQ这样的新一代代理变得在现代应用中更加重要的地方,现代应用旨在为我们的客户提供高水平的可用性、可靠性、互操作性和性能。
您还可以探索一些可靠的RabbitMQ hosting platforms,以供您的应用程序使用。