使用librdkafka过程中,遇到的一些问题,解决办法!
后续上线稳定使用后,会做一点总结出来!
................................................................
librdkafka问题总结

librdkafka是kafka官方推荐的c client端开源库。本文基于librdkafka_0.8, 对该库作简要介绍,同时对使用过程中遇到的一些问题做个总结

一、模块介绍

librdkafka主要分为config,topic,produce,consume几个模块

config

依据kafka相应的config文件字段定义 
先通过默认配置文件创建confg对象,再通过confg的set方法设置需要覆盖的字段 
参考: http://blog.csdn.net/beitiandijun/article/details/40582541

topic

支持一个producer创建多个topic(比如bid,wn等类型的日志) 
创建主题方法rd_kafka_topic_new逻辑: 
检查是否有同名可用topic ==> 检查tconf为空则以默认配置创建 ==> 
检查partitioner未配置则配置为随机方法(从0,pcnt-1中选取partition) ==> 创建分区号为默认值RD_KAFKA_PARTITION_UA 的分区,并将topic插入队尾

partitioner类回调方法需自己实现

produce

kafka对象创建方法

rd_kafka_t *rd_kafka_new (rd_kafka_type_t type, rd_kafka_conf_t *conf,
char *errstr, size_t errstr_size)
  • 1
  • 2
  • 1
  • 2

检查config对象,创建事件循环主线程rd_kafka_thread_main,通过rd_kafka_brokers_add创建io事件循环子线程rd_kafka_broker_thread_main,将消息追加到队列, 并在io方法rd_kafka_broker_io_serve中分发处理socket connect,send,recv事件

消息生产方法

int rd_kafka_produce (rd_kafka_topic_t *rkt, int32_t partition,
int msgflags,
void *payload, size_t len,
const void *key, size_t keylen,
void *msg_opaque)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

参数key用于partitioner hash生成partition 值 
参数partition默认为RD_KAFKA_PARTITION_UA,即未分配状态,在创建消息方法rd_kafka_msg_new检查发现partition为默认值,则调用partitioner回调函数生成partition值

consume

创建config,topic及kafka对象流程相同

二、 问题探讨

1.验证kafka超出数据保存设置时间后数据的有效性

通过以下设置,可开启kafka数据超时删除功能:

kafka server配置文件server.properties中设置

开启超时删除(false值为删除)

log.cleaner.enable

设置删除检测间隔

log.retention.check.interval.ms

设置超时时间

log.retention.hours 或 
log.retention.minutes

producer中设置topic config属性

cleanup.policy=delete和 
retention.ms

验证结果:超时数据被删除后不可再访问

2.kafka数据超时删除后,对新生产的数据访问方式

consumer offset输入参数设置为-2,即Topic::OFFSET_BEGINNING,读取有效数据起始位置

3.kafka删除超时数据并生产新数据后,消费者消费完新数据重启后获取新offset方式

consume recv时返回的offset,即为已消费的最后一个数据,resume重启后获取新的起始offset为: 
offset_new=offset+1

4.一个connection是否可以配置多个topic?

支持,一个kafka实例可以创建多个topic

5.一个topic是否可以配置多个partition?

kafka支持一个topic配置多个partition,但是限于需要保证数据的顺序性,只能配置1个partition

6.发送数据时是否需要指定topic和partition以及如何指定?

首先,必须指定topic;其次,对于partition,有两种方式: 
a. 明确指定,则数据被发送到指定partition 
b. 设置为RD_KAFKA_PARTITION_UA,则kafka会回调partitioner进行均衡选取,partitioner方法需要自己实现。可以轮询或者传入key进行hash。未实现则采用默认的随机方法rd_kafka_msg_partitioner_random随机选择。

7.接收数据时是否需要指定topic和partition以及如何指定?

都必须指定,且partition必须为topic对应的partitions之一。若未指定partition(RD_KAFKA_PARTITION_UA),消费调用将失败。超出partitions范围,则该partition将被设置为desired

8.Kafka是否可以保证消息顺序?

