1.Kafka是什么

简单的说,Kafka是由Linkedin开发的一个分布式的消息队列系统(Message Queue)。kafka的架构师jay kreps非常喜欢franz kafka,觉得kafka这个名字很酷,因此将linkedin的消息传递系统命名为完全不相干的kafka,没有特别含义。

2.解决什么问题

kafka开发的主要初衷目标是构建一个用来处理海量日志,用户行为和网站运营统计等的数据处理框架。在结合了数据挖掘,行为分析,运营监控等需求的情况下,需要能够满足各种实时在线和批量离线处理应用场合对低延迟和批量吞吐性能的要求。从需求的根本上来说,高吞吐率是第一要求,其次是实时性和持久性。

既有的消息队列框架或者对消息传送的可靠性提供了较高的保证,由此带来较大的负担,不能满足海量高吞吐率的要求;或者完全面向实时消息处理系统,对于批量离线处理的场合无法提供足够的缓存和持久性要求。

而多数针对大数据开发应用的日志收集处理系统则通常更适合批量离线处理场合,对实时在线处理的场合支持不够。

总体而言,kafka试图提供一个同时满足在线和离线处理海量数据的消息派发系统。

3.怎么实现

kafka的集群由多个Broker服务器组成,每个类型的消息被定义为topic,同一topic内部的消息按照一定的key和算法被分区(partition)存储在不同的Broker上,消息生产者producer和消费者consumer可以在多个Broker上生产/消费topic

核心思想:以高效率作为第一设计原则,kafka的结构设计在很多方面都做了激进的取舍。

(1)极简的数据结构、应用模式

消息队列是以log文件的形式存储,消息生产者只能将消息添加到既有的文件尾部,没有任何ID信息用于消息的定位,完全依靠文件内的位移,因此消息的使用者只能依靠文件位移顺序读取消息,这样也就不需要维护复杂的支持随即读取的索引结构。

kafka broker完全不维护和协调多用户使用消息的行为模式,用户自己维护位移用来索引消息。

最小的并发访问单位就是partition分区,同一用户组内的所有用户(可以理解为同一个应用的所有并发进程)只能有一个访问同一分区,同时分区的个数是固定的,不支持动态调整。这样最大简化了多进程/分布式client之间对消息处理访问的并发控制的复杂度,当然也带来一定的使用模式上的限制(比如最大并发度完全取决于预先规划的partition的个数)

此外分区也带来一个问题就是消息只是分区内部有序而不是全局有序的。如果需要全局有序,应用需要自己靠别的机制来保证

使用Pull模式派发消息,消息的使用情况,比如是否还有consumer没有读取,是否重复读取(改进中)等,在Broker端也完全不跟踪维护,消息的过期处理简单的由定时器定时删除(比如保留7天),由此简化各种消息跟踪维护的开销。

(2)最大化数据传输效率

生产者和消费者可以批量读写消息减少RPC开销;使用Zero Copy方式在内核层直接将文件内容传送给网络Socket,避免应用层数据拷贝;使用合理的压缩格式等

(3)激进的内存管理模式

kafka不在JVM进程内部维护消息Cache,消息直接从文件中读写,完全依赖操作系统在文件系统层面的cache,避免在JVM中管理Cache带来的额外数据结构开销和GC带来的性能代价。基于批量处理和顺序读写的应用模式,最大化利用文件系统的Cache机制和规避文件读写相对内存读写的性能代价。

(3)HA

kafka在0.8之前message是没有备份容错机制的,producer的工作模式是fire and forget,如果一个broker失效,那么相关topic分区的相关消息也就丢失了。这种设计的原因在于最初的应用模式,如日志/用户行为等消息的处理,对数据的健壮性方面要求不高,可以容忍部分数据的缺失。采用fire and forget 模式,不需要等待Broker ack,有利于提高producer的吞吐率。

不过在0.8版本中,添加了数据replica的机制,一个消息分区和多个replica分布在不同的Broker上,由leader replica负责日常读写,通过zookeeper监督failover,不同的分区的leader replica均衡负载到不同的Broker上。在这种情况下,producer可以选择不等待leader replica的Ack,部分Ack,或者完全备份完毕后Ack等不同的ack机制。这三种机制,性能依次递减 (producer吞吐量降低1-3倍),数据健壮性则依次递增。

