Kafka原理
生产者消费者模式
生产者Producer ——消息队列MQ(Kafka)—— 消费者Consumer
每个事件在kafka中有一个唯一的序号offset
消费者可以通过offset来跟踪已消费事件,确保不会重复消费或漏消费,而且这些事件会被持久化到kafka中,即使某个服务暂不可用也不会丢失数据
相当于你玩戴森球,上一个产线产出之后放到a物流塔里,其他b物流塔选择本地需求然后从a中获取,不够就等着什么时候够了给你运过来
假设有个产物要2个原料,第一个原料早就准备好了,那就等第二个原料的产线产出,能被“订阅”之后再开始处理新的配方产出
主题Topic
可以将消息按照主题来进行分类和组织(多级反馈队列?mqtt?
每个主题还可以被进一步划分成多个partition分区
每个分区可以被不同的消费者线程并行处理
kafka只会保证每个分区内的消息是有序地,但是不同分区之间的消息顺序是不保证的
所以设置主题和分区时需要根据业务需求合理划分
常用的作法是把用户id作为分区的key,kafka会根据key的哈希来决定消息应该放到哪个分区,相同的key也就会被分到一个分区中
Broker
kafka集群通常由多个broker组成,每个broker都是一个独立的服务器,负责存储和转发消息。
每个broker可以存储多个主题的多个分区,并且每个分区可以有多个副本
副本是分区的备份,每个分区有一个Leader和多个Follower,Leader负责处理实际的对外读写请求,而Follower负责复制Leader的数据,保证即使某个Leader宕机也不会丢失数据
消费者组Consumer Group
多个消费者共享一个或多个主题的消息
每条消息只能被同一个消费者组中的一个消费者消费,但是可以被多个消费者组消费
安装配置
官方文档:
Step 1: Get Kafka
Download the latest Kafka release and extract it:
1 | $ tar -xzf kafka_2.13-4.1.0.tgz |
Step 2: Start the Kafka environment
NOTE: Your local environment must have Java 17+ installed.
Kafka can be run using local scripts and downloaded files or the docker image.
Using downloaded files
Generate a Cluster UUID
1 | $ KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)" |
Format Log Directories
1 | $ bin/kafka-storage.sh format --standalone -t $KAFKA_CLUSTER_ID -c config/server.properties |
Start the Kafka Server
1 | $ bin/kafka-server-start.sh config/server.properties |
Once the Kafka server has successfully launched, you will have a basic Kafka environment running and ready to use.
创建和管理主题
查看主题
1 | bin/kafka-topics.sh --bootstrap-server localhost:9092 --list |
--bootstrap-server
连接到kafka服务的地址,localhost:9092
选择本地服务
--list
列出所有的主题 --describe
查看详细信息
创建主题
1 | bin/kafka-topics.sh\ |
*加\
可以多行输入
修改主题
1 | bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic --alter --add-config retention.ms=10000 |
删除主题
1 | bin/kafka-topics.sh\ |
发送和接受消息
发送消息
1 | bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic my-topic |
crrl+c 退出消息发送
接收消息
1 | bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-topic |