kafka文档翻译(一)
原文来自(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可以媲美于传统消息系统如ActiveMQ和RabbitMQ
网站活动跟踪
传统的kafka使用例是基于kafka重建用户活动跟踪管道作为实时的发布订阅系统,这意味着
kafka文档翻译(一)的更多相关文章
- Kafka官方文档翻译——简介
简介 Kafka擅长于做什么? 它被用于两大类应用: 在应用间构建实时的数据流通道 构建传输或处理数据流的实时流式应用 几个概念: Kafka以集群模式运行在1或多台服务器上 Kafka以topics ...
- Kafka官方文档翻译——设计
下面是博主的公众号,后续会发布和讨论一系列分布式消息队列相关的内容,欢迎关注. ------------------------------------------------------------ ...
- Kafka官方文档翻译——实现
IMPLEMENTATION 1. API Design Producer APIs Producer API封装了底层两个Producer: kafka.producer.SyncProducer ...
- Kafka介绍 (官方文档翻译)
摘要:Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动 ...
- Apache Kafka官方文档翻译(原创)
Apache Kafka是一个分布式流平台.准确的说是什么意思呢?我们认为流平台具有三种关键能力: 1.让你对数据流进行发布订阅.因此他很像一个消息队列和企业级消息系统. 2.让你以高容错的方式存储数 ...
- Kafka学习入门
最近工作中用到了两个很给力的项目,一个是Kafka,一个是Strom.本着自我学习并方便他人的目的,我会将我觉得比较有用的英文文档翻译在此(保留系统专有名词不作翻译). 1kafka介绍 在流式计算中 ...
- Flink官网文档翻译
http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
随机推荐
- Activiti工作流学习-----基于5.19.0版本(3)
前面关于eventType的属性值的配置简单的说了一下,activiti支持的值如下表所示:这是我摘抄的activiti官网的 Event 的名字 描述 Event的类名 ENGINE_CREATED ...
- syscall 中断号
#ifndef __ASM_ARM_UNISTD_H #define __ASM_ARM_UNISTD_H #define __NR_OABI_SYSCALL_BASE 0x900000 #if de ...
- matlab图像处理
matlab图像处理 转自:http://www.cnblogs.com/lovebay/p/5094146.html 1. 图像和图像数据 缺省情况下,MATLAB将图像中的数据存储为双精度类型(d ...
- Javascript 原型注意事项
function abc() {} abc.prototype.xx = { name: "keatkeat" } var x = new abc(); x.xx.name = & ...
- Linux sleep命令 和 wait命令
man sleep: SLEEP(1) User Commands SLEEP(1) NAME sleep - delay for a specified amount of time SYNOPSI ...
- coalesce和nvl函数
coalesce 函数 : Oracle COALESCE函数语法为COALESCE(表达式1,表达式2,...,表达式n),n>=2,此表达式的功能为返回第一个不为空的表达式,如果 都为空则返 ...
- phpcms:二、头部尾部包含
1.index.html是默认的首页{template "content","header"}引入头部的模块{template "content&qu ...
- ipython with ubuntu
在Linux环境下,其实IDE环境配置比较容易配.所以建议用linux做开发. 首选启动终端:Ctrl+Alt+T sudo apt-get update sudo apt-get install p ...
- c++读取ccbi
loader类文件: 需要定义CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(ButtonTestLayerLoader, loader); 这个宏定义是定义静态的l ...
- Android Fragment详解(三): 实现Fragment的界面
为fragment添加用户界面: Fragment一般作为activity的用户界面的一部分,把它自己的layout嵌入到activity的layout中. 一个 要为fragment提供layout ...