Kafka Producer APIs

旧版的Procuder API有两种:kafka.producer.SyncProducer和kafka.producer.async.AsyncProducer.它们都实现了同一个接口:

  1. class Producer {
  2. /* 将消息发送到指定分区 */
  3. public void send(kafka.javaapi.producer.ProducerData<K,V> producerData);
  4. /* 批量发送一批消息 */
  5. public void send(java.util.List<kafka.javaapi.producer.ProducerData<K,V>> producerData);
  6. /* 关闭producer */
  7. public void close();
  8. }

新版的Producer API提供了以下功能:

  1. 可以将多个消息缓存到本地队列里,然后异步的批量发送到broker,可以通过参数producer.type=async做到。缓存的大小可以通过一些参数指定:queue.timebatch.size。一个后台线程((kafka.producer.async.ProducerSendThread)从队列中取出数据并让kafka.producer.EventHandler将消息发送到broker,也可以通过参数event.handler定制handler,在producer端处理数据的不同的阶段注册处理器,比如可以对这一过程进行日志追踪,或进行一些监控。只需实现kafka.producer.async.CallbackHandler接口,并在callback.handler中配置。
  2. 自己编写Encoder来序列化消息,只需实现下面这个接口。默认的Encoder是kafka.serializer.DefaultEncoder
    1. interface Encoder<T> {
    2. public Message toMessage(T data);
    3. }
  3. 提供了基于Zookeeper的broker自动感知能力,可以通过参数zk.connect实现。如果不使用Zookeeper,也可以使用broker.list参数指定一个静态的brokers列表,这样消息将被随机的发送到一个broker上,一旦选中的broker失败了,消息发送也就失败了。
  4. 通过分区函数kafka.producer.Partitioner类对消息分区
    1. interface Partitioner<T> {
    2. int partition(T key, int numPartitions);
    3. }

    分区函数有两个参数:key和可用的分区数量,从分区列表中选择一个分区并返回id。默认的分区策略是hash(key)%numPartitions.如果key是null,就随机的选择一个。可以通过参数partitioner.class定制分区函数。

新的api完整实例如下:

  1. import java.util.*;
  2. import kafka.javaapi.producer.Producer;
  3. import kafka.producer.KeyedMessage;
  4. import kafka.producer.ProducerConfig;
  5. public class TestProducer {
  6. public static void main(String[] args) {
  7. long events = Long.parseLong(args[0]);
  8. Random rnd = new Random();
  9. Properties props = new Properties();
  10. props.put("metadata.broker.list", "broker1:9092,broker2:9092 ");
  11. props.put("serializer.class", "kafka.serializer.StringEncoder");
  12. props.put("partitioner.class", "example.producer.SimplePartitioner");
  13. props.put("request.required.acks", "1");
  14. ProducerConfig config = new ProducerConfig(props);
  15. Producer<String, String> producer = new Producer<String, String>(config);
  16. for (long nEvents = 0; nEvents < events; nEvents++) {
  17. long runtime = new Date().getTime();
  18. String ip = “192.168.2.” + rnd.nextInt(255);
  19. String msg = runtime + “,www.example.com,” + ip;
  20. KeyedMessage<String, String> data = new KeyedMessage<String, String>("page_visits", ip, msg);
  21. producer.send(data);
  22. }
  23. producer.close();
  24. }
  25. }

下面这个是用到的分区函数:

  1. import kafka.producer.Partitioner;
  2. import kafka.utils.VerifiableProperties;
  3. public class SimplePartitioner implements Partitioner<String> {
  4. public SimplePartitioner (VerifiableProperties props) {
  5. }
  6. public int partition(String key, int a_numPartitions) {
  7. int partition = 0;
  8. int offset = key.lastIndexOf('.');
  9. if (offset > 0) {
  10. partition = Integer.parseInt( key.substring(offset+1)) % a_numPartitions;
  11. }
  12. return partition;
  13. }
  14. }

KafKa Consumer APIs

Consumer API有两个级别。低级别的和一个指定的broker保持连接,并在接收完消息后关闭连接,这个级别是无状态的,每次读取消息都带着offset。

高级别的API隐藏了和brokers连接的细节,在不必关心服务端架构的情况下和服务端通信。还可以自己维护消费状态,并可以通过一些条件指定订阅特定的topic,比如白名单黑名单或者正则表达式。

低级别的API

  1. class SimpleConsumer {
  2. /*向一个broker发送读取请求并得到消息集 */
  3. public ByteBufferMessageSet fetch(FetchRequest request);
  4. /*向一个broker发送读取请求并得到一个相应集 */
  5. public MultiFetchResponse multifetch(List<FetchRequest> fetches);
  6. /**
  7. * 得到指定时间之前的offsets
  8. * 返回值是offsets列表,以倒序排序
  9. * @param time: 时间,毫秒,
  10. *              如果指定为OffsetRequest$.MODULE$.LATIEST_TIME(), 得到最新的offset.
  11. *              如果指定为OffsetRequest$.MODULE$.EARLIEST_TIME(),得到最老的offset.
  12. */
  13. public long[] getOffsetsBefore(String topic, int partition, long time, int maxNumOffsets);
  14. }

低级别的API是高级别API实现的基础,也是为了一些对维持消费状态有特殊需求的场景,比如Hadoop consumer这样的离线consumer。

高级别的API

  1. /* 创建连接 */
  2. ConsumerConnector connector = Consumer.create(consumerConfig);
  3. interface ConsumerConnector {
  4. /**
  5. * 这个方法可以得到一个流的列表,每个流都是MessageAndMetadata的迭代,通过MessageAndMetadata可以拿到消息和其他的元数据(目前之后topic)
  6. *  Input: a map of <topic, #streams>
  7. *  Output: a map of <topic, list of message streams>
  8. */
  9. public Map<String,List<KafkaStream>> createMessageStreams(Map<String,Int> topicCountMap);
  10. /**
  11. * 你也可以得到一个流的列表,它包含了符合TopicFiler的消息的迭代,
  12. * 一个TopicFilter是一个封装了白名单或黑名单的正则表达式。
  13. */
  14. public List<KafkaStream> createMessageStreamsByFilter(
  15. TopicFilter topicFilter, int numStreams);
  16. /* 提交目前消费到的offset */
  17. public commitOffsets()
  18. /* 关闭连接 */
  19. public shutdown()
  20. }

这个API围绕着由KafkaStream实现的迭代器展开,每个流代表一系列从一个或多个分区多和broker上汇聚来的消息,每个流由一个线程处理,所以客户端可以在创建的时候通过参数指定想要几个流。一个流是多个分区多个broker的合并,但是每个分区的消息只会流向一个流。

每调用一次createMessageStreams都会将consumer注册到topic上,这样consumer和brokers之间的负载均衡就会进行调整。API鼓励每次调用创建更多的topic流以减少这种调整。createMessageStreamsByFilter方法注册监听可以感知新的符合filter的tipic。

漫游Kafka实战篇之客户端API的更多相关文章

  1. 漫游Kafka实战篇clientAPI

    原文地址:http://blog.csdn.net/honglei915/article/details/37697655 Kafka Producer APIs 旧版的Procuder API有两种 ...

  2. 漫游kafka实战篇之搭建Kafka开发环境(3)

    上篇文章中我们搭建了kafka的服务器,并可以使用Kafka的命令行工具创建topic,发送和接收消息.下面我们来搭建kafka的开发环境.   添加依赖   搭建开发环境需要引入kafka的jar包 ...

  3. 漫游kafka实战篇之搭建Kafka开发环境

    上篇文章中我们搭建了kafka的服务器,并可以使用Kafka的命令行工具创建topic,发送和接收消息.下面我们来搭建kafka的开发环境.   添加依赖   搭建开发环境需要引入kafka的jar包 ...

  4. 漫游Kafka实战篇之搭建Kafka运行环境

    接下来一步一步搭建Kafka运行环境. Step 1: 下载Kafka 点击下载最新的版本并解压. > tar -xzf kafka_2.9.2-0.8.1.1.tgz > cd kafk ...

  5. 漫游Kafka实战篇之搭建Kafka运行环境(2)

    接下来一步一步搭建Kafka运行环境. Step 1: 下载Kafka 点击下载最新的版本并解压. > tar -xzf kafka_2.9.2-0.8.1.1.tgz > cd kafk ...

  6. javamail模拟邮箱功能发送电子邮件-基础实战篇(javamail API电子邮件实例)

    引言: JavaMail 是一种可选的.能用于读取.编写和发送电子消息的包 JavaMail jar包下载地址:http://java.sun.com/products/javamail/downlo ...

  7. 漫游Kafka入门篇之简单介绍

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢?   首先让我们看几个基本的消息系统术语: Kafka将消息以 ...

  8. 漫游Kafka入门篇之简单介绍(1)

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢?   首先让我们看几个基本的消息系统术语: Kafka将消息以 ...

  9. (转)漫游Kafka入门篇之简单介绍

    转自:http://blog.csdn.net/honglei915/article/details/37564521 原文地址:http://blog.csdn.net/honglei915/art ...

随机推荐

  1. IEEE 802.3 Ethernet

    Introduction Ethernet 是过去30年以来最为成功的局域网(local area networking)技术. 1. First widely used LAN technology ...

  2. 关于在linux下清屏的几种技巧

    在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...

  3. 客户端用httpurlconnection来进行http连接的

    客户端用httpurlconnection来进行http连接的,并设置restful风格 请求响应流程 设置连接参数的方法 setAllowUserInteraction setDoInput set ...

  4. 汇编语言---call和ret指令

    汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈 ...

  5. Hibernate笔记——Hibernate介绍和初次环境配置

    Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate ...

  6. java Process的waitFor()

    java Process的waitFor() 在编写Java程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本.在Java中提供了两种方法来启动其他程序: (1) 使用Runtim ...

  7. maven tomcat 插件实现热部署

    tomcat 的maven插件有助于提高开发效率,原因是: --可以直接把项目发布到远程的服务器上. --能够实现项目的热部署,在开发过程中修改了Java类,不需要重启tomcat 首先配置一个tom ...

  8. rc.local自启动学习(转)

    linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘. 本文中假设inittab中设置的init tree为: /etc/rc.d/rc0.d/etc/rc. ...

  9. PHP 增删改查 import!!

    主页面 <h1>主页面family</h1> <table width="100%" border="1px" cellpaddi ...

  10. ftp 建立、配置、实用软件 fileZilla server

    ftp 建立.配置.实用软件  fileZilla server