首页 > 代码库 > kafka具体解释一、Kafka简单介绍
kafka具体解释一、Kafka简单介绍
背景:
当今社会各种应用系统诸如商业、社交、搜索、浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临例如以下几个挑战:
- 怎样收集这些巨大的信息
- 怎样分析它
- 怎样及时做到如上两点
以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,须要一个沟通两者的桥梁-消息系统。
从一个微观层面来说,这样的需求也可理解为不同的系统之间怎样传递消息。
Kafka诞生:由 linked-in 开源
kafka-即是解决这类问题的一个框架,它实现了生产者和消费者之间的无缝连接。
kafka-高产出的分布式消息系统(A high-throughput distributed messaging system)Kafka特性:它形容自己的设计是独一无二的,先看一下它有怎样过人之处:
- 快:单个kafka服务每秒可处理数以千计client发来的几百MB数据。
- 可扩展性:一个单一集群可作为一个大数据处理中枢,集中处理各种类型业务
- 持久化:消息被持久化到磁盘(可处理TB数据级别数据但仍保持极高数据处理效率),而且有备份容错机制
- 分布式:着眼于大数据领域,支持分布式,集群可处理每秒百万级别消息
- 实时性:生产出的消息可马上被消费者消费
Kafka的组件:
- topic:消息存放的文件夹即主题
- Producer:生产消息到topic的一方
- Consumer:订阅topic消费消息的一方
- Broker:Kafka的服务实例就是一个broker
例如以下图所看到的,Producer生产的消息通过网络发送给Kafka cluster,而Consumer从当中消费消息
Topic 和Partition:
消息发送时都被发送到一个topic,其本质就是一个文件夹,而topic由是由一些Partition Logs(分区日志)组成,其组织结构例如以下图所看到的:
我们能够看到,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,当中的每个消息都被赋予了一个唯一的offset值。
Kafka集群会保存全部的消息,无论消息有没有被消费;我们能够设定消息的过期时间,仅仅有过期的数据才会被自己主动清除以释放磁盘空间。比方我们设置消息过期时间为2天,那么这2天内的全部消息都会被保存到集群中,数据仅仅有超过了两天才会被清除。
Kafka须要维持的元数据仅仅有一个--消费消息在Partition中的offset值,Consumer每消费一个消息,offset就会加1。事实上消息的状态全然是由Consumer控制的,Consumer能够跟踪和重设这个offset值,这种话Consumer就能够读取任何位置的消息。
把消息日志以Partition的形式存放有多重考虑,第一,方便在集群中扩展,每一个Partition能够通过调整以适应它所在的机器,而一个topic又能够有多个Partition组成,因此整个集群就能够适应随意大小的数据了;第二就是能够提高并发,由于能够以Partition为单位读写了。
分布式:
这些Partitions分布在集群的每一台server上,而每个Partition在集群中都能够有多个备份,这个备份数量是可配置的。
每一个Partition都有一个leader server,而其他备份的server都称为followers,仅仅有leaderserver才会处理这个Partition上全部的读写请求,而其他followers则被动的复制leader上的数据。假设一个leader挂掉了,followers中的一个server则会自己主动升级为leader。因此,事实上集群中的每一个server都扮演着一个Partition的leaderserver,和其他Partition的followerserver。
Producers:
Producer能够依据自己的选择公布消息到一个主题,Producer也能够自己决定把消息公布到这个主题的哪个Partition,当然我们能够选择API提供的简单的分区选择算法,也能够自己去实现一个分区选择算法。
Consumers:
消息传递通常由两种模式,queuing(队列)和publish-subscribe (公布-订阅)
- queuing:每一个Consumer从消息队列中取走一个消息
- pub-scrib:消息被广播到每一个Consumer
Kafka通过提供了一个对Consumer的抽象来同一时候实现这两种模式-ConsumerGroup。Consumer实例须要给自己指定一个ConsumerGroup的名字,假设全部的实例都用同一个ConsumerGroup名字,那么这些Consumer就会以queuing的模式工作;假设全部的实例分别用的不同的ConsumerGroup名字,那么它们就以public-subscribe模式工作。
例如以下图所看到的:含两台server的集群一共同拥有p0~p3四个Partition,两个Consumer Group,在Group内部是以queuing的模式消费Partition,在Group之间是以pub-scrib模式消费。
消息顺序性:
Kafka是怎样确保消息消费的顺序性的呢?前面讲到过Partition,消息在一个Partition中的顺序是有序的,可是Kafka仅仅保证消息在一个Partition中有序,假设要想使整个topic中的消息有序,那么一个topic仅设置一个Partition就可以。
kafka具体解释一、Kafka简单介绍
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。