原文来自(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. 最近用的几个sql语句

    都在sqlserver数据库下操作,注意sqlserver与mysql和oracle的语法区别 用惯了mysql 和oracle,突然改用sqlserver,有诸多的不习惯,诸多的坑爹,好多的坑,一一 ...

  2. Lintcode--007(不同的子序列)

    题目:http://www.lintcode.com/zh-cn/problem/distinct-subsequences/ 2016-08-25 给出字符串S和字符串T,计算S的不同的子序列中T出 ...

  3. Linux方面收藏的一点儿资料

    初来乍到,也算是第一次写技术类相关的博客,就分享几篇收藏的Linux相关的资料吧,希望可以给需要的人一点帮助. 1.<高级Bash脚本编程指南>:该网站详细讲解了Bash Shell编程的 ...

  4. Nexus Root Toolkit教程—— 解锁与Root

    Nexus Root Toolkit是Nexus系列手机的专属root工具,本工具可为Nexus系列设备提供解锁.root和反解锁,还可以支持重要数据的备份和恢复.本教程以nexus 7二代和Nexu ...

  5. 使用 ExpandableListView 实现折叠ListView

    1:layout/expandablelistview_groups.xml 标题文件 <?xml version="1.0" encoding="utf-8&qu ...

  6. cf B. Dima and To-do List

    http://codeforces.com/contest/366/problem/B 从0到k枚举起点,然后i+k判断是不是i+k>=n如果是i=(i+k)%n;否则i=i+k; #inclu ...

  7. 深入理解7816(3)-----关于T=0

    卡片和终端之间的数据传输是通过命令响应的方式进行的,卡片只能被动地接收命令,并且给出响应.所有的命令都是以命令头开始,而该命令被完整地执行后(无论结果对错),必须以包含状态字(SW1 SW2)的响应结 ...

  8. Google GFS文件系统深入分析

    Google GFS文件系统深入分析 现在云计算渐成潮流,对大规模数据应用.可伸缩.高容错的分布式文件系统的需求日渐增长.Google根据自身的经验打造的这套针对大量廉价客户机的Google GFS文 ...

  9. Object的wait()/notify()

    wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. 这三个方法最终调用的都是jvm级的native方法.随着jvm运行平台的不同可能有些 ...

  10. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    原文地址:http://www.cnblogs.com/xy8.cn/articles/1227228.html 一.栈和托管堆      通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它 ...