kafka-深入剖析

一、生产者示例:
    1、代码示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");    // 指定kafka的服务地址
props.put("acks", "all");                                           // 指定生产者收到多少个已经将消息持久化后的服务器响应才算消息发送完成
props.put("retries", 0);                                            // 设置消息失败后的重试次数
props.put("batch.size", 16384);                                // 设置每批的大小。值小将降低系统吞吐量、值太大将占用较多内存
props.put("linger.ms", 1);                                        // 指定消息的延迟值,以便等待更多的消息一起批量发送,提高发送的效率。然而会有稍许延迟。
props.put("buffer.memory", 33554432);                    // 设置生产者缓存值。如果消息到达的速度大于生产者发送的速度,那生产者缓存区将被耗尽。消息发送将被阻塞。阻塞时间超过 max.block.ms的值时将抛出TimeoutException异常
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");    // 指定消息key的序列化类
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");    // 指定消息value的序列化类

Producer<String, String> producer = new KafkaProducer<>(props);
for(int i = 0; i < 100; i++){
     producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));
}
producer.close();
    2、示例说明
                该示例基于 kafka-0.10.0.0版本,和网上大多数教程中的示例有很大的不同,开发时要注意参考官方文档
                key.serializer指定的序列化类,可以根据自身业务消息的格式自定义序列化类,来自由转化消息的格式
                producer.send()是异步的,当调用它将消息添加到挂起的消息缓冲区时,发送并立即返回。这使得生产者可以高效的批量处理单个消息
                producer.send(message, new Callback()) 当消息发送成功后的回调处理方法

二、消费者示例:
    1、代码示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
    // 指定kafka的服务地址(和旧版本有很大的区别)
props.put("group.id", "test");
                                 // 消费者组的唯一标识,如果消费者使用订阅(主题)或基于Kafka-based offset策略,此字段必填
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
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", record.offset(), record.key(), record.value());
}
}
    2、示例说明
                该示例基于 kafka-0.10.0.0版本,和网上大多数教程中的示例有很大的不同,开发时要注意参考官方文档
                key.deserializer指定的反序列化类,可以根据自身业务消息的格式自定义反序列化类,来自由转化消息的格式

三、zookeeper保存kafka服务信息。通过zookeeper可以方便地查看kafka服务的状态和各项信息

                

1.topic注册信息

/brokers/topics/[topic] :

存储某个topic的partitions所有分配信息

Schema:
{
    "version": "版本编号目前固定为数字1",
    "partitions": {
        "partitionId编号": [
            同步副本组brokerId列表
        ],
        "partitionId编号": [
            同步副本组brokerId列表
        ],
        .......
    }
}
Example:
{
"version": 1,
"partitions": {
"0": [1, 2],
"1": [2, 1],
"2": [1, 2],
}
}

说明:紫红色为patitions编号,蓝色为同步副本组brokerId列表

2.partition状态信息

/brokers/topics/[topic]/partitions/[0...N]  其中[0..N]表示partition索引号

/brokers/topics/[topic]/partitions/[partitionId]/state

Schema:
{
"controller_epoch": 表示kafka集群中的中央控制器选举次数,
"leader": 表示该partition选举leader的brokerId,
"version": 版本编号默认为1,
"leader_epoch": 该partition leader选举次数,
"isr": [同步副本组brokerId列表]
}
 
Example:
{
"controller_epoch": 1,
"leader": 2,
"version": 1,
"leader_epoch": 0,
"isr": [2, 1]

}

3. Broker注册信息

/brokers/ids/[0...N]                

每个broker的配置文件中都需要指定一个数字类型的id(全局不可重复),此节点为临时znode(EPHEMERAL)

Schema:
{
"jmx_port": jmx端口号,
"timestamp": kafka broker初始启动时的时间戳,
"host": 主机名或ip地址,
"version": 版本编号默认为1,
"port": kafka broker的服务端端口号,由server.properties中参数port确定

}
 
Example:
{
"jmx_port": 6061,
"timestamp":"1403061899859"
"version": 1,
"host": "192.168.1.148",
"port": 9092

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值