消息队列简介及安装

首先,在安装消息队列之前,我们需要知道消息队列是解决什么问题呢?

消息队列本质是解决消息传递的问题,场景都是扩展出来的。

可能你会问,一条消息不能直接传递吗?比如服务A不总是能将消息直接传给服务B吗?为啥还要引入一个消息队列?

有一些时候是不能的,举几个例子:

  1. 接收方处理不过来的时候,比如接收方每秒只能处理1000条消息,但是你因为搞活动,瞬间1s有10000条,这时候打过去接收方也扛不住啊,通过消息队列可以让接收方按自己的能力来协调,把消息压力摊平,这就是削峰
  2. 发送一个通知到短信服务,让短信服务发一条短信给客户,这时候如果要等待短信发完,发送方就会慢,不需要关注结果,就可以实现解耦

面对上述问题,没有什么事是引入一个中间层解决不了的;这就是引入消息队列作为中间层,来解决某些场景下消息传递的问题,这就是消息队列的意义;

接下来介绍消息队列的应用场景

  • 解耦

比如发送短信场景,假设服务SvrA发送消息给SvrB,SvrB发送短信给客户,很多时候业务是允许SvrA不需要得到SvrB发送完成的回应,只需要消息发送到SvrB就行了,这种情况下,如果还让SvrA等待SvrB的返回,显然会导致性能变低,同时还要去关注SvrB的运行结果。所以,如果业务可以去除这种依赖,那么就能获得性能,可靠性等的提升;

  • 异步

如果一个接口,处理时间很长,而且不能通过水平扩容来解决,就需要异步。那么,什么情况下不能通过水平扩容解决呢?

有很多,比如视频处理,涉及到视频下载,那受限于网络带宽等因素,扩容无用;比如区块链这种共识场景,只有单机才能出块,扩容也没有用;还有更常见的,比如一个业务流程,过了10多个微服务,单个也许不长,加起来就很难接受。

以上的情况下,用户很难通过同步接口长时间等待结果,那就应该做成异步,先扔进消息队列,后续再进行消费,和解耦一样可以收获更高的性能,以及获得更好的可靠性。

异步和解耦最大的区别在于,解耦是业务上本身就不需要依赖,异步是可能还是需要关注结果,但是不一定干等,可以回头再找。

  • 消息分发

假设一个核心服务A,是用来发布某种信号的,发布之后,需要通知到下游服务B、C,这种模式在只有B、C两兄弟的时候,没啥问题。但随着业务需要,可能会有D、E、F等更多的打工人出现,这时候A服务就需要更改代码,将消息也传递给这些新加入的兄弟,每次增加打工人,就需要更改一次代码。

而引入消息队列,就可以解决这个问题,实现代码复用,业务解耦,拥有高扩展性

  • 削峰

每天要被人打48拳,1小时之内打完48拳可能人就挺不过去了,但是分散到24小时,1小时两拳,就能存活,这就是削峰。

我们经常遇到的秒杀场景就需要削峰的能力,一般而言就是将扣减库存操作均匀化处理,以防止瞬时流量打崩MySQL,如下所示(上面的图是削峰前,下面的图是削峰后):

最后就是进入了kafka的安装,本文主要是在wsl2中通过docker来拉取安装

  1. 打开wsl2终端,进入我的用户主目录:

    bash 复制代码
    cd ~
  2. 创建一个专门放 Kafka 的文件夹

    bash 复制代码
    mkdir kafka-dev
  3. 创建配置文件 (docker-compose.yml)

    bash 复制代码
    nano docker-compose.yml
    bash 复制代码
    services:
      kafka:
        image: apache/kafka:latest
        container_name: kafka
        ports:
          - "9092:9092"
        environment:
          # KRaft 模式配置,不需要 Zookeeper
          KAFKA_NODE_ID: 1
          KAFKA_PROCESS_ROLES: 'broker,controller'
          KAFKA_LISTENERS: 'PLAINTEXT://:9092,CONTROLLER://:9093'
          KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://localhost:9092'
          KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
          KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT'
          KAFKA_CONTROLLER_QUORUM_VOTERS: '1@localhost:9093'
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
        volumes:
          - kafka_data:/var/lib/kafka/data
    
      kafka-ui:
        image: provectuslabs/kafka-ui:latest
        container_name: kafka-ui
        ports:
          - "8080:8080"
        environment:
          KAFKA_CLUSTERS_0_NAME: local-cluster
          KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
        depends_on:
          - kafka
    
    volumes:
      kafka_data:

    按下 Ctrl + O (保存),然后按 Enter 确认文件名。按下 Ctrl + X(退出编辑器)。

  4. 一键启动

    bash 复制代码
    docker compose up -d

    -d 的意思是"后台运行",这样你关掉终端窗口 Kafka 也不会挂掉。

  5. 验证安装结果

    bash 复制代码
    docker ps

    因为安装了 Kafka UI, 所以不用敲复杂的 Linux 命令,直接用你刚才安装的 Kafka UI (可视化界面)来操作:http://localhost:8080

9092Kafka 搬运工的端口(给代码、数据用的)。

8080Kafka-UI 监控器的端口(给人看网页用的)。

如果后期今天还要写代码,直接关掉 WSL 终端窗口即可,不用管它。Kafka 会在后台静默运行,随时待命。

但如果今天不写代码了,准备看电影或关机,建议手动停止它,释放内存给 Windows:

bash 复制代码
cd ~/kafka-dev

docker compose stop

之后如果你重启了 Windows:

  1. 确保 Docker Desktop 已经启动。

  2. 打开 WSL 终端,进入目录

  3. 再次输入:docker compose up -d它会秒级启动,并且你之前创建的 Topic 和数据都会通过我们配置的 volumes 自动找回来。

进入kafka的命令:

bash 复制代码
docker exec -it kafka bash
相关推荐
Devin~Y19 小时前
大厂Java面试实录:Spring Boot/Cloud + Redis/Kafka + JWT + RAG/Agent(小Y翻车版)
java·spring boot·redis·spring cloud·kafka·spring security·jwt
Jackyzhe20 小时前
从零学习Kafka:生产者分区机制
分布式·学习·kafka
XMYX-021 小时前
从一次 Kafka 启动失败,深挖本地服务间通信的“隐形陷阱”
kafka
面向Google编程2 天前
从零学习Kafka:生产者分区机制
大数据·kafka
Jackeyzhe2 天前
从零学习Kafka:生产者分区机制
kafka
jiajia_lisa2 天前
社区诊所便民行,就医通行不添堵
kafka
Devin~Y4 天前
大厂Java面试实战:Spring Boot + Redis + Kafka + Kubernetes + RAG 的三轮追问(附答案解析)
java·spring boot·redis·spring cloud·kafka·kubernetes·resilience4j
Devin~Y5 天前
大厂Java面试实战:Spring Boot/Cloud + Redis/Kafka + K8s + RAG/Agent 追问全流程(小Y翻车记)
java·spring boot·redis·spring cloud·kafka·kubernetes·micrometer
Devin~Y5 天前
大厂Java面试实录:Spring Boot/Cloud、Kafka、Redis、K8s 与 Spring AI(RAG/Agent)三轮连环问
java·spring boot·redis·mysql·spring cloud·kafka·kubernetes
frankfishinwater6 天前
Kafka 代码架构分析
分布式·架构·kafka