前言
最近在做测试平台的开发过程中,需要用到消息队列,在简单调研后选取了主流的kafka做为我们平台的消息中间件,以下是对kafka的学习笔记。
1. 重要概念
- topic:消息的主题/队列(逻辑概念)
- producer:生产者
- consumer:消费者
- broker:集群中的服务器节点,即实际存储消息的服务器
- consumer group:消费者组,每个consumer归属于一个group
消息在同一个consumer group下的consumer间,实行负载均衡
消息在不同consumer group下的consumer间,实行广播
- partition:物理概念。一个topic包含多个partition,数据在partition中连续。
- leader/follower:partition的多副本,其中一个为leader,其余为follower
- controller:其中的一个broker,记录所有brokers的存活状态,决定选举
- segment:每个partition在物理上被平均分配到许多个大小相等的segment。每个segment包含一个index file和一个data file。
- offset:偏移量,每条消息的唯一标识。
2. Log compaction
kafka中的每一条数据都有一对key和value,存放在磁盘上。一般不会被永久保留,而是在到达一定的数量或者时间后对最早写入的数据进行删除。
Log compaction确保kafka将始终保留单个topic partition的数据日志中每个key值的最后一个已知值。它给出在应用程序崩溃或系统故障后恢复状态,或者在操作维护期间重新启动应用程序后重新加载缓存这些场景的解决方法。
3. 生产与消费
一个消息可以被多个consumer group消费,但只能被同一个group下的一个consumer消费。好处是可以同时提供离线和实时处理(离线和实时分属两个group,各自消费,互不影响)。
4.kafka的命令使用
kafka搭建: http://www.orchome.com/6
kafka启动命令:
bin/kafka-server-start.sh config/server.properties &
创建topic:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
查看topic:
bin/kafka-topics.sh --list --zookeeper localhost:2181
生产消息:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
This is a message
This is another message
消费消息:
#从头开始消费消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
#从客户端启动后消费新到达的消息:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
#指定消费者组,从该消费者组上次的偏移量开始消费
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config config/consumer.properties
查看topic的分区、副本信息
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic
5. 感悟
- 一个topic分为多个partiton,每个partition被分到不同的broker,是为了提高吞吐率。
- 一个partition会有多个replica,是为了做消息高可用,提高容错。
- kafka将元数据信息保存在zookeeper中,元数据信息包括consumer group、controller、brokers和topic等信息,并由zookeeper来保持这些元数据的更新。
6. API
- Producer: https://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProducer.html
- Consumer: https://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html
- Streams: https://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/streams/KafkaStreams.html
- Connect: https://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/connect
- Python API: https://pypi.python.org/pypi/kafka-python
7. 其他
kafka架构:
segment中,index和log文件的对应关系