RabbitMQ VS Apache Kafka (一)—— RabbitMQ简介

释放双眼,带上耳机,听听看~!

在接下来的系列章节中,我们将探讨两种消息中间件RabbitMQ与Apache Kafka,从设计的角度来看,作为两种不同的消息中间件,各自都有自己的技术考究,也都有一定的优缺点。本章,我们将不会去评判孰优孰劣,而是作为接下来本系列的引言或者入门。

RabbitMQ

RabbitMQ是一个分布式的消息队列系统。之所以说是分布式,因为它通常作为节点集群运行,这其中队列分布在节点上,并可选择复制以实现分区容错性和高可用性。它原生地实现了AMQP0.9.1,并通过插件提供其他协议,如STOMP,MQTT和HTTP。
在消息传递方面,RabbitMQ兼容经典与新颖的特点。经典,是因其还是基于消息队列。新颖则是体现在其高度灵活的路由功能。能够提供快速、可伸缩、可靠的分布式消息传递系统本身就是一件非凡特性,但艳压群芳的灵活路由使其在众多的消息中间件中脱颖而出。

交换器和消息队列

概述

  • 生产者发送消息给交换器
  • 交换器将消息路由到队列和其他交换器中
  • 一旦收到消息,RabbitMQ会发送消息确认给消息发布者
  • 消费者会维持与RabbitMQ的TCP长连接,并且同时声明目标消费队列。
  • RabbitMQ会推送消息给消费者
  • 消费者会发送成功/失败的消息确认
  • 一旦消息被消费者成功处理,就会从队列者删除。

下图是一个简单的应用示例,仅包含一个生产者、交换器、消息队列和消费者。

如果是多个生产者和多个消费者呢?

另一种场景,三个消费者同时从一个消息队列中获取消息,这种场景下,消费者之间彼此存在一个竞争关系。因此,我们根据需要适当的增加或者删除消费者来提高扩展我们的消息处理能力。无论你有多少消息者,RabbitMQ最终都会保证竞争条件下单个消息被路由到一个消费者。

我们可以将图2和图3结合起来一起使用,如下图所示:

可靠性保证

针对消息传递的可靠性问题,RabbitMQ提供的是最多一次交付至少一次交付,但不保证完全一次交付。关于这一点,我们将在后面的章节中讨论。

消息会按照先进先出的原则进行路由,但在消费者竞争的场景下,并不保证消息的最终处理与消息路由出队列的顺序完全相同,这并非RabbitMQ的不足或者缺陷,而是并发消息处理的基本特性,如果要实现消息处理顺序与最初的路由出队列顺序完全一致,可以通过一致性哈希交换(Consistent Hashing Exchange)来解决。关于这一部分,我们后续章节会有讨论。

消息推送与CONSUMER PREFETCH

RabbitMQ以流的方式将消息推送给消费者,RabbitMQ同样提供了“拉”的方式来获取消息,但“拉”的方式存在一定的性能问题,这是因为在“拉”的方式下,对于每一个消息来说,都需要请求/响应这样一个消息回路。
但如果消费者处理消息的速度小于消息产生的速度,那么基于消息推送的方式可能会导致消费者来不及处理,进而导致消费者被压垮。所以,为了避免这种问题的发生,每一个消费者都需要配置一个预支取阈值(又称:QoS阈值)。QoS阈值表示的一个消费者一次最多可以容纳多少待处理的消息,也就是说当消费者来不及处理消息时,QoS扮演的是一个安全开关的角色。

这里提出一个问题,为什么使用“推”而不是“拉”的模式,主要是基于以下几方面的考虑:

  • 低延迟
  • 竞争消费的场景下实现负载均衡

路由

交换器的基本作用是消息路由,用以路由到消息队列或者其他交换器中,这里就涉及到了消息绑定。不同的交换器需要不同的消息绑定,RabbitMQ提供了四种类型交换器,各自对应四种不同的消息绑定:

  • 扇出模式:将消息路由到所有绑定到当前交换器的消息队列和交换器中,即我们常见的发布订阅模式
  • 直接模式:消息路由基于消息本身自带的路由键值,该键值由发布者设置,路由键值是一个短的字串。直接交换器会将消息路由到包含与路由键值完全配置的绑定键值的队列或者交换器中。
  • 主题模式:消息路由基于路由键值,但允许模糊匹配。
  • 消息头模式:RabbitMQ支持自定义消息头,基于消息头的交换器会基于消息头的值进行路由。每一个消息绑定都会包含精确的目标匹配消息头值。一个消息绑定可以包含多个匹配选项,通过“或”或者“与”的关系指定匹配规则。
  • 一致性哈希:一致性哈希会通过哈希路由键值或者消息头的方式将消息路由到单个消息队列中。一致性哈希可以确保竞争消费的场景下消息处理的有序性。

下图展示的是基于主题的消息路由,关于这部分,我们将在后续的章节中讨论。

即时交换器与消息队列

交换器和队列可以动态创建,并且具备一段时间后自动销毁的功能特性。这种特性也就使得基于RPC协议来创建即时应答队列成为可能。

插件

一些常见的插件可提供的功能:

  • HTTP Server功能,同时包含Web UI及Rest API(Management Plug-In)
  • 一致性哈希,分片交换等等
  • 支持STOMP及MQTT协议
  • web hooks(钩子)
  • 其他类型的消息交换
  • SMTP集成

以上只是RabbitMQ的一些简单介绍,下面的章节我们介绍Kafka。

给TA打赏
共{{data.count}}人
人已打赏
安全网络

CDN安全市场到2022年价值76.3亿美元

2018-2-1 18:02:50

安全资讯

今年五一有多火?支付宝发布假期最能“买”十大县城

2021-8-16 15:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索