• Consumer是非线程安全的
  • Kafka只保证消息不漏,即at lease once,而不保证消息不重。关键点:假如consumer挂了重启,那它将从committed offset位置(告诉server的消费的位置点)开始重新消费,而不是consume offset位置(真正的消费位置点)。这也就意味着有可能重复消费(自己消费到了某个位置,而后在告诉服务器这个位置时,发送失败)
  • kafka可以重置commit吗?给服务器指定任意值为最后消费位置,下次消费从这个指定的位置开始消费。可以,使用commit函数,下文有讲。但是需要注意:修改偏移量不会改变当前会话,在新连接里生效
  • subscribe表示订阅topic,从kafka记录的offset开始消费。assign表示从指定的offset开始消费。subscribe只指定topic和group,具体消费那个分区,由group coordinator决定,会受rebalance影响;assign必须指定要消费的分区信息,格式是TopicPartitions,不会受rebalance影响。 这两种方法只能使用一个。
  • kafka自动会从上次没有消费的地方开始消费
  • 使用kafak自带的脚本查看偏移量:./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group test --offsets
  • 使用了subscribe,就不能使用assign
  • 提交:更新分区的当前位置称为提交,当前版本(0.10.1.1)用topic ___consumer_offsets 保存提交的偏移量

  • 偏移量:消费者在Kafka追踪到消息在分区里的位置
  • 消费者在崩溃或者有新的消费者加入群组,就会触发再均衡。这时需要读取最后一次偏移量,然后从偏移量指定的地方继续处理。提交的偏移量小于真实的偏移量,消息会被重复处理。大于真实的偏移量,消息会丢失。
from kafka.structs import TopicPartition,OffsetAndMetadata
configs = {
'bootstrap_servers': '10.57.19.60',
'enable_auto_commit': False,
'group_id': 'test',
'api_version': (, , ),
'ssl_check_hostname': False,
'consumer_timeout_ms': , # 若不指定 consumer_timeout_ms,默认一直循环等待接收,若指定,则超时返回,不再等待
# 'ssl_certfile': ssl_certfile,
# 'security_protocol': 'SSL',
# 'ssl_cafile': ssl_cafile
}
topics=('test', )
# 注意指定分区将会失去故障转移/负载均衡的支持,当然也没有了自动分配分区的功能(因为已经人为指定了嘛)
topic_partition = TopicPartition(topic='test',partition=)
#
consumer = KafkaConsumer(**configs)
# 参数必须是列表,表示订阅的topic/partition列表
consumer.assign([topic_partition])
# 获取分给当前用户的topic/partition信息
consumer.assignment()
# 提交偏移量:可以告知服务器当前偏移量,也可以设置偏移量
consumer.commit({TopicPartition(topic='test', partition=): OffsetAndMetadata(offset=, metadata='')})
# 异步提交
consumer.commit_async()
# 获取服务器的最后确认的偏移量,即最新数据开始读取的地方
consumer.committed(TopicPartition(topic='test', partition=))
# 获取服务器当前最新的偏移量,读到这个偏移量后,所有数据都读取完了
consumer.highwater(TopicPartition(topic='test', partition=))
# 获取消费的性能
consumer.metrics()
# 获取某个topic的partition信息
consumer.partitions_for_topic(topic)
# 获取下一条数据开始读取的偏移量,即从这个便宜量开始继续读取数据
consumer.position(TopicPartition(topic='test', partition=))
# 从指定偏移量位置开始读取数据
consumer.seek(TopicPartition(topic='test', partition=), )
# 从头开始读取数据
consumer.seek_to_beginning()
# 从最后开始读取数据
consumer.seek_to_end()
# 订阅topic,可以订阅多个,可以使用正则表达式匹配多个
consumer.subscribe()
# 获取订阅的信息,无法获取使用assign分配的topic/partition信息
consumer.subscription()
# 获取当前用户授权的topic信息
consumer.topics()
# 取消消息的订阅
consumer.unsubscribe()
# 一起消费多条消息,最多等待时间timeout_ms,最多消费max_records
consumer.poll(self, timeout_ms=0, max_records=None) # 获取指定分区第一个偏移量
consumer.beginning_offsets([topic_partition])
# 获取指定分区最后一个偏移量,最新的偏移量
consumer.end_offsets([topic_partition])
# 关闭连接
consumer.close()
#
#consumer.seek(topic_partition,)
for message in consumer:
print(message)

重复消费是如何产生的?

消费者设置为自动提交偏移量时,需要同时设置自动提交偏移量的时间间隔。如果消费完若干消息后,还没有到自动提交偏移量的时间时,应用挂了,则系统记录的偏移量还是之前的值,那么刚才消费的若干消息,会在应用重连之后重新消费

如何保证不会重复消费?

消费段记录下发送给服务器的偏移量,获取最新数据时再判断这个偏移量是否正确

