Kafka 文档引言
原文地址:https://kafka.apache.org/documentation.html#semantics
1、开始
1.1 引言
Kafka是一个分布式,分区队列,冗余备份的消息存储服务。它是一个有独特设计的消息系统。
这是什么意思呢?
首先我们介绍下相关的基本通信概念:
1.Kafka按主题分布消息。
2.生产者发布消息给Kafka主题。
3.消费者订阅并处理被提供的发布出的信息。
4.Kafka作为由一个或多个中介服务的集群运行。
然后,深入一些,生产者通过网络发送消息给用于提供给消费者服务的Kafka集群,如图:

在客户端和服务器之间只是进行高性能,与语言无关的TCP协议通信。
主题和消息存储
让我们先看看Kafka上层的概念---主题
主题是消息被发布到的分类或空间。对于每个主题,Kafka集群都维护一个如下图的分段空间:

每个分段空间都是有序的,消息按固定的顺序不停的附加到消息存储位置。分段空间中的所有消息都会分配一个顺序ID用来在分段中唯一标示每一条消息。
无论发布的消息是否被消费,它们都会被Kafka集群根据配置保留一段时间。比如,消息保留设置为两天,那么从发布时开始到被丢弃释放空间,有两天时间消息对消费者都是可用的。数据的大小对Kafka性能的稳定没有太大影响,保持大量数据也不会造成问题。
事实上,消费者仅持有基本的描述存储的消费指向的元数据---偏移量。偏移量由消费者控制:一般情况下,消费者读取消息时偏移量也会线性增加,但事实上是否线性是由消费者控制的,它可以按照它希望的任何顺序消费消息。例如,消费者可以重置偏移量来重新消费消息。
这些设计使得Kafka的消费者负担很小,它们运行几乎不会受到集群或其他消费者的影响。例如,你可以在不影响现有消费者消费的情况下,在命令行工具中跟踪任何主题的内容。
分布式
存储消息的分区分布在Kafka的服务器集群上,集群中的每个服务器处理分配给它的数据和请求。同时,用于容错,每个分区的数据都可以配置在一定数量的服务器上做备份。
每个分区都是由一个中心服务器和不定数量的从服务器组成。中心服务器处理所有对分区的读写请求并分发给从服务器。如果中心服务器挂了,从服务器中会自动选举一个成为新的中心服务器。通过这种方式,将集群中的中心服务器和从服务器负载均衡。
生产者
生产者发布消息到选定的主题。它负责选取消息分配到所选主题的分区中。分配的方式可以是循环的平均分配,也可能是通过一些分区函数(常说的基于消息中的一些KEY)。更常见的是通过权重。
消费者
消息通讯通常有两种模式:消息队列和发布订阅。消息队列的方式,有一个消费者池从服务器读取消息,每个消息最终都会被池中的某一个消费者消费。发布订阅方式,消息会广播给所有消费者。Kafka中充当消费者的是消费者组,它同时支持这两种模式。
消费者使用消费者组名订阅消息,每个发布给主题的消息都会发送给已订阅的消费者组中的一个消费者实例。消费者实例可以在独立的进程或独立的机器中。
如果所有的消费者都在一个消费者组中,那就如普通的消息队列对所有消费者做了负载均衡一样。
如果所有的消费者都在不同的消费者组中,结果就如发布订阅方式相同,消息被广播给所有的消费者。
相比这两种情况,更常见的是,每个主题都有少量消费者组作为逻辑订阅者。考虑到扩展和容错,每个组由多个消费者实例组成。其实,这只是订阅发布过程中的订阅方从单一变为了由消费者集群组成而已。

