- 背景
- kafka的主要功能
- kafka核心API
- 基本术语
- Topic
- Producer
- Consumer
- Broker
- 版本
- 依赖包
- 常用命令
- 参考文章
背景
最近在公司老大要做一个kafka consumer接收kafka server的message,其实很简单的一个功能,用kafka都有些大材小用了,一般的JMS都可以了。
之前没有用过kafka,所以去简单了解了一下。
kafka的主要功能
- 发布和订阅消息(流),在这方面,它类似于一个消息队列或企业消息系统。
- 以
容错
的方式存储消息(流)。 - 在消息流发生时处理它们。
kafka核心API
- 生产者Producer API
- 消费者Consumer API
- 流处理Streams API
- Connector API
基本术语
Topic
Kafka将消息种子(Feed)分门别类,每一类的消息称之为一个主题(Topic).
Producer
发布消息的对象称之为主题生产者(Kafka topic producer)
Consumer
订阅消息并处理发布的消息的种子的对象称之为主题消费者(consumers)
Broker
已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker). 消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。
版本
之前做的时候老大说用high level consumer API或者low level conxumer API来做,但是我在做的过程中发现对接的kafka(网管团队维护)版本是0.11的,在网上查阅了解到kafka0.9之后新增了一个Java消费者用于替换现在基于zookeeper(一个分布式的应用程序协调服务,如果有做过dubbo项目的同学应该很熟悉)的high or low level consumer API。
依赖包
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.1.0</version>
</dependency>
常用命令
查看当前kafka所有的topic
./kafka-topics.sh –list –zookeeper localhost:2181/nokia/nsp/kafka
producer发送message
./kafka-console-producer.sh –broker-list localhost:9092 –topic ns-eg-2cea2382-2f25-4524-80ec-31949dd37c0cconsumer接受message
./kafka-console-consumer.sh –bootstrap-server localhost:9092 –topic ns-eg-2cea2382-2f25-4524-80ec-31949dd37c0c –from-beginning查看版本(kafka没有类似于java -version这样的命令)
find ./libs/ -name *kafka_* | head -1 | grep -o ‘\kafka[^\n]*’这个命令查找到类似于kafka_2.9.2-0.8.1.1.jar.asc 这样的jar包,然后这个jar包的名称前面的数据2.9.2是scala(kafka就是用scala开发的)的版本,后面的0.8.1.1就是所用的kafka的版本。
# 使用
因为我只使用到了kafka consumer API,所以这里列出consumer的代码
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("foo", "bar"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
以上是自动提交偏移量(offset)的consumer client,消费者TCP长连接到Broker拉取message。关于偏移量的概念很重要,可参考下面提供的参考文章有详细叙述。
参考文章
http://orchome.com/5 kafka入门介绍
http://orchome.com/451 kafka消费者客户端
http://kafka.apache.org/ kafka官网