kafka消费的三种模式_快速认识Kafka相关推荐

  1. kafka消费的三种模式_kafka消费者的三种模式(最多/最少/恰好消费一次)

    几种不同的注册方式 subscribe方式:当主题分区数量变化或者consumer数量变化时,会进行rebalance: 注册rebalance监听器,可以手动管理offset 不注册监听器,kafk ...

  2. android分屏模式_安卓 7.0 分屏功能详解:三种模式,想分就分

    IT之家讯 8月18日消息,安卓7.0的一大特色就是自带全新分屏功能,分为多画面显示模式.画中画模式和自由分屏模式三种,本文将详细介绍这三种模式. 多画面显示模式 启动该模式的方法有两种,一是在后台应 ...

  3. php 上传图片加密,图片加密平台源码_图片在线加密+包含三种模式上传图片+支付后看原图-html资源网...

    采用 php+mysql 的环境,php 版本是 php5.6. 源码是通过调用八图片平台的 API,进行设计开发的.用此源码搭建的网站,用户资金直接进入你自己的支付接口. 8tupian 图片加密平 ...

  4. mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析

    前提,创建表t,并插入数据,语句如下: CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `t_modified` ...

  5. redis 高可用(持久化、主从复制、哨兵、集群)以及集群的三种模式

    Redis高可用定义 在web服务器中,高可用代表服务器可以正常访问的时间,一般使用百分比来衡量多长时间内可以提供正常服务 但是在redis中,高可用的定义还要更广泛一点,除了提供正常的服务(如主从分 ...

  6. 深入浅出系列之 -- kafka消费者的三种语义模型

    本文主要详解kafka client的使用,包括kafka消费者的三种消费语义at-most-once,at-least-once,和exact-once message,生产者的使用等. 创建主题 ...

  7. 微服务ServiceMesh及三种模式介绍

    1. 前言 今年,ServiceMesh(服务网格)概念在社区里头非常火,有人提出2018年是ServiceMesh年,还有人提出ServiceMesh是下一代的微服务架构基础.作为架构师,如果你现在 ...

  8. 【夏目鬼鬼分享】StringBoot整合RabbitMQ,使用Direct、Fanout、Topic三种模式

    RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的 ...

  9. (转)云计算的三种模式:IaaS、PaaS和SaaS 通俗理解

    突然想了解下有关云的一些知识,于是整理了一些资料供自己学习和理解. "云计算"已经越来越普遍,简单来说这就是一种共享资源的形式,不过是通过云来共享分布式的资源."云&qu ...

最新文章

  1. 张正友平面标定法的一些注意事项
  2. 方法apply作用于对象sort时失败_浅析call、apply 与 bind
  3. SSM整合Shiro 身份验证及密码加密简单实现
  4. git pull冲突解决
  5. 亚马逊推荐python_使用python查找amazon类别
  6. gdpr合规性测试_使用生产数据在GDPR后世界进行测试
  7. 使用@selector模仿代理功能降低代码耦合度
  8. 我读《非暴力沟通》- 马歇尔 *卢森堡 - 区分观察和评论
  9. 石灰窑计算机控制上料,石灰窑自动化控制系统
  10. MATLAB--读取广播星历的导航文件
  11. java对象 内存逃逸_JVM内存逃逸
  12. springcloud gateway + nacos 遇到503错误
  13. python中fabs函数_Python3 fabs() 函数
  14. linux红帽子安装驱动,安装红帽子使用有megaSR swraid驱动程序和OS推进指点的嵌入式SATA控制器常见设备使用情况的...
  15. [工具书]常用软件注册表位置
  16. 中国大学python程序设计答案_Python程序设计1-中国大学mooc-试题题目及答案
  17. 录屏软件哪个好?五款免费视频录屏软件
  18. F460最新光猫破解
  19. 【Pytorch-ACDC】复现U-Net for Cardiac Segmentation记录
  20. Java中的工厂模式(1)

热门文章

  1. U3D游戏运行时资源是如何从AB中加载出来的
  2. C#一元运算重载的深入理解
  3. 新西兰激光事故5年增加130% 官员警告危害航空安全
  4. python对文件夹内文件去重
  5. Navicat for MySQL设置备份路径
  6. 最近的特别问题(1)
  7. 如何对DevExpress ASPxGridView进行分组排序?
  8. shell date
  9. java 读取中文配置文件问题
  10. POJ 2155 Matrix 二维线段树