Kafka和RabbitMQ——带有消息传递的异步休息服务

245 阅读6分钟

如今,我们比其他任何时候的几十年都更多地依赖数据来完成工作。应用程序、服务、软件、移动设备和其他元素结合在一起得到网络服务,影响到我们生活的大部分领域。

因此,由于需要处理彼此之间的数据流,程序员使用消息代理和类似的工具来交换信息和沟通。

消息代理是让应用程序、服务和系统进行通信和交换信息的软件模块。

消息代理通过在正式的消息传输协议之间翻译消息,使相互依赖的服务能够直接相互交流。

为什么我们需要一个消息传递系统?

消息传递系统的主要任务是可靠地将消息从发送方的计算机转移到接收方的计算机。消息传递的好处包括。远程通信。消息传递使独立的应用程序能够进行通信和传输数据。

什么是异步和同步程序?

同步程序。一个使用阻塞式调用的程序。为了在调用过程中不被冻结,它必须有2个或更多的线程(这就是为什么它被称为同步程序--线程在同步运行)。

异步程序。一个使用非阻塞式调用的程序。它可以只有1个线程,并且仍然保持互动。

异步描述了两个或更多的事件/对象之间的关系,它们在同一系统中确实相互作用,但不以预定的时间间隔发生,也不一定依赖彼此的存在来发挥作用。

但我们用来做微服务的协议大多数时候是HTTP,它是同步协议。因此,只要你实现了微服务,你就会使用HTTP,这就成了同步的。

Kafka和RabbitMQ是两个最流行的消息代理,在生产者和消费者之间传递消息。

RabbitMQ。

RabbitMQ

RabbitMQ 使用一个独特的、有边界的数据流。消息由生产者创建和发送,并由消费者接收。而这种经纪商最适合于交易性数据,如订单的形成和放置,以及用户请求。RabbitMQ向用户发送消息。这些消息一旦被处理就会从队列中删除。

RabbitMQ 的好处是能够灵活地路由消息。直接或基于正则表达式的路由允许消息到达特定队列,而无需额外的代码。

RabbitMQ 消息代理由以下部分组成。

  1. 生产者 - 发送消息的用户应用程序
  2. 交换 - 将消息推送到队列中。示例交换类型是直接、主题、标题和扇出。
  3. 队列-每个交换包含一个缓冲区,或称队列,用来存储消息。
  4. 消费者-接收消息的用户应用程序

在 RabbitMQ 中,调度在某些情况下不能正常工作。

默认情况下,RabbitMQ 将按顺序将每个消息发送到下一个消费者。 因此,每个消费者将获得相同数量的消息。这种分配消息的方式被称为轮循。

考虑到有 2 个工作者的情况,这些传入的工作将在这 2 个工作者中平均分配。因此,假设一个接一个的工作负载很重,而另一个接一个的工作负载很轻,所以可能有一个工作者不断得到重的工作负载,而另一个可能是自由状态

就像这样,RabbitMQ对此一无所知,并且仍然会均匀地分派消息。它不看一个消费者的未确认消息的数量。它只是盲目地将每一个 n 个消息分派给 n 个消费者。

因此,可能会有一些事件,比如一个人可能闲置,而另一个人可能堆满了消息。

所以为了避免这种情况,RabbitMQ有一个叫做Fair-Dispatch的属性,它有一个叫做prefetch的特性,这个prefetch值用于指定有多少消息正在同时发送,所以它要等待消息的处理结束,在这种情况下,一个消费者可能不会堆积这些消息,而其他消费者处于空闲状态。

因此,在这个消息处理过程中可能会出现另一种可能性。

由于某些原因,在消息处理过程中,消费者可能会有一些损失,正在处理的消息可能没有完成,那么数据就会丢失。为了确保数据不丢失,RabbitMQ使用被称为ACK的消息确定。

因此,在这里,消费者从RabbitMQ收到消息并对其进行处理,它将反馈给RabbitMQ,而RabbitMQ在收到反馈后将消息从队列中删除,因此它将涵盖这种有损失的特性。

现在让我们看看Kafka是如何做到这一点的。

Kafka。

在Kafka中,我们有一个主题,所以这个消息的发布将直接指向这个主题。

与RabbitMQ中使用的Round Robin技术不同,Kafka使用消费者组来避免我们上面讨论的问题。所有主题的分区都在组内的消费者之间进行划分。

想想看,一个名为 "销售 "的主题。
所以我们有一些分区。P-0,P-1,P-2都在同一个销售主题上。
当我们向Kafka代理发布消息时,它遵循一种算法。
该算法使用一个密钥,并将这个密钥与我们所拥有的分区的数量进行模拟。因此,它采取该值进行处理,并根据该数字在分区内进行划分。
但是在Kafka中,这个顺序只在分区内保证,而不是在主题内。

因此,我们可以采取消费者,我们可以让他们倾听每个分区。所以,如果这组消费者是同一个组,那么消息就会在同一个消费者组内传递。
但是有一个限制。

如果我们有3个参与者,如果我们的消费者组有4个消费者,其中一个将是空闲的,因为它受限于我们的分区数量。
因此,消费者组中的消费者数量应该小于或等于我们的分区数量。

因此,从上面的讨论中可以看出,我们可以使用Kafka和RabbitMQ来做同样的工作,但问题是我们不一定要用Kafka来做,rabbitMQ的功能已经足够了。

了解Kafka消费者偏移量。

消费者偏移量是一种跟踪消息被Kafka主题接收的顺序的方法。它将一直保存到消息被交付给消费者的地方,所以一段时间后,当消费者回来时,Kafka知道从哪里恢复交付过程。