本文目的
研究了一下Kafka Produce/Consumer 的API,发现Consumer API的使用并没有那么的straight forward。折腾了2天后,终于摸到了一些门道,这里记录下怎样使用High Level Consumer API来接收并处理一个Topic中的消息。
本文的例子用Scala编写,如果要改成Java的其实很容易。
环境
Kafka为0.8.2.0(CDH版本)
Scala为2.10.4
Kafka中事先创建了一个名为my-2nd-topic
的Topic,该Topic由2个partition构成,如下:
我们将向该topic中写入一些消息,生成消息的代码如下:
object ProduceKeyedMsg {
def BROKER_LIST = "ecs1:9092,ecs2:9092"
def TOPIC = "my-2nd-topic"
def main(args: Array[String]): Unit = {
println("开始产生消息!")
val props = new Properties()
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BROKER_LIST)
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, classOf[StringSerializer].getName)
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, classOf[StringSerializer].getName)
val producer = new KafkaProducer[String, String](props)
for (i <- 0 to 10) {
val ret: Future[RecordMetadata] = producer.send(new ProducerRecord(TOPIC, "key-" + i, "msg-" + i))
val metadata = ret.get // 打印出 metadata
println("i=" + i + ", offset=" + metadata.offset() + ", partition=" + metadata.partition())
}
producer.close
}
}
Consumer API
Consumer的预期行为:开启两个线程,去并行地读取Topic中的消息。(Consumer的两个线程正好对应着Topic的两个partition)
先给出代码,然后再给分析。
package cn.gridx.kafka.apis.scala.consumer
import java.util.Properties
import kafka.consumer.{ConsumerIterator, KafkaStream, Consum