Kafka Producer

消息发送

producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发。为了帮助producer做到这点,所有的Kafka节点都可以及时的告知:哪些节点是活动的,目标topic目标分区的leader在哪。这样producer就可以直接将消息发送到目的地了。

客户端控制消息将被分发到哪个分区。可以通过负载均衡随机的选择,或者使用分区函数。Kafka允许用户实现分区函数,指定分区的key,将消息hash到不同的分区上(当然有需要的话,也可以覆盖这个分区函数自己实现逻辑).比如如果你指定的key是user id,那么同一个用户发送的消息都被发送到同一个分区上。经过分区之后,consumer就可以有目的的消费某个分区的消息。

异步发送

批量发送可以很有效的提高发送效率。Kafka producer的异步发送模式允许进行批量发送,先将消息缓存在内存中,然后一次请求批量发送出去。这个策略可以配置的,比如可以指定缓存的消息达到某个量的时候就发出去,或者缓存了固定的时间后就发送出去(比如100条消息就发送,或者每5秒发送一次)。这种策略将大大减少服务端的I/O次数。

既然缓存是在producer端进行的,那么当producer崩溃时,这些消息就会丢失。Kafka0.8.1的异步发送模式还不支持回调,就不能在发送出错时进行处理。Kafka 0.9可能会增加这样的回调函数。见Proposed Producer API.

Kafka Consumer

Kafa consumer消费消息时,向broker发出"fetch"请求去消费特定分区的消息。consumer指定消息在日志中的偏移量(offset),就可以消费从这个位置开始的消息。customer拥有了offset的控制权,可以向后回滚去重新消费之前的消息,这是很有意义的。

推还是拉?

Kafka最初考虑的问题是,customer应该从brokes拉取消息还是brokers将消息推送到consumer,也就是pull还push。在这方面,Kafka遵循了一种大部分消息系统共同的传统的设计:producer将消息推送到broker,consumer从broker拉取消息。
一些消息系统比如Scribe和Apache Flume采用了push模式,将消息推送到下游的consumer。这样做有好处也有坏处:由broker决定消息推送的速率,对于不同消费速率的consumer就不太好处理了。消息系统都致力于让consumer以最大的速率最快速的消费消息,但不幸的是,push模式下,当broker推送的速率远大于consumer消费的速率时,consumer恐怕就要崩溃了。最终Kafka还是选取了传统的pull模式。
Pull模式的另外一个好处是consumer可以自主决定是否批量的从broker拉取数据。Push模式必须在不知道下游consumer消费能力和消费策略的情况下决定是立即推送每条消息还是缓存之后批量推送。如果为了避免consumer崩溃而采用较低的推送速率,将可能导致一次只推送较少的消息而造成浪费。Pull模式下,consumer就可以根据自己的消费能力去决定这些策略。
Pull有个缺点是,如果broker没有可供消费的消息,将导致consumer不断在循环中轮询,直到新消息到t达。为了避免这点,Kafka有个参数可以让consumer阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发送)。

消费状态跟踪

对消费消息状态的记录也是很重要的。
大部分消息系统在broker端的维护消息被消费的记录:一个消息被分发到consumer后broker就马上进行标记或者等待customer的通知后进行标记。这样也可以在消息在消费后立马就删除以减少空间占用。
但是这样会不会有什么问题呢?如果一条消息发送出去之后就立即被标记为消费过的,一旦consumer处理消息时失败了(比如程序崩溃)消息就丢失了。为了解决这个问题,很多消息系统提供了另外一个个功能:当消息被发送出去之后仅仅被标记为已发送状态,当接到consumer已经消费成功的通知后才标记为已被消费的状态。这虽然解决了消息丢失的问题,但产生了新问题,首先如果consumer处理消息成功了但是向broker发送响应时失败了,这条消息将被消费两次。第二个问题时,broker必须维护每条消息的状态,并且每次都要先锁住消息然后更改状态然后释放锁。这样麻烦又来了,且不说要维护大量的状态数据,比如如果消息发送出去但没有收到消费成功的通知,这条消息将一直处于被锁定的状态,
Kafka采用了不同的策略。Topic被分成了若干分区,每个分区在同一时间只被一个consumer消费。这意味着每个分区被消费的消息在日志中的位置仅仅是一个简单的整数:offset。这样就很容易标记每个分区消费状态就很容易了,仅仅需要一个整数而已。这样消费状态的跟踪就很简单了。
这带来了另外一个好处:consumer可以把offset调成一个较老的值,去重新消费老的消息。这对传统的消息系统来说看起来有些不可思议,但确实是非常有用的,谁规定了一条消息只能被消费一次呢?consumer发现解析数据的程序有bug,在修改bug后再来解析一次消息,看起来是很合理的额呀!

