原文来自(http://kafka.apache.org/documentation.html

本文只做简单的翻译,水平有限,仅供学习交流使用

如有错误,欢迎点评指正

1  准备开始


1.1 介绍

kafka是一个分布式的,分区的,复用的日志提交服务。它以一种独特的设计方式提供消息传递系统的功能。

首先让我们回顾一些基本的消息术语
* kafka在不同的类别中维持消息,这些类别被称为主题(topic)
* 我们把发布消息给kafka topic的程序称为生产者(producer)
* 我们称那些订阅topic和处理已发布的消息的程序叫做消费者(consumer)
* kafka作为一个集群运行,集群包含一个或多个服务器,我们称这些服务器为broker

总的来看,生产者(producer)通过网络发送message(消息)给kafka集群,kafka集群再提供(基于消息)服务给consumer(消费者),如下图

客户端与服务端的通信通过一个简单的,高性能的,无关语言(language agnostic)的TCP协议完成。我们提供一个kafka的java版客户端,kafka客户端可以用多种语言实现

主题和日志(Topics and Logs)
我们首先深入了解kafka提供的高级抽象--主题(topic),topic是已发布消息的类别或饲料(feed)名,对每个主题,卡夫卡维持一个分区日志如下图

每个分区都是一个有序的不可变的消息序列,提交日志时不断地追加到消息序列里,分区里的消息都被赋予了一个顺序的id号称为偏移量(offset),这些id号唯一标识了分区里的每条消息

kafka集群会在一段可配置的时间内保留已发布的消息,不管它们是否被消费了。比如你配置了保留日志的时间是2天,那么在消息发布后的2天,这条消息一直都是可用的,可以被消费的,超过这个时间,kafka会把它删除以释放空间。kafka的性能不会因数据大小而改变,所有保存一些日志并不是问题。

###
实际上保留在每个消费者基础的唯一的元数据是消费者在日志中的位置,被称为“偏移”。
The Kafka cluster retains all published messages—whether or not they have been consumed—for a configurable period of time. 
这个偏移由消费之控制,通常消费者在读完消息后会线性前置偏移量,但实际上这个位置由消费者自己控制,它可以消费信息在任何它喜欢的位置
比如消费者可以旧的偏移量重新处理

这种特性的结合意味着kafka消费者非常方便,他们的行为对集群或其他消费着无太多影响,例如,您可以使用我们的命令行工具“tail”的任何话题,而不改变什么是任何现有的消费者消费的内容。
###
在日志中的分区一举数得。首先,他们允许日志缩放到可以适应一个单服务器,每个分区必须满足承载它的服务器上,但一个topic可能有很多partition(分区),以便它可以处理任意数量的数据。其次,它们更多的是作为并行的一个单元,而不是单独的一位

分布式(distribution)
log的分区(partition)分配在kafka集群的每台机器上,并且kafka集群中的每台服务器都都处理请求和数据,因为它们共享这些分区(partitions)。每个partition可以配置共享它们的服务器的数量,并以此来解决容错问题。

每个partition有一台服务器作为老大(leader),然后会有零或多个服务器作为小弟(followers)。leader(老大)处理所有的读写请求,而followers(小弟们)被动地复制leader的操作。如果leader fail(老大萎了),小弟(follower)中有个会成为新老大(leader),每台服务器都会有一些分区(partitions),而服务器会作为这些本地partitions的老大,作为其他不在本地的partitions的小弟,以此来达到负载均衡


生产者(Producers)

生产者(producers)根据他们的选择发布(publish)数据到主题(topics),生产者负责选择分配哪个消息到topic的哪个partition,这会通过一种基于循环的简单负载均衡方式完成,或者通过一些语意分区功能(基于在message中的key),多数分区的使用在一秒内完成

消费者(Consumers)

传统消息系统有两种模型,队列发布-订阅。在队列模型,消费者们会从服务端读取数据,读取的数据会从队列中删除。在发布-订阅模型,消息是广播的方式发送给所有消费者,kafka提供一个单一消费抽象,涵盖了上述两种模型--consumer group(消费组)

consumer用consumer group(组名)标识自己,每条发布给主题的消息都会传递给一个消费实例(consumer instance),消费实例包含所有订阅消息的消费组,消费实例可以是不同的进程,也可以在不同的机器上。如果所有的消费实例都有相同的消费者组,那它对于消费者来说就像是传统的负载均衡队列。如果所有的消费实例有不同的消费者组,那它的工作就像消息-订阅模式,所有的消息广播给所有的消费者。

一般来说,我们发现主题只有少数的消费者组,每一个都是一个“逻辑上的订阅(logical subscriber)”。每组都有多个消费者实例组成,这样更有利于可扩展性和容错。用消费者集群代替单一进程的用意就是在此。

kafka和传统的消息消息系统一样拥有强有力的数据顺序保证。

传统的队列在服务器上有序的保存消息,当有多个消费者需要从队列消费消息时,队列会按照之前存储的顺序有序的提供数据。然而,尽管服务器是有序的分发消息,但消息时异步传递给消费者,所以这些消息到达不同的消费者时可能就出现乱序。这意味着消息的顺序在并行消费时失去的意义。消息系统通常以一个“独立消费者”的概念来解决这种问题,它只允许一个进程消费队列中的消息,但这实际意味着它不再算是并行计算。

kafka在这方面做得很好,通过“parallelism”的概念,在topics里进行分区,kafka能够给一个消费者池(a pool of customer)提供数据有序保证以及负载均衡。这是通过分配topic里的partition给消费者组里的消费者实现的,所以每个分区是被组里的一个消费者消费。通过这我们确信消费者时分区里的唯一读者,并且有序的消费数据。因为有多个分区,他还能够在多个消费者实例间实现负载均衡,尽管是这样,分区的数量仍是大于消费者的。

####

可靠性(Guarantees)

kafka提供一下可靠性保证

* 消息会以生产者发送的顺序追加到主题的分区,也就是说,通一个生产者发送同一个消息两次分别称为M1,M2,M1先发,那么M1将会有一个更小的偏移量,并且也会比M2早出现在日志中。

* 消费者以存储在日志中的顺序看见消息。

* 对于复制N倍的主题,知道N-1台服务器出错,都不会使已经提交的日志丢失

更多请参考文档的设计章节

1.2 一些使用情况

下面介绍了一些Apache kafka比较流行的使用情况,详情请戳这里

消息系统

kafka可以更好地作为传统消息代理的替代者,消息代理因为各种原因被应用。相较于大多数的消息系统卡夫卡有更好的吞吐量,内置分区,复制和容错,而这些特性使得kafka成为大规模消息处理应用的理想解决方案。

以我们的经验,消息系统的吞吐量通常较低,但却需要端到端的低延迟,而kafka的可以基于较强的持久性提供延迟保证

在消息系统领域,kafka可以媲美于传统消息系统如ActiveMQRabbitMQ

网站活动跟踪

传统的kafka使用例是基于kafka重建用户活动跟踪管道作为实时的发布订阅系统,这意味着

kafka文档翻译(一)的更多相关文章

  1. Kafka官方文档翻译——简介

    简介 Kafka擅长于做什么? 它被用于两大类应用: 在应用间构建实时的数据流通道 构建传输或处理数据流的实时流式应用 几个概念: Kafka以集群模式运行在1或多台服务器上 Kafka以topics ...

  2. Kafka官方文档翻译——设计

    下面是博主的公众号,后续会发布和讨论一系列分布式消息队列相关的内容,欢迎关注. ------------------------------------------------------------ ...

  3. Kafka官方文档翻译——实现

    IMPLEMENTATION 1. API Design Producer APIs Producer API封装了底层两个Producer: kafka.producer.SyncProducer ...

  4. Kafka介绍 (官方文档翻译)

    摘要:Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动 ...

  5. Apache Kafka官方文档翻译(原创)

    Apache Kafka是一个分布式流平台.准确的说是什么意思呢?我们认为流平台具有三种关键能力: 1.让你对数据流进行发布订阅.因此他很像一个消息队列和企业级消息系统. 2.让你以高容错的方式存储数 ...

  6. Kafka学习入门

    最近工作中用到了两个很给力的项目,一个是Kafka,一个是Strom.本着自我学习并方便他人的目的,我会将我觉得比较有用的英文文档翻译在此(保留系统专有名词不作翻译). 1kafka介绍 在流式计算中 ...

  7. Flink官网文档翻译

    http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me ...

  8. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  9. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

随机推荐

  1. MyGeneration 默认设置中没有数据库驱动

    这 个问题的出现基本上是因为MyGeneration 1.3需要的是 .Net framework 4.0,如果系统安装了 .Net 2.0的版本,安装程序执行的 regasm.exe为2.0版本下的 ...

  2. iOS 9的 Universal Links 通用链接使用

    前段时间和朋友(@品味生活)一起搞 iOS9的通用链接,我主要做了前面官方文档翻译工作,后面的一些东西都是他在搞,整理也是他整理的. 他的博客原文地址:http://pinwei.blog.51cto ...

  3. CSS3 Flexbox布局那些事

    相信研究过CSS3的同学对Flexbox布局一定不会陌生(作为一个未来主流的布局方式,至少有所耳闻).最近完成了两个项目:一个是移动端H5项目,一个是嵌入HTML页面的mac客户端项目.为了庆祝这两个 ...

  4. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

  5. Qt构建工具QBS之零 —— QBS 概览

    本系列文章起因 自己非常喜欢 QT 这个框架, 使用 QT 这几年, IDE 一直是使用的 QT 自带的 Qt Creator, 这个 IDE 本身比较轻巧, 同事相关的语法提示之类的也算够用, 但是 ...

  6. 微软的操作系统中让 32 位支持大于 4GB 的内存。

    先给一个参考文献:The RAM reported by the System Properties dialog box and the System Information tool is les ...

  7. hdu2795--Billboard

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2795 摘要:有一块尺寸为h*w的矩形长板,要在上面贴1*wi的海报n张,选择贴海报的位置是:尽量高,同一 ...

  8. Corrupted MAC on input

    Corrupted MAC on input Incorrect MAC received on packet

  9. iOS7状态栏字体颜色修改

    iOS7中,默认的状态栏字体颜色是黑色的,如何修改为其它颜色呢? 1.在项目的*info.plist中增加 View controller-based status bar appearance 属性 ...

  10. Grizzly开发Echoserver实战

    Grizzly开发Echoserver实战 作者:chszs,转载需注明. 博客主页:http://blog.csdn.net/chszs 用Java编写可伸缩的server应用是有难度的.用Java ...