kafka仅支持单个partition上的顺序性,要保证整个topic在被消费时的顺序性,一个topic只能有一个partition,这也意味着每个group只有一个consumer。因为一个partition只能被同一group中 
的一个consumer消费。

Kafka only provides a total order over messages within a partition, not between different partitions in a topic. Per-partition ordering combined with the ability to partition data by key is sufficient for most applications. However, if you require a total order over messages this can be achieved with a topic that has only one partition, though this will mean only one consumer process per consumer group.

https://kafka.apache.org/documentation.html

9.Kafka的多个partition之间负载均衡由谁实现?

由producer负责实现。参照第6条

在librdkafka基础上,我封装了一个c++版本客户端,包含producer及consumer, demo及源码在github上KafkaClient

 
 

转载:librdkafka问题总结的更多相关文章

  1. 转载:kafka c接口librdkafka介绍之二:生产者接口

    转载:from:http://www.verydemo.com/demo_c92_i210679.html 这个程序虽然我调试过,也分析过,但是没有记录笔记,发现下边这篇文章分析直接透彻,拿来借用,聊 ...

  2. Crystal Clear Applied: The Seven Properties of Running an Agile Project (转载)

    作者Alistair Cockburn, Crystal Clear的7个成功要素,写得挺好. 敏捷方法的关注点,大家可以参考,太激动所以转载了. 原文:http://www.informit.com ...

  3. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

  4. 《Walking the callstack(转载)》

    本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...

  5. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  6. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  7. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作

    从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...

  8. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

  9. 在CentOS 7/6.5/6.4 中安装Java JDK 8(转载)

    转载在CentOS 7/6.5/6.4 中安装Java JDK 8 首先,在你的服务器上运行一下更新. yum update 然后,在您的系统上搜索,任何版本的已安装的JDK组件. rpm -qa | ...

随机推荐

  1. 转:无监督特征学习——Unsupervised feature learning and deep learning

    http://blog.csdn.net/abcjennifer/article/details/7804962 无监督学习近年来很热,先后应用于computer vision, audio clas ...

  2. Double-Array Trie分词词典简述

    http://www.xuebuyuan.com/1991441.html 一.TRIE树简介(以下简称T树) TRIE树用于确定词条的快速检索,对于给定的一个字符串a1,a2,a3,…an,则采用T ...

  3. Java 解决 servlet 接收参数中文乱码问题

    方法一: 接收到的参数进行如下操作[不建议]: String tmp = new String(type.getBytes("iso-8859-1"), "utf-8&q ...

  4. 如何用Client OM获取页面上一个Content web part的内容

    [解决方法] According to Wictor Wilén, The Client Object Model is fairly limited when it comes to working ...

  5. Hibernate: No Session found for current thread

    在Struts2+Hibernate+Srping项目中经常会遇到这种问题 我知道的一种情况是: Spring的事务配置中没有配置好异常出现处的路径 <aop:advisor pointcut= ...

  6. Redis 实现队列http://igeekbar.com/igeekbar/post/436.htm

    场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台在去处理这些请求 ·抢购场景,先入 ...

  7. Android 原生 Android ActionBar

    本文内容 关于 ActionBar 必要条件 项目结构 环境 演示一:Action Bar 显示隐藏 演示二:Action Item 显示菜单选项 演示三:Action Home 启用"返回 ...

  8. javascript简写精练

    一.算术运算符 var n = 5,v; 1.n = n*5; 2.n*=5; 同 n = n*5 二.条件判断 var b = true; 1.if (!false) { alert('true') ...

  9. 第八周(3) Word2007样式

    第八周(3) Word2007样式 教学时间 2013-4-19 教学课时 2 教案序号 23 教学目标 1.掌握样式的概念2.能够熟练地创建样式.修改样式的格式,使用样式3.熟练利用样式格式化文档 ...

  10. Server Performance Advisor (SPA) 3.0

    http://blogs.technet.com/b/windows-server-china-blog/archive/2013/03/26/server-performance-advisor-s ...