过期的数据才会被自动清除以释放磁盘空间。比如我们设置消息过期时间为2天,那么这2天内的所有消息都会被保存到集群中,数据只有超过了两天才会被清除。

Kafka只维护在Partition中的offset值,因为这个offsite标识着这个partition的message消费到哪条了。Consumer每消费一个消息,offset就会加1。其实消息的状态完全是由Consumer控制的,Consumer可以跟踪和重设这个offset值,这样的话Consumer就可以读取任意位置的消息。

Kafka提供了两套consumer api,分为high-level api和sample-api。Sample-api 是一个底层的API,它维持了一个和单一broker的连接,并且这个API是完全无状态的,每次请求都需要指定offset值,因此,这套API也是最灵活的。

在kafka中,当前读到哪条消息的offset值是由consumer来维护的,因此,consumer可以自己决定如何读取kafka中的数据。比如,consumer可以通过重设offset值来重新消费已消费过的数据。不管有没有被消费,kafka会保存数据一段时间,这个时间周期是可配置的,只有到了过期时间,kafka才会删除这些数据。

High-level API封装了对集群中一系列broker的访问,可以透明的消费一个topic。它自己维持了已消费消息的状态,即每次消费的都是下一个消息。

High-level API还支持以组的形式消费topic,如果consumers有同一个组名,那么kafka就相当于一个队列消息服务,而各个consumer均衡的消费相应partition中的数据。若consumers有不同的组名,那么此时kafka就相当与一个广播服务,会把topic中的所有消息广播到每个consumer。

High level api和Low level api是针对consumer而言的,和producer无关。

High level api是consumer读的partition的offsite是存在zookeeper上。High level api 会启动另外一个线程去每隔一段时间,offsite自动同步到zookeeper上。换句话说,如果使用了High level api, 每个message只能被读一次,一旦读了这条message之后,无论我consumer的处理是否ok。High level api的另外一个线程会自动的把offiste+1同步到zookeeper上。如果consumer读取数据出了问题,offset也会在zookeeper上同步。因此,如果consumer处理失败了,会继续执行下一条。这往往是不对的行为。因此,Best Practice是一旦consumer处理失败,直接让整个conusmer group抛Exception终止,但是最后读的这一条数据是丢失了,因为在zookeeper里面的offset已经+1了。等再次启动conusmer group的时候,已经从下一条开始读取处理了。

Low level api是consumer读的partition的offsite在consumer自己的程序中维护。不会同步到zookeeper上。但是为了kafka manager能够方便的监控,一般也会手动的同步到zookeeper上。这样的好处是一旦读取某个message的consumer失败了,这条message的offset我们自己维护,我们不会+1。下次再启动的时候,还会从这个offset开始读。这样可以做到exactly once对于数据的准确性有保证。

下一节我会重点说明一下topic分配partition和partition replica的算法以及消息投递的可靠性

最新文章

  1. 初识Message Queue之--基础篇
  2. easyui 入门
  3. Windows操作系统常用快捷键
  4. PC-信使服务之不用聊天软件也能通信
  5. Hibernate 主键生成策略
  6. ehci符合USB2.0,uhci,ohci,
  7. DOM事件一览表
  8. .net面试问答(大汇总)
  9. jQuery 选择器 (一)
  10. 有趣的toggleClass实现交替样式
  11. 在badboy中添加检查点并且参数化
  12. sed命令讲解
  13. 【DWM1000】 code 解密5一ACHOR 第一次回家Main 函数
  14. 记一次线上bug排查-quartz线程调度相关
  15. 关于dao层的封装和前端分页的结合(文章有点长,耐心点哦)
  16. Assigning to 'id<UINavigationControllerDelegate,UIImagePickerControllerDelegate> _Nullable' from incompatible type 'InfchangeVC *const __strong'
  17. Java之旅_高级教程_网络编程
  18. Python-flask跨站请求伪造和跨站请求保护的实现
  19. asymmetric cryptographic algorithm
  20. Kafka学习之broker配置(0.8.1版)(转)

热门文章

  1. Java进阶知识16 Spring创建IOC容器的两种方式
  2. LA 7263 Today Is a Rainy Day bfs+暴力 银牌题
  3. 洛谷 P2832 行路难
  4. Python 爬取喜马拉雅音频
  5. ETL测试场景和测试用例设计
  6. BOM:浏览器对象
  7. Linux 上的Tomcat配置输入域名直接访问项目
  8. 设置Fedora能够使用root用户登录
  9. 微信小程序入门---记事本增---删
  10. easyUI之Dialog(对话框窗口)