一个两台服务器的Kafka 集群分4个分段(P0-P3)带两个消费者组。消费者组A有两个消费者实例组B有4个。
Kafka 比传统消息系统在消息顺序的保障上更健壮。
传统的消息队列维持消息在服务器端有序,多个消费者从服务器端维持有序存储消息的队列中消费。虽然服务器端有序的维护消息,单消息被异步发送给消费者,于是消息难以有序的到达不同的消费者。这意味着在并行消费的过程中,消息的有序性被破坏了。消息系统通常处理这种情况是以独占消费的方式在单个过程中只允许从一个队列消费,只是这样就不能并发处理消息了。
Kafka 在这点上做的更好。主题内分区本身就带有并行的意味。Kafka 既可以保证消息的顺序又可以为消费者进程池做负载均衡。通过将主题中的分区分配给消费者组中的消费者可以做到每一个分区能准确的被消费者组中的一个消费者消费。通过这种方式,我们确保分区只能被一个消费者按顺序读取并消费。多个分区会均衡的负载给多个消费者实例。然而,值得注意的是,消费者实例不能比分区的数量多。
Kafka 只提供一个分区内消息的绝对顺序,而不是一个主题中不同分区的。分区通过索引结合KEY的方式提供分区数据来满足更多的应用。也就是说,想在一个主题内保证消息顺序,那就只能有一个分区,同时也意味着只能有一个消费者进程。
保证声明
Kafka 可以确保下列情况:
消息被生产者发送给特定的主题分区,然后会按照发送的顺序被加入分区中。
消费者实例按照存储也就是加入顺序获取到消息。
对于一个有N个节点的主题,可以支持宕掉N-1个服务器而不丢失任何被提交的信息。
更多保证信息会在文档的设计部分列出。
待续。。。
Kafka 文档引言的更多相关文章
- Kafka 文档用例
1.2 用例 以下是一些Kafka 常见的用例.关于功能方面的一些概念,可以看这篇博客:http://engineering.linkedin.com/distributed-systems/log- ...
- kafka文档(转)
来自:http://www.inter12.org/archives/842 一 BROKER 的全局配置 最为核心的三个配置 broker.id.log.dir.zookeeper.connect ...
- Kafka 技术文档
Kafka 技术文档 目录 1 Kafka创建背景 2 Kafka简介 3 Kafka好处 3.1 解耦 3.2 冗余 3.3 扩展性 3.4 灵活性 & 峰值处理能力 3.5 可恢复性 ...
- kafka单机部署文档
单机Kafka部署文档 最简单的使用方式,单机,使用自带的zookeeper 1.解压 下载地址:http://pan.baidu.com/s/1i4K2pXr tar –zxvf kafka_2.1 ...
- kafka集群搭建文档
kafka集群搭建文档 一. 下载解压 从官网下载Kafka,下载地址http://kafka.apache.org/downloads.html 注意这里最好下载scala2.10版本的kafka, ...
- 生成kafka内部请求与响应的接口文档
生成kafka内部请求与响应的接口文档 /** */ package com.code260.ss.kafka10demo; import java.io.File; import java.io.I ...
- 石墨文档Websocket百万长连接技术实践
引言 在石墨文档的部分业务中,例如文档分享.评论.幻灯片演示和文档表格跟随等场景,涉及到多客户端数据同步和服务端批量数据推送的需求,一般的 HTTP 协议无法满足服务端主动 Push 数据的场景,因此 ...
- 简体中国版文档的Markdown语法
Markdown文件 注意︰这是简体中国版文档的Markdown语法.如果你正在寻找英语版文档.请参阅Markdown︰ Markdown: Syntax. Markdown: Syntax 概述 哲 ...
- linkedin开源的kafka-monitor安装文档
linkedin开源的kafka-monitor安装文档 linkedin 开源的kafka-monitor的安装使用可以参考官方的readme:流程介绍的已经比较清楚,但是还是有一些地方需要修正.让 ...
随机推荐
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- 获取Canvas当前坐标系矩阵
前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
- jquery.Callbacks的实现
前言 本人是一个热爱前端的菜鸟,一直喜欢学习js原生,对于jq这种js库,比较喜欢理解他的实现,虽然自己能力有限,水平很低,但是勉勉强强也算是能够懂一点吧,对于jq源码解读系列,博客园里有很多,推荐大 ...
- PHP之用户验证和标签推荐的简单使用
本篇主要是讲解一些最简单的验证知识 效果图 bookmark_fns.php <?php require_once('output_fns.php'); require_once('db_fns ...
- JavaScript中事件处理
先看看下面一道题目,请评价以下代码并给出改进意见: if (window.addEventListener) {//标准浏览器 var addListener = function(el, type, ...
- 【读书】PHP程序员要读的书目(不断完善中)
本文地址 分享提纲: 1. PHP 2. Linux 3. Apache/Nginx 4. Mysql 5.设计模式/架构 6. 缓存并发 7. 其他语言 8. 代码基础 9. 大前端 10. 管理生 ...
- Toast显示图文界面——Android开发之路1
Toast的多种使用方法 Toast其实是一个功能特别强大的组件,不仅仅可以吐司一个文本内容,还可以吐司图片以及图文混排的界面.具体用法如下: 第一种:简单的纯文本内容的吐司: Toast.makeT ...
- 如何dos命令打开服务窗口?
1.输入services.msc点击<确定>进入服务窗口.如图: