kafka核心概念与应用场景
Kafka的主要特点
Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。
kafka的主要特点:
- 同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。
- 可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication止数据丢失。
- 分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。
- 消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。
- 支持online和offline的场景。
Kafka的架构
Kafka的整体架构非常简单,是显式分布式架构,producer、broker(kafka)和consumer都可以有多个。Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。客户端和服务器端的通信,是基于简单,高性能,且与编程语言无关的TCP协议。
基本概念:
Topic
:特指Kafka处理的消息源(feeds of messages)的不同分类。Partition
:Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。Message
:消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。Producers
:消息和数据生产者,向Kafka的一个topic发布消息的过程叫做producers。Consumers
:消息和数据消费者,订阅topics并处理其发布的消息的过程叫做consumers。Broker
:缓存代理,Kafka集群中的一台或多台服务器统称为broker。
发送消息的流程:
- Producer根据指定的partition方法(round-robin、hash等),将消息发布到指定topic的partition里面
- kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费。
- Consumer从kafka集群pull数据,并控制获取消息的offset
kafka的优秀设计
接下来我们从kafka的吞吐量、负载均衡、消息拉取、扩展性来说一说kafka的优秀设计:
高吞吐是kafka需要实现的核心目标之一,为此kafka做了以下一些设计:
内存访问:直接使用 linux 文件系统的cache,来高效缓存数据,对数据进行读取和写入。
数据磁盘持久化:消息不在内存中cache,直接写入到磁盘,充分利用磁盘的顺序读写性能。
zero-copy:减少IO操作步骤
- 采用linux Zero-Copy提高发送性能。传统的数据发送需要发送4次上下文切换,采用sendfile系统调用之后,数据直接在内核态交换,系统上下文切换减少为2次。根据测试结果,可以提高60%的数据发送性能。Zero-Copy详细的技术细节可以参考:https://www.ibm.com/developerworks/linux/library/j-zerocopy/
对消息的处理:
支持数据批量发送
支持数据压缩机制
主题分区:
- Topic划分为多个partition,提高生产/消费端处理消息的parallelism(并行度),数据在磁盘上存取代价为O(1)。kafka以topic来进行消息管理,每个topic包含多个part(ition),每个part对应一个逻辑log,有多个segment组成。每个segment中存储多条消息,消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。每个part在内存中对应一个index,记录每个segment中的第一条消息偏移。发布者发到某个topic的消息会被均匀的分布到多个part上(随机或根据用户指定的回调函数进行分布),broker收到发布消息往对应part的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到一定的大小后将不会再往该segment写数据,broker会创建新的segment。
负载均衡:
producer根据用户指定的算法,将消息发送到指定的partition
存在多个partiiton,每个partition有自己的replica,每个replica分布在不同的Broker节点上
多个partition需要选取出lead partition,lead partition负责读写,并由zookeeper负责fail over
通过zookeeper管理broker与consumer的动态加入与离开
消息的拉取:
简化kafka设计(由于kafka broker会持久化数据,broker没有内存压力,因此,consumer非常适合采取pull的方式消费数据)
consumer根据消费能力自主控制消息拉取速度
consumer根据自身情况自主选择消费模式,例如批量,重复消费,从尾端开始消费等
可扩展性
- 当需要增加broker结点时,新增的broker会向zookeeper注册,而producer及consumer会根据注册在zookeeper上的watcher感知这些变化,并及时作出调整。
Kafka的应用场景
- 消息队列
- 比起大多数的消息系统来说,Kafka有更好的吞吐量,内置的分区,冗余及容错性,这让Kafka成为了一个很好的大规模消息处理应用的解决方案。消息系统一般吞吐量相对较低,但是需要更小的端到端延时,并常常依赖于Kafka提供的强大的持久性保障。在这个领域,Kafka足以媲美传统消息系统,如ActiveMQ或RabbitMQ。
- 行为跟踪
- Kafka的另一个应用场景是跟踪用户浏览页面、搜索及其他行为,以发布-订阅的模式实时记录到对应的topic里。那么这些结果被订阅者拿到后,就可以做进一步的实时处理,或实时监控,或放到hadoop/离线数据仓库里处理。 - 元信息监控
- 作为操作记录的监控模块来使用,即汇集记录一些操作信息,可以理解为运维性质的数据监控吧。
- 日志收集
- 日志收集方面,其实开源产品有很多,包括Scribe、Apache Flume。很多人使用Kafka代替日志聚合(log aggregation)。日志聚合一般来说是从服务器上收集日志文件,然后放到一个集中的位置(文件服务器或HDFS)进行处理。然而Kafka忽略掉文件的细节,将其更清晰地抽象成一个个日志或事件的消息流。这就让Kafka处理过程延迟更低,更容易支持多数据源和分布式数据处理。比起以日志为中心的系统比如Scribe或者Flume来说,Kafka提供同样高效的性能和因为复制导致的更高的耐用性保证,以及更低的端到端延迟。
- 流处理
- 这个场景可能比较多,也很好理解。保存收集流数据,以提供之后对接的Storm或其他流式计算框架进行处理。很多用户会将那些从原始topic来的数据进行阶段性处理,汇总,扩充或者以其他的方式转换到新的topic下再继续后面的处理。例如一个文章推荐的处理流程,可能是先从RSS数据源中抓取文章的内容,然后将其丢入一个叫做“文章”的topic中;后续操作可能是需要对这个内容进行清理,比如回复正常数据或者删除重复数据,最后再将内容匹配的结果返还给用户。这就在一个独立的topic之外,产生了一系列的实时数据处理的流程。Strom和Samza是非常著名的实现这种类型数据转换的框架。
- 事件源
- 事件源是一种应用程序设计的方式,该方式的状态转移被记录为按时间顺序排序的记录序列。Kafka可以存储大量的日志数据,这使得它成为一个对这种方式的应用来说绝佳的后台。比如动态汇总(News feed)
- 持久性日志(commit log)
- Kafka可以为一种外部的持久性日志的分布式系统提供服务。这种日志可以在节点间备份数据,并为故障节点数据回复提供一种重新同步的机制。Kafka中日志压缩功能为这种用法提供了条件。在这种用法中,Kafka类似于Apache BookKeeper项目。
kafka核心概念与应用场景相关推荐
- Kafka:Kafka核心概念
1 消息系统简介 1.1 为什么要用消息系统 ? 解耦 各位系统之间通过消息系统这个统一的接口交换数据,无须了解彼此的存在: 冗余 部分消息系统具有消息持久化能力,可规避消息处理前丢失的风险: 灵活性 ...
- 二.Kafka入门到精通-Kafka核心概念
前言 上一篇我们认识了一下Kafka以及完成了一个快速入门程序.这篇文章我们将学习Kafka的整体架构,工作流程,以及一些核心概念,正所谓知其然知其所以然. Kafka的架构 我们知道,消息队列的工作 ...
- Kafka核心概念及核心机制
核心概念 broker: 进程 producer: 生产者 flume consumer: 消费者 ss (spark streaming,,,) topic: 主题 分区+副本数 文件夹 parti ...
- ES应用场景及核心概念一
目录 ES基本安装及应用 安装 使用方式 这里在java中实现,首先引入客户端包 index alias的应用 同步DB数据到ES ES核心概念 type类型弱化. ES核心操作 ES基本安装及应 ...
- Spark入门必读:核心概念介绍及常用RDD操作
导读:Spark是由加州大学伯克利分校AMP实验室开源的分布式大规模数据处理通用引擎,具有高吞吐.低延时.通用易扩展.高容错等特点.Spark内部提供了丰富的开发库,集成了数据分析引擎Spark SQ ...
- Flume简介、特点、核心概念及安装
一.什么是flume? flume是一个可分布式日志收集系统,为hadoop相关组件之一. Flume 是可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据源中集中起来存储的工具/服务 ...
- RocketMQ_01 RocketMQ入门简介及核心概念
RocketMQ_01 RocketMQ入门简介及核心概念 伟大的事物不是一时冲动做起来的,而是由一系列小事共同造就的 一.RocketMQ简介 RocketMQ是一款分布式.列队模型的消息中间件,由 ...
- 深入理解Kafka核心设计与实践原理_01
深入理解Kafka核心设计与实践原理_01 01_初识Kafka 1.1 基本概念 1.2 安装与配置 1.3 生产与消费 1.4 服务端参数配置 01_初识Kafka 1.1 基本概念 一个典型的 ...
- 数据湖架构Hudi(三)Hudi核心概念
三.Apache Hudi核心概念 3.1 基本概念 Hudi 提供了Hudi 表的概念, 这些表支持CRUD操作, 可以利用现有的大数据集群比如HDFS做数据文件存储, 然后使用SparkSQL或H ...
最新文章
- 记一次 Kubernetes 集群被入侵,服务器变矿机
- 驳《五大受损 全面解析PHP的糟糕设计》——为PHP正言
- 反函数计算 python
- cmake install_在vscode中使用cmake-format(windows端)
- 企业级实战02_SpringMVC整合ActiveMQ 实战需求
- 别再用Else语句写代码了!
- 【Elasticsearch】 Elasticsearch中数据是如何存储的
- 新型 Linux 病毒,脚本超 1000 行,功能复杂
- (摘要)100个伟大的商业理念:理念35:引爆流行
- EntityFramework Codefirst Select 查询指定列
- 9款优秀的代码比对工具
- LM393低功耗双电压比较器参数、引脚、应用详解
- 安装release版本的apk
- 解决esp8266无法连接手机和电脑热点的问题
- 数据存储的各个发展阶段
- Brodal queue简要说明
- 写给兄弟连学员的第三封信 ——学习这点事 李 明
- Jquery 制作网页飘窗
- 使用图形化界面时startxfce4,出现的cannot open /dev/tty0: Permission denied问题,解决方法
- 报考通信考试有条件吗?要怎么样的条件才能报考通信考试?
热门文章
- 中国邮政竟然开咖啡店了?
- java字符串编码和解码
- 关于类似新浪微博的后台问题
- 微型计算机的状况,微型计算机行业报告_2013-2017年中国微型计算机行业分析及发展预测报告_中商情报网...
- 【云栖风向标】VOL.5:横空出世!热修复方案Sophix
- 化妆品英国SCPN注册(英国SCPN认证)
- 蒋鑫鸿:9.8白银!沪银!期货白银!周四黄金价格走势分析及操作建议
- 正则表达式 同时验证手机号码和固定电话号码(带区号或不带区号或带分机号)
- js放羊动画js特效代码
- 【POI】使用POI在Excel(.xlsx)中生成chart,指定chart位置时,createAnchor方法的偏移量参数(dx1, dy1, dx2, dy2)不生效