离线处理消息

高级的数据持久化允许consumer每个隔一段时间批量的将数据加载到线下系统中比如Hadoop或者数据仓库。这种情况下,Hadoop可以将加载任务分拆,拆成每个broker或每个topic或每个分区一个加载任务。Hadoop具有任务管理功能,当一个任务失败了就可以重启而不用担心数据被重新加载,只要从上次加载的位置继续加载消息就可以了。

漫游Kafka设计篇之Producer和Consumer(4)相关推荐

  1. 漫游Kafka设计篇之Producer和Consumer

    原文地址:http://blog.csdn.net/honglei915/article/details/37564871 Kafka视频教程同步首发,欢迎观看! Kafka Producer 消息发 ...

  2. 漫游Kafka设计篇之性能优化(7)

    Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...

  3. 漫游Kafka设计篇之性能优化

    原文地址:http://blog.csdn.net/honglei915/article/details/37564757 Kafka视频教程同步首发,欢迎观看! Kafka在提高效率方面做了很大努力 ...

  4. 漫游Kafka设计篇之主从同步

    原文地址:http://blog.csdn.net/honglei915/article/details/37565289 Kafka视频教程同步首发,欢迎观看! Kafka允许topic的分区拥有若 ...

  5. 漫游Kafka设计篇之消息传输的事务定义

    原文地址:http://blog.csdn.net/honglei915/article/details/37565119 之前讨论了consumer和producer是怎么工作的,现在来讨论一下数据 ...

  6. 漫游Kafka设计篇之数据持久化

    转载注明出处:http://blog.csdn.net/honglei915/article/details/37564595 Kafka视频教程同步首发,欢迎观看! 不要畏惧文件系统! Kafka大 ...

  7. 如何创建Kafka客户端:Avro Producer和Consumer Client

    1.目标 - Kafka客户端 在本文的Kafka客户端中,我们将学习如何使用Kafka API 创建Apache Kafka客户端.有几种方法可以创建Kafka客户端,例如最多一次,至少一次,以及一 ...

  8. Kafka学习整理七(producer和consumer编程实践)

    实践代码采用kafka-clients V0.10.0.0 编写 一.编写producer 第一步:使用./kafka-topics.sh 命令创建topic及partitions 分区数 ./kaf ...

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

    原文地址:http://blog.csdn.net/honglei915/article/details/37564329 Kafka视频教程同步首发,欢迎观看! 接下来一步一步搭建Kafka运行环境 ...

最新文章

  1. 贝叶斯岭回归(BayesianRidge)、自动关联决策回归、高斯过程、核函数、及高斯回归、高斯过程分类
  2. Java JSON、XML文件/字符串与Bean对象互转解析
  3. 【学习笔记】ODATA
  4. Saving HDU
  5. Spring5参考指南:AspectJ高级编程之Configurable
  6. CSS布局技巧之——各种居中
  7. java按条件查询结果为空_mybatis中查询结果为空时不同返回类型对应返回值问题...
  8. 采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。
  9. mysql用大白话解释_大白话 golang 教程-22-关系型数据库访问
  10. 【Java】 Java中接口是什么,以及接口的使用和理解
  11. 场地预约管理微信小程序开发过程中的错误记录
  12. PloneBook中文版
  13. word怎么删除空白页,Word Mac删除空白页面的图文方法
  14. 了解什么是用户留存率
  15. Apache ECharts的缘起和发展
  16. Python_Task01:变量、运算符、数据类型及位运算
  17. Redis知识点整理
  18. 可见光通信产业化现状分析(国内篇)
  19. UISearchBar背景色及边框修改
  20. java stringbuilder 替换字符串_StringBuilder修改字符串内容,增,删,改,插

热门文章

  1. java 8 localdatetime_java8 时间 LocalDateTime常用方法
  2. php mysql 一级分类_无限级分类 for PHP+Mysql
  3. 如何在html网页中嵌入一段语法高亮的代码?_工程师私藏的代码比较工具,好用!...
  4. JAVA中實現鏈表 LinkedList的使用
  5. Web应用运行在pywebview在窗口
  6. Java案例:几种方式拷贝文件的耗时比较
  7. Java讲课笔记09:类与对象
  8. C案例:打印斐波拉契数列
  9. 只调用一次_邹军:数控宏程序编程入门之程序的调用,老师傅用了都说好
  10. pythonweb搭建教程_基于Centos搭建Python Web 环境搭建教程