Skip to content

消息队列

基本概念

消息队列就像是一条高速公路上的排队系统,它使得各个系统组件之间能够松散耦合、异步处理任务,并且在面对高并发时能够保证系统的稳定运行。

1. 什么是消息队列?

  • 排队系统的比喻: 想象一下你去快餐店点餐。你下单后,订单就排在队里等待处理,厨房会按照先来的先做。这里的“订单”就类似于消息,而“队列”则确保所有订单按顺序被处理。这样即使同时有很多订单进来,厨房也能一个一个地完成,而不会手忙脚乱。
  • 松耦合(Decoupling)的好处: 在计算机系统中,不同的模块(比如用户请求处理、数据记录、邮件发送等)有时需要互相通信。使用消息队列,可以让一个模块把任务放入队列,然后其他模块再从队列中取出任务来处理。这样各个模块之间就不需要直接依赖,即使其中一个模块暂时忙不过来,任务也不会丢失,而是“排队”等待。

2. 消息队列的主要用途

  • 异步处理: 当你在网站上提交一个操作(例如上传图片、下订单等),系统可以立即响应用户,而把一些耗时的操作(比如图片处理、发送确认邮件)放到消息队列中,由后台慢慢处理。这样用户体验会更好,因为响应不会因为后台任务而变慢。
  • 流量削峰: 在一些访问量很大的系统中,瞬时请求量可能非常高。通过将这些请求先放入消息队列,再由后端系统逐步处理,可以有效防止系统因突然的大流量而崩溃,就像是排队等候可以防止拥堵一样。
  • 解耦系统模块: 各个模块之间通过消息队列来通信,彼此之间不直接调用。这样一来,如果某个模块需要升级或者暂时出现故障,其他模块仍然可以正常运行,因为消息会一直保存在队列中,等模块恢复后再处理。

3. 举个实际例子

假设你在一个电商平台上购物,下单后系统会:

  • 立即确认订单给你反馈,告诉你“订单已提交”。
  • 同时,将订单信息放入消息队列。
  • 后台的订单处理系统会从队列中依次取出订单,进行库存检查、支付处理、物流安排等操作。

这样设计的好处是:

  • 用户不需要等所有操作都完成才看到结果。
  • 各个处理环节可以独立扩展,比如遇到高峰期时,可以增加更多的订单处理服务来从队列中取单。

Kafka

Kafka 是一个高吞吐量、分布式的消息队列系统,主要用于构建实时数据流管道和流处理应用。它的核心概念包括“Producer(生产者)”、“Consumer(消费者)”、“Topic(主题)”以及“Broker(服务器节点)”。使用 Kafka,可以将数据流从一个系统传递到另一个系统,实现解耦和异步处理。

创建集群->新增Topic->编写生产者逻辑->编写消费者逻辑

关键术语

**Topic:**Kakfa中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中

Cluster: Kafka的物理集群,每个集群中可以新建多个不同的topic

Producer: 顾名思义,也就是消息的生产端,负责将业务消息发送到Topic当中

Consumer: 消息的消费端,负责消费已经发送到topic中的消息

**Offset:**对于每一个Partition来说,每一条消息都有一个唯一的0ffset,消息在partition内的相对位置信息,并且严格递增

Repica: 分片的副本,分布在不同的机器上,可用来容灾,Leader对外服务,Folower异步去拉取leader的数据进行一个同步,如果leader挂掉了,可以将Follower提升成leader,再对外进行服务。

**ISR: **意思是同步中的副本,对于Folower来说,始终和leader是有一定差距的,但当这个差距比较小的时候,我们就可以将这个folower副本加入到ISR中,不在ISR中的副本是不允许提升为Leader的。

Partition: 通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐。对于每一个Partition来说,每一条消息都有一个唯一的Offset,消息在partition内的相对位置信息,并且严格递增。

Kafka保证快速、稳定的做法

1、Producer:批量发送、数据压缩

2、Broker:顺序写,零拷贝、消息索引

3、Consumer:Rebalance

Released under the MIT License.