kafka是干嘛的(kafka主要用来做什么)
本篇文章给大家谈谈kafka是干嘛的,以及kafka主要用来做什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、soulcoder——消息队列知识总结(偏向于 Kafka)
- 2、kafka session.timeout.ms 是干什么
- 3、卡卡夫是干什么的
- 4、hadoop、kafka、spark、storm、zookeeper、akka这些都是干啥的,学习顺序怎么样的?
- 5、大数据网络工程师主要干什么的呀?
- 6、3分钟带你彻底搞懂 Kafka
soulcoder——消息队列知识总结(偏向于 Kafka)
[toc]
分析一个消息队列主要从这几个点出来。
在后半部分主要分析了 kafka 对以上几点的保证。
详见下文分析重点分析。
事务支持方面,ONS/RocketMQ较为优秀,但是不支持消息批量操作, 不保证消息至少被消费一次.
Kafka提供完全分布式架构, 并有replica机制, 拥有较高的可用性和可靠性, 理论上支持消息无限堆积, 支持批量操作, 消费者采用Pull方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次. 但是官方提供的运维工具不友好,开源社区的运维工具支持的版本一般落后于最新版本的Kafka.
目前使用的MNS服务,拥有HTTP REST API, 使用简单, 数据可靠性高, 但是不保证消息有序,不能回溯数据.
RabbitMQ为重量级消息系统, 支持多协议(很多协议是目前业务用不到的), 但是不支持回溯数据, master挂掉之后, 需要手动从slave恢复, 可用性略逊一筹.
以rcoketMQ为例,他的集群就有
第一眼看到这个图,就觉得和kafka好像,只是NameServer集群,在kafka中是用zookeeper代替,都是用来保存和发现master和slave用的。
通信过程如下:
Producer 与 NameServer集群中的其中一个节点(随机选择)建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Broker Master 建立长连接,且定时向 Broker 发送心跳。
Producer 只能将消息发送到 Broker master,但是 Consumer 则不一样,它同时和提供 Topic 服务的 Master 和 Slave建立长连接,既可以从 Broker Master 订阅消息,也可以从 Broker Slave 订阅消息。
那么kafka呢?
为了对比说明直接上kafka的拓补架构图
如上图所示,一个典型的Kafka集群中包含若干Producer(可以扰族迹是web前端产生的Page View,或者是服务器日志,系统CPU、Memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干Consumer Group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息缓并发布到broker,Consumer使用pull模式从broker订阅并消费消息。
最骚的一个操作,消费者业务自己去保证幂等性。
换一个说法,如何保证消息队列的幂等性?
另外说一点,幂等性的保证需要在一次请求中所有链路都是幂等的,再能最终保证这次请求的幂等,比如前段按钮点击两次,后端认为都是这是两次不同的请求,当然处理成两次请求,所以说一个请求的幂等性,需要全局的幂等才能保证。
其实无论是哪种消息队列,造成重复消费原因其实都是类似的。正常情况下,消费者在消费消息时候,消费完毕后,会发送一个确认信息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除。只是不同的消息队列发送的确认信息形式不同。
例如RabbitMQ是发送一个ACK确认消息,RocketMQ是返回一个CONSUME_SUCCESS成功标志,kafka实际上有个offset的概念,简单说一下(后续详细解释),就是每一个消息都有一个offset,kafka消费过消息后,需要提交offset,让消息队列知道自己穗圆已经消费过了。
那造成重复消费的原因?,就是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将该消息分发给其他的消费者。
如何解决?这个问题针对业务场景来答分以下几点
其实这个可靠性传输,每种MQ都要从三个角度来分析:生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据。
从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。
transaction(事物机制)机制就是说,发送消息前,开启事物(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,事物就会回滚(channel.txRollback()),如果发送成功则提交事物(channel.txCommit())。然而缺点就是吞吐量下降了。
生产上用confirm模式的居多。一旦channel进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个Ack给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了.如果rabiitMQ没能处理该消息,则会发送一个Nack消息给你,你可以进行重试操作。
简单来讲 confirm模式就是生产者发送请求,到了消息队列,消息队列会回复一个消息收到的应答,如果没收到,生产者开始重试。
处理消息队列丢数据的情况,一般是开启持久化磁盘的配置。这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘后,再给生产者发送一个Ack信号。这样,如果消息持久化磁盘之前,rabbitMQ阵亡了,那么生产者收不到Ack信号,生产者会自动重发。
消费者丢数据一般是因为采用了自动确认消息模式。这种模式下,消费者会自动确认收到信息。这时rahbitMQ会立即将消息删除,这种情况下如果消费者出现异常而没能处理该消息(但是消息队列那边已经认为消息被消费了),就会丢失该消息。
至于解决方案,采用手动确认消息即可。
kafka为例
Producer在发布消息到某个Partition时,先通过ZooKeeper找到该Partition的Leader,然后无论该Topic的Replication Factor为多少(也即该Partition有多少个Replica),Producer只将该消息发送到该Partition的Leader。Leader会将该消息写入其本地Log。每个Follower都从Leader中pull数据。
在kafka生产中,基本都有一个leader和多个follwer。follwer会去同步leader的信息。因此,为了避免生产者丢数据,做如下两点配置
针对消息队列丢数据的情况,无外乎就是,数据还没同步,leader就挂了,这时zookpeer会将其他的follwer切换为leader,那数据就丢失了。针对这种情况,应该做两个配置。
这种情况一般是自动提交了offset,然后你处理程序过程中挂了。kafka以为你处理好了。再强调一次offset是干嘛的。
offset:指的是kafka的topic中的每个消费组消费的下标。简单的来说就是一条消息对应一个offset下标,每次消费数据的时候如果提交offset,那么下次消费就会从提交的offset加一那里开始消费。
比如一个topic中有100条数据,我消费了50条并且提交了,那么此时的kafka服务端记录提交的offset就是49(offset从0开始),那么下次消费的时候offset就从50开始消费。
针对这个问题,通过某种算法,将需要保持先后顺序的消息放到同一个消息队列中(kafka中就是partition,rabbitMq中就是queue)。然后只用一个消费者去消费该队列。
有的人会问:那如果为了吞吐量,有多个消费者去消费怎么办?
简单来说消息的时序性也可以通过错误重试来解决。
比如我们有一个微博的操作,发微博、写评论、删除微博,这三个异步操作。如果是这样一个业务场景,那只要重试就行。比如你一个消费者先执行了写评论的操作,但是这时候,微博都还没发,写评论一定是失败的,等一段时间。等另一个消费者,先执行写评论的操作后,再执行,就可以成功。
总之,针对这个问题,我的观点是保证入队有序就行,出队以后的顺序交给消费者自己去保证,没有固定套路。
为了做到水平扩展,一个topic实际是由多个partition组成的,遇到瓶颈时,可以通过增加partition的数量来进行横向扩容。
单个parition内是保证消息有序。
订阅topic是以一个消费组来订阅的,一个消费组里面可以有多个消费者。
同一个消费组中的两个消费者,只能消费一个partition。
换句话来说,就是一个partition,只能被消费组里的一个消费者消费,但是可以同时被多个消费组消费。
如果消费组内的消费者如果比partition多的话,那么就会有个别消费者一直空闲。
kafka api 提供了很多功能比如
生产者能指定 topic 和 Partition 来投递消息,并且还有延迟消息,事务消息等等,详见下面的 api 文档
这个是 api 的中文文档
Kakfa Broker集群受Zookeeper管理。
这里先说下
关于partition的分配,还有leader的选举,总得有个执行者。在kafka中,这个执行者就叫controller。kafka使用zk在broker中选出一个controller,用于partition分配和leader选举。
所有的Kafka Broker节点一起去Zookeeper上注册一个临时节点,并且只有一个Kafka Broker会注册成功,其他的都会失败,所以这个成功在Zookeeper上注册临时节点的这个Kafka Broker会成为 Kafka Broker Controller ,其他的Kafka broker叫 Kafka Broker follower 。(这个过程叫Controller在ZooKeeper注册Watch)。
这个Controller会监听其他的Kafka Broker的所有信息,如果这个kafka broker controller宕机了,在zookeeper上面的那个临时节点就会消失,此时所有的kafka broker又会一起去Zookeeper上注册一个临时节点。
Kafka提供3种消息传输一致性语义:最多1次,最少1次,恰好1次。
最少1次(at most once):可能会重传数据,有可能出现数据被重复处理的情况;
最多1次(at least once):可能会出现数据丢失情况;
恰好1次(Exactly once):并不是指真正只传输1次,只不过有一个机制。确保不会出现“数据被重复处理”和“数据丢失”的情况。
操作系统本身有一层缓存,叫做page cache,是在内存里的缓存,我们也可以称之为os cache,意思就是操作系统自己管理的缓存。
每新写一条消息,kafka就是在对应的文件append写,所以性能非常高。
我觉得的靠的是这两个参数
这篇主要从生产和消费的角度详细给出的过程
[img]kafka session.timeout.ms 是干什么
Kafka是由LinkedIn设计的一个高吞吐量、分布式、基于发布订阅模式的消息系统
卡卡夫是干什么的
卡夫卡
弗兰兹·卡夫卡(Franz Kafka,1883年7月3日—1924年6月3日),20世纪德语小说家。文笔明净而想像奇诡,常采用寓言体,背后的寓意言人人殊,暂无(或永无)定论。别开生面的手法,令二十世纪各个写作流派纷纷追认其为先驱。
卡夫卡生于捷克(当时属奥匈帝国)首府布拉格一个犹太商人家庭,是家中长子,有三个妹妹(另有两个早夭的弟弟)。自幼爱好文学、戏剧,18岁进入布拉格大学,初习化学、文学,后习法律,获博士学位。毕业后,在保险公司任职。多次与人订婚,却终生未娶,41岁时死于肺痨。
1904年,卡夫卡开始发表小说,早期的作品颇受表现主义的影响。1912年的一个晚上,通宵写出短篇《判决》,从此建立自己独特的风格。生前共出版七本小说的单行本和集子,死后好友布劳德(Max Brod)违背他的遗言,替他整理遗稿,出版三部长篇小说(均未定稿),以及书信、日记,并替他立传。
后世的批评家,往往过分强调卡夫卡作品阴暗的一面,忽视其明朗、风趣的地方,米兰·昆德拉在《被背叛的遗嘱》(Les testaments trahis)中试图纠正这一点。其实据布劳德的回忆,卡夫卡喜欢在朋友面前朗读自己的作品,读到得意的段落时会忍俊不禁,自己大笑起来。
卡夫卡他是一位用德语写作的业余作家,国籍属奥匈帝国。他与法国作家马赛尔·普鲁斯特,爱尔兰作家詹姆斯·乔伊斯并称为西方现代主义文学的先驱和大师。卡夫卡生前默默无闻,孤独地奋斗,随着时间的流逝,他的价值才逐渐为人们所认识,作品引起了世界的震动,并在世界范围内形成一股“卡夫卡”热,经久不衰。
卡夫卡一生的作品并不多,但对后世文学的影响却是极为深远的。美国诗人奥登认为:“他与我们时代的关系最近似但丁、莎士比亚、歌德与他们时代的关系。”卡夫卡的小说揭示了一种荒诞的充满非理性色彩的景象,个人式的、忧郁的、孤独的情绪,运用的是象征式的手法。后世的许多现代主义文学流派如“荒诞派戏剧”、法国的“新小说”等都把卡夫卡奉为自己的鼻祖。
卡夫卡出生在布拉格的一个犹太商人家庭,他的父亲粗暴、专制,对儿子的学习、生活不闻不问,只是偶尔指手画脚地训斥一通——他轮亏想把儿子培养成为性格坚强而又干的年轻人,但结果是适得其反,卡夫卡内心中一直对父亲存有无法消除的畏惧心理。由此而培养的敏感、怯懦的性格和孤僻、忧郁的气质使卡夫卡其人其书敏桐猜成为那个时代资本主义社会的精神写照:异化现象,难以排遣的孤独和危机感,无法克服的荒诞和恐惧。
卡夫卡的《变形记》中,由于沉重的肉体和精神上桥型的压迫,使人失去了自己的本质,异化为非人。另一部短篇小说《饥饿艺术家》描述了经理把绝食表演者关在铁笼内进行表演,时间长达四十天。表演结束时,绝食者已经骨瘦如柴,不能支持。后来他被一个马戏团聘去,把关他的笼子放在离兽场很近的道口,为的是游客去看野兽时能顺便看到他。可是人们忘了更换记日牌,绝食者无限期地绝食下去,终于饿死。这里的饥饿艺术家实际上已经异化为动物了。
另外一些小说是揭示现实世界的荒诞与非理性的,如《判决》和名篇《乡村医生》,这里,现实和非现实的因素交织,透过这些荒诞的细节和神秘的迷雾,这里寓意着:人类患了十分严重的病,已经使肌体无可救药。人类社会的一些病症是医生医治不了的,这里的医生最后也变成了流浪者。
卡夫卡的长篇小说《美国》和《地洞》等揭示的是人类现实生活中的困境和困惑感;而《审判》、《在流放地》以及《万里长城建造时》则揭示了现代国家机器的残酷和其中的腐朽。短篇小说《万里长城建造时》中写到:中国老百姓被驱赶去建造并无多大实用价值的长城,他们连哪个皇帝当朝都不知道,许多年前的战役他们刚刚得知,仿佛是新闻一般奔走相告。“皇帝身边云集着一批能干而来历不明的廷臣,他们以侍从和友人的身份掩盖着艰险的用心。” “那些皇妃们靡费无度,与*刁的廷臣们勾勾搭搭,野心勃勃,贪得无厌,纵欲恣肆,恶德暴行就像家常便饭。”他还写出了表现民主主义思想的一句话:“在我看来,恰恰是有关帝国的问题应该去问一问老百姓,因为他们才是帝国的最后支柱呢。”
hadoop、kafka、spark、storm、zookeeper、akka这些都是干啥的,学习顺序怎么样的?
hadoop、storm、spark、akka是分布式处理框架;
kafka是一种消息队列;
zookeeper是dubbo的服务注册中心;
由上可见,这些东西相关性没那么大,学习是要看应用场景的,如果你在大数据公司里做分布式处理,那hadoop、spark二者之一估计是必学的好尘蔽;如果你要做微服务相关兄胡,那zookeeper可能是要了解的(因为也可以选择eureka);消息队列作为常用的友州消息中间件,在高阶应用,也是必然需要掌握的。
学习不分先后,用到了就早学,没用到的可能一辈子也不会学到。
大数据网络工程师主要干什么的呀?
大数据工程师工作内容取决于你工作在数据流的哪一个环节。
从数据上游到数据下游,大致可以分为:
数据采集 - 数据清洗 - 数据存储 - 数据分析统计 - 数据可视化 等几个方面
工作内容当然就是使用工具组件(Spark、Flume、Kafka等)或者代码(Java、Scala等)来实现上面几个方面的功能。
具体说说吧,
数据采集:
业务系统的埋点代码时刻会产生一些分散的原始敬闭日志,可以用Flume监控接收这些分散的日志,实现分散日志的聚合,即采集。
数据清洗:
原始的日志,数据是千奇百怪的
一些字段可能会有异常取值,即脏数据。为了保证数据下游亮大裂的"数据分析统计"能拿到比较高质量的数据,需要对这些记录进行过滤或者字段数据回填。
一些日志的字段信息可能是多余的,下游不需要使用到这些字段做分析,同时也为了节省存储开销,需要删除这些多余的字段信息。
一些日志的字段信息可能包含用户敏感信息,需要做脱敏处理。如用户姓名只保留姓,名字用'*'字符替换。
数据存储:
清洗后的数据可以落地入到数据仓库(Hive),供下游做离线分析。如果下游的"数据分析统计"对实时性要求比较高,则可以把日志记录入到kafka。
数据分析统计:
数据分析是数据流的下游,消费来自上游的数据。其实就是从日志记录里头统计出各种各样的报表数据,简单的报表统计可以用sql在kylin或者hive统计,复杂的报表就需要在代码层面用Spark、Storm做统计分析。一些公司好像会有个叫BI的岗位是专门做这一块的。
数据可视化:
用数据表格、数据图等直观的形式展示上游"仿慎数据分析统计"的数据。一般公司的某些决策会参考这些图表里头的数据~
当然,大数据平台(如CDH、FusionInsight等)搭建与维护,也可能是大数据工程师工作内容的一部分喔~
希望对您有所帮助!~
3分钟带你彻底搞懂 Kafka
Kafka到底是个啥?用来干嘛的?
官方定义如下:
翻译过来,大致的意思就是,这是一个实时数据处理系统,可以横向扩展,并高可靠!
实时数据处理 ,从名字上看,很好理解,就是将数据进行实时处理,在现在流行的微服务开发中,最常用实时数据处理平台有 RabbitMQ、RocketMQ 等消息中间件。
这些中间件,最大的特点主要有两个:
在早期的 web 应用程序开发中,当请求量突然上来了时候,我们会将要处理的数据推送到一个队列通道中,然后另起一个线程来不断轮训拉取队列中的数据,从而加快程序的运行效率。
但是随着请求量不断的增大,并且队列通道的数据一致处于高负载,在这种情况下,应用程序的内存占用率会非常高,稍有不慎,会出现内存不足,造成程序内存溢出,从而导致服务不可用。
随着业务量的不断扩张,在一个应用程序内,使用这种模式已然无法满足需求,因此之后,就诞生了各种消息中间件,例如 ActiveMQ、RabbitMQ、RocketMQ等中间件。
采用这种模型,本质就是将要推送的数据,不在存放在当磨枯前应用程序的内存中,而是将数据存放到另一个专门负责数据处理的应用程序中,从而实现服务解耦。
消息中间件 :主要的职责就是保证能接受到消息,并将消息存储到磁盘,即使其他服务都挂了,数据也不会丢失,同时还可以对数据消费情况做好监控工作。
应用程序 :只需要将消息推送到消息中间件,然后启用一个线程来不断从消息中间件中拉取数据,进行消费确认即可!
引入消息中间件之后,整个服务开发会变得更加简单,各负其责。
Kafka 本质其实也是消息中间件的一种,Kafka 出自于 LinkedIn 公司,与 2010 年开源到 github。
LinkedIn 的开发团队,为了解决数据管道问题,起初采用了 ActiveMQ 来进行数据交换,大约是在 2010 年前后,那时的 ActiveMQ 还远远无法满足 LinkedIn 对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,LinkedIn 决定研发自己的消息传递系统, Kafka 由此诞生 。
在 LinkedIn 公司,Kafka 可以有效地处理每天数十亿条消息的指标和用户活动跟踪,其强大的处理能力,已经被业界所认可,并成为大数据流水线的首选技术。
先来看一张图, 下面这张图就是 kafka 生产与消费的核心架构模型 !
如果你看不懂这些概念没关系,我会带着大家一起梳理一遍!
简而言之,kafka 本质就是一个消息系统,与大多数的消息系统一样,主要的特点如下:
与 ActiveMQ、RabbitMQ、RocketMQ 不同的地方在于,它有一个**分区 Partition **的概念。
这个分区的意思就是说,如果你创建的 topic 有5个分区,当你一次性向 kafka 中推 1000 条数据时,这 1000 条数据默认会分培游哪配到 5 个分区中,其中每个分区存储 200 条数据。
这样做的目的,就是方便消费者从不同的分区拉取数据,假如你启动 5 个线程同时拉取数据,每个线程拉取一个分区,消费速度会非常非常快!
这是 kafka 与其他的消息系统最大的不同!
和其他的中间件一样,kafka 每次发送数据都是向 Leader 分区发送数据,并顺序写入到磁盘,然后 Leader 分区会将数据同步到各个从分区 Follower ,即使主分区挂了,也不会影响服务的正常运行。
那 kafka 是如何将数据写入到对应的分区呢?kafka中有以下几个原则:
与生产者一样,消费者主动的去kafka集群拉取消息时,也是从 Leader 分区去拉取数据。
这里我们需要重点了解一个名词: 消费组 !
考虑到多个消配码费者的场景,kafka 在设计的时候,可以由多个消费者组成一个消费组,同一个消费组者的消费者可以消费同一个 topic 下不同分区的数据,同一个分区只会被一个消费组内的某个消费者所消费,防止出现重复消费的问题!
但是不同的组,可以消费同一个分区的数据!
你可以这样理解,一个消费组就是一个客户端,一个客户端可以由很多个消费者组成,以便加快消息的消费能力。
但是,如果一个组下的消费者数量大于分区数量,就会出现很多的消费者闲置。
如果分区数量大于一个组下的消费者数量,会出现一个消费者负责多个分区的消费,会出现消费性能不均衡的情况。
因此,在实际的应用中,建议消费者组的 consumer 的数量与 partition 的数量保持一致!
光说理论可没用,下面我们就以 centos7 为例,介绍一下 kafka 的安装和使用。
kafka 需要 zookeeper 来保存服务实例的元信息,因此在安装 kafka 之前,我们需要先安装 zookeeper。
zookeeper 安装环境依赖于 jdk,因此我们需要事先安装 jdk
下载zookeeper,并解压文件包
创建数据、日志目录
配置zookeeper
重新配置 dataDir 和 dataLogDir 的存储路径
最后,启动 Zookeeper 服务
到官网 下载想要的版本,我这里下载是最新稳定版 2.8.0 。
按需修改配置文件 server.properties (可选)
server.properties 文件内容如下:
其中有四个重要的参数:
可根据自己需求修改对应的配置!
启动 kafka 服务
创建一个名为 testTopic 的主题,它只包含一个分区,只有一个副本:
运行 list topic 命令,可以看到该主题。
输出内容:
Kafka 附带一个命令行客户端,它将从文件或标准输入中获取输入,并将其作为消息发送到 Kafka 集群。默认情况下,每行将作为单独的消息发送。
运行生产者,然后在控制台中键入一些消息以发送到服务器。
输入两条内容并回车:
Kafka 还有一个命令行使用者,它会将消息转储到标准输出。
输出结果如下:
本文主要围绕 kafka 的架构模型和安装环境做了一些初步的介绍,难免会有理解不对的地方,欢迎网友批评、吐槽。
由于篇幅原因,会在下期文章中详细介绍 java 环境下 kafka 应用场景!
关于kafka是干嘛的和kafka主要用来做什么的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。