文档章节

彻头彻尾的了解Kafka存在的背景与意义

牧师-Panda
 牧师-Panda
发布于 2017/08/27 15:48
字数 1449
阅读 29
收藏 1
点赞 0
评论 0

Kafka是什么

简单的说,Kafka是由Linkedin开发的一个分布式的消息队列系统(Message Queue)

如果你对什么是消息队列系统,以及消息队列系统的功能一无所知,可以认真研读一下这篇博文

于是下面我们谈论的话题,是建立在你了解消息队列以及一些大型网站的知识的基础之上的。

Kafka想干什么

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

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

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

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

Kafka如何实现

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

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

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

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

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

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

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

采取各种方式最大化数据传输效率

比如生产者和消费者可以批量读写消息减少RPC开销

使用Zero Copy方式在内核层直接将文件内容传送给网络Socket,避免应用层数据拷贝

使用合理的压缩格式等

激进的内存管理模式

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

高可用性

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倍),数据健壮性则依次递增。

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
牧师-Panda
粉丝 26
博文 146
码字总数 180044
作品 0
浦东
Storm-kafka【接口实现】4-1:ZKCoordinator: ZK协调器

阅读背景:您需要对Zk,Kafka有基础的了解 本章主题:详尽的梳理ZkCoordinator的过程 package com.mixbox.storm.kafka; import org.slf4j.Logger;import org.slf4j.LoggerFactory; import com......

止静 ⋅ 2014/07/23 ⋅ 0

spring-kafka中argumentResolvers.add(new MessageMethodArgumentResolver())缺失MessageConverter参数

今天给项目升级Kafka版本,从1.0.0升级到1.0.5,修改了相关的配置后,启动项目,抛出异常如下: 下载源码后, 进入内部类,发现 方法中的, 缺失了参数,作为成熟的消息中间件,不应该存在这...

Neon_Wang ⋅ 2017/07/05 ⋅ 1

Kafka 源码分析1 : 基础搭建和项目结构介绍

原文出处:刘正阳 背景 从kafka也算有两年了,用它做了不少项目,但是之前对它的认识也仅仅停留在一些从其他地方听到的概念和官方文档的documentation上在遇到一些问题时往往不知道其原理只能...

刘正阳 ⋅ 05/16 ⋅ 0

Kafka设计理念浅析