生产的消息队列长度,会堆积吗?

会

消费的信息队列长度,会堆积吗?

会

生产者速度大于消费者速度怎么处理?

kafka 认证与授权机制

Kafka 目前支持SSL、SASL/Kerberos、SASL/PLAIN三种认证机制。目前支持以下安全措施:

  • clients 与 brokers 认证
  • brokers 与 zookeeper认证
  • 数据传输加密  between  brokers and clients, between brokers, or between brokers and tools using SSL
  • 授权clients read/write

kafka偏移量的相关配置

enable.auto.commit

true(默认):自动提交偏移量,可以通过配置 auto.commit.interval.ms属性来控制提交偏移量的频率。(基于时间间隔)

false:手动控制偏移量。可以在程序逻辑必要的时候提交偏移量,而不是基于时间隔。此时可以进行同步,异步,同步异步组合(参考相应api)。

auto.offset.reset

无法读取偏移量时候读取消息的设置

latest(默认):从最新记录读取数据。

earliest:从起始位置读取数据

参考:

1、https://zhuanlan.zhihu.com/p/33238750

2、https://help.aliyun.com/document_detail/68331.html

3、https://blog.csdn.net/xiaoguozi0218/article/details/80513849

4、https://zhuanlan.zhihu.com/p/38330574

5、https://blog.csdn.net/ZhongGuoZhiChuang/article/details/79550570

6、https://help.aliyun.com/document_detail/67233.html

kafak-python函数使用详解的更多相关文章

  1. Python函数参数详解

    Python函数参数详解 形参与实参 什么是形参 在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名. 什么是实参 在调用函数阶段传入的值称为实际参数,简称实参.相当于"变量值& ...

  2. Python学习教程(learning Python)--2.3.2 Python函数实参详解

    本节主要讨论函数调用时参数的实参问题. 1. 实参赋值顺序和型参定义顺序一一对应 Python在调用哪个子函数时,如果型参为多个,一般实参的排布顺序和型参顺序保持一致,即一一对应.我们以下面的代码为例 ...

  3. Python学习入门教程,字符串函数扩充详解

    因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习 ...

  4. 【Python】Python内置函数dir详解

    1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...

  5. 关于Python正则表达式findall函数问题详解

    关于Python正则表达式 findall函数问题详解 在写正则表达式的时候总会遇到不少的问题, 特别是在表达式有多个元组的时候.下面看下re模块下的findall()函数和多个表达式元组相遇的时候会 ...

  6. Python 字符串方法详解

    Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息.        ...

  7. python time模块详解

    python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明  一.简介 ...

  8. Python中dict详解

    from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...

  9. 【python进阶】详解元类及其应用2

    前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...

  10. Python开发技术详解PDF

    Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...

随机推荐

  1. 【51nod】1851 俄罗斯方块

    题解 最近一遇到神仙题一卡就好久--做点水题滋养一下自己吧= = 显然我们发现放一个方块的奇偶性不会改变,所以格子如果黑格子是奇数,那么就是No 我们发现每个2 × 3的方格里的2 × 1的黑格子都可 ...

  2. MVC、MVP和MVVM的异同

    No1: Model一般用来保持程序的数据状态,比如数据存储.网络请求等 No2: Android开发中应用到MVC的地方:比如ListView与Adapter,如果把ListView看作View层, ...

  3. mysql正则表达式,实现多个字段匹配多个like模糊查询

    现在有这么一个需求 一个questions表,字段有题目(TestSubject),选项(AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) 要求字段不包含png,jpg ...

  4. 在qemu上运行BusyBox

    BusyBox 前文“在qemu环境中用gdb调试Linux内核”和“Initramfs 原理和实践”分别描述了怎么用qemu来运行一个编译好的内核,以及怎么指定initramfs,但都是简单的演示. ...

  5. [java] java中的初始化顺序

    先看程序: package init_cls; class A{ {System.out.println("i am in the class A!");} static { Sy ...

  6. web服务端安全之SQL注入攻击

    一.SQL注入攻击的原理攻击者在HTTP请求中,注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 ' ...

  7. ceph journal操作

    查询ceph journal的地方 ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | grep osd_journal & ...

  8. CF912D Fishes 期望 + 贪心

    有趣的水题 由期望的线性性质,全局期望 = 每个格子的期望之和 由于权值一样,我们优先选概率大的点就好了 用一些数据结构来维护就好了 复杂度$O(k \log n)$ #include <set ...

  9. LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)

    题目链接 LOJ 洛谷P4630 先对这张图建圆方树. 对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和. 因为两 ...

  10. [CodeForces-585F]Digits of Number Pi

    题目大意: 给你一个数字串s,一个序列范围l和r,(l和r的数字位数为d)求l到r中有多少个数,满足它的长度为d/2的子串,能够在s中被匹配. 思路: 首先将s中每一个长度为d/2的子串插入后缀自动机 ...