本文将从以下两个方面去尝试讲解Kafka的设计理念,主要参考文献在这里: Kafka设计背景及原因 Kafka的设计特色 Kafka设计背景及原因 Kafka最初被LinkedIn设计来处理活动流数据(activity str...

cloud-coder ⋅ 2014/08/08 ⋅ 1

从术语到Spark,10篇必读大数据学习资源

     大数据文摘作品   编译:王一丁、王梦泽、夏雅薇   本文给想进入大数据领域的朋友提供了一系列的资源,由浅入深,比如“需要了解的51条大数据术语”、“学习python的四个理由”...

大数据文摘 ⋅ 04/29 ⋅ 0

如何使用Kafka Connect实现同步RDS binlog数据

1. 背景 在我们的业务开发中,往往会碰到下面这个场景: 业务更新数据写到数据库中 业务更新数据需要实时传递给下游依赖处理 所以传统的处理架构可能会这样: 但这个架构也存在着不少弊端:我...

鱼跟猫 ⋅ 05/11 ⋅ 0

Kafka设计解析(八)- Kafka事务机制与Exactly Once语义实现原理

写在前面的话 本文所有Kafka原理性的描述除特殊说明外均基于Kafka 1.0.0版本。 为什么要提供事务机制 Kafka事务机制的实现主要是为了支持 即正好一次语义 操作的原子性 有状态操作的可恢复性...

xiaomin0322 ⋅ 05/22 ⋅ 0

Kafka Connect如何实现同步RDS binlog数据?

  【IT168 技术】本文介绍如何在E-MapReduce上使用Kafka Connect实现同步RDS binlog数据   1. 背景   在我们的业务开发中,往往会碰到下面这个场景:   业务更新数据写到数据库中  ...

云栖社区 ⋅ 05/14 ⋅ 0

数据处理的 9 大编程语言

本文由伯乐在线 -古月水语 翻译,LynnShaw 校稿。未经许可,禁止转载! 英文出处:Anna Nicolaou。欢迎加入翻译组。 有关大数据的话题一直很火热。伴随着信息的爆炸式增长,大数据渗透到了各...

伯乐在线 ⋅ 2016/05/11 ⋅ 0

基于 Kafka 实时信息列队系统,LinkedIn 三人小组离职创立Confluent

LinkedIn 有个三人小组出来创业了—正是当时开发出 Apache Kafka 实时信息列队技术的团队成员,基于这项技术 Jay Kreps 带头创立了新公司Confluent,致力于为各行各业的公司提供实时数处理服...

oschina ⋅ 2014/11/09 ⋅ 19

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 30分钟前 ⋅ 0

从零手写 IOC容器

概述 IOC (Inversion of Control) 控制反转。熟悉Spring的应该都知道。那么具体是怎么实现的呢?下面我们通过一个例子说明。 1. Component注解定义 package cn.com.qunar.annotation;impo...

轨迹_ ⋅ 30分钟前 ⋅ 0

系统健康检查利器-Spring Boot-Actuator

前言 实例由于出现故障、部署或自动缩放的情况,会进行持续启动、重新启动或停止操作。它可能导致它们暂时或永久不可用。为避免问题,您的负载均衡器应该从路由中跳过不健康的实例,因为它们...

harries ⋅ 32分钟前 ⋅ 0

手把手教你搭建vue-cli脚手架-详细步骤图文解析[vue入门]

写在前面: 使用 vue-cli 可以快速创建 vue 项目,vue-cli很好用,但是在最初搭建环境安装vue-cli及相关内容的时候,对一些人来说是很头疼的一件事情,本人在搭建vue-cli的项目环境的时候也是...

韦姣敏 ⋅ 42分钟前 ⋅ 0

12c rman中输入sql命令

12c之前版本,要在rman中执行sql语句,必须使用sql "alter system switch logfile"; 而在12c版本中,可以支持大量的sql语句了: 比如: C:\Users\zhengquan>rman target / 恢复管理器: Release 1...

tututu_jiang ⋅ 56分钟前 ⋅ 0

Nginx的https配置记录以及http强制跳转到https的方法梳理

Nginx的https配置记录以及http强制跳转到https的方法梳理 一、Nginx安装(略) 安装的时候需要注意加上 --with-httpsslmodule,因为httpsslmodule不属于Nginx的基本模块。 Nginx安装方法: ...

Yomut ⋅ 今天 ⋅ 0

SpringCloud Feign 传递复杂参数对象需要注意的地方

1.传递复杂参数对象需要用Post,另外需要注意,Feign不支持使用GetMapping 和PostMapping @RequestMapping(value="user/save",method=RequestMethod.POST) 2.在传递的过程中,复杂对象使用...

@林文龙 ⋅ 今天 ⋅ 0

如何显示 word 左侧目录大纲

打开word说明文档,如下图,我们发现左侧根本就没有目录,给我们带来很大的阅读障碍 2 在word文档的头部菜单栏中,切换到”视图“选项卡 3 然后勾选“导航窗格”选项 4 我们会惊奇的发现左侧...

二营长意大利炮 ⋅ 今天 ⋅ 0

智能合约编程语言Solidity之线上开发工具

工具地址:https://ethereum.github.io/browser-solidity/ 实例实验: 1.创建hello.sol文件 2.调试输出结果

硅谷课堂 ⋅ 今天 ⋅ 0

ffmpeg 视频格式转换

转 Mp4 格式 #> ffmpeg -i input.avi -c:v libx264 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 -s 1......

Contac ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部