原文地址:http://blog.csdn.net/honglei915/article/details/37564521

介绍

Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能。但具有自己独特的设计。这个独特的设计是什么样的呢?

首先让我们看几个主要的消息系统术语:
  • Kafka将消息以topic为单位进行归纳。
  • 将向Kafka topic公布消息的程序成为producers.
  • 将预订topics并消费消息的程序成为consumer.
  • Kafka以集群的方式执行,能够由一个或多个服务组成,每一个服务叫做一个broker.

producers通过网络将消息发送到Kafka集群,集群向消费者提供消息,例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9uZ2xlaTkxNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

client和服务端通过TCP协议通信。

Kafka提供了Javaclient,而且对多种语言都提供了支持。

Topics 和Logs

先来看一下Kafka提供的一个抽象概念:topic.
一个topic是对一组消息的归纳。对每一个topic。Kafka 对它的日志进行了分区。例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9uZ2xlaTkxNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

每一个分区都由一系列有序的、不可变的消息组成,这些消息被连续的追加到分区中。

分区中的每一个消息都有一个连续的序列号叫做offset,用来在分区中唯一的标识这个消息。


在一个可配置的时间段内。Kafka集群保留全部公布的消息,无论这些消息有没有被消费。比方,假设消息的保存策略被设置为2天,那么在一个消息被公布的两天时间内,它都是能够被消费的。之后它将被丢弃以释放空间。Kafka的性能是和数据量无关的常量级的,所以保留太多的数据并非问题。

实际上每一个consumer唯一须要维护的数据是消息在日志中的位置。也就是offset.这个offset有consumer来维护:普通情况下随着consumer不断的读取消息,这offset的值不断添加,但事实上consumer能够以随意的顺序读取消息。比方它能够将offset设置成为一个旧的值来重读之前的消息。


以上特点的结合,使Kafka consumers很的轻量级:它们能够在不正确集群和其它consumer造成影响的情况下读取消息。

你能够使用命令行来"tail"消息而不会对其它正在消费消息的consumer造成影响。


将日志分区能够达到下面目的:首先这使得每一个日志的数量不会太大,能够在单个服务上保存。另外每一个分区能够单独公布和消费。为并发操作topic提供了一种可能。

分布式

每一个分区在Kafka集群的若干服务中都有副本,这样这些持有副本的服务能够共同处理数据和请求,副本数量是能够配置的。副本使Kafka具备了容错能力。

每一个分区都由一个server作为“leader”,零或若干server作为“followers”,leader负责处理消息的读和写。followers则去复制leader.假设leader down了,followers中的一台则会自己主动成为leader。集群中的每一个服务都会同一时候扮演两个角色:作为它所持有的一部分分区的leader,同一时候作为其它分区的followers。这样集群就会据有较好的负载均衡。

Producers

Producer将消息公布到它指定的topic中,并负责决定公布到哪个分区。通常简单的由负载均衡机制随机选择分区,但也能够通过特定的分区函数选择分区。使用的很多其它的是另外一种。

Consumers

公布消息通常有两种模式:队列模式(queuing)和公布-订阅模式(publish-subscribe)。

队列模式中,consumers能够同一时候从服务端读取消息,每一个消息仅仅被当中一个consumer读到;公布-订阅模式中消息被广播到全部的consumer中。

Consumers能够增加一个consumer 组。共同竞争一个topic。topic中的消息将被分发到组中的一个成员中。同一组中的consumer能够在不同的程序中,也能够在不同的机器上。假设全部的consumer都在一个组中。这就成为了传统的队列模式,在各consumer中实现负载均衡。

假设全部的consumer都不在不同的组中,这就成为了公布-订阅模式。全部的消息都被分发到全部的consumer中。

更常见的是。每一个topic都有若干数量的consumer组,每一个组都是一个逻辑上的“订阅者”。为了容错和更好的稳定性,每一个组由若干consumer组成。这事实上就是一个公布-订阅模式,仅仅只是订阅者是个组而不是单个consumer。

由两个机器组成的集群拥有4个分区 (P0-P3) 2个consumer组. A组有两个consumerB组有4个

相比传统的消息系统,Kafka能够非常好的保证有序性。

传统的队列在server上保存有序的消息,假设多个consumers同一时候从这个server消费消息,server就会以消息存储的顺序向consumer分发消息。尽管server按顺序公布消息。可是消息是被异步的分发到各consumer上。所以当消息到达时可能已经失去了原来的顺序,这意味着并发消费将导致顺序错乱。为了避免故障,这种消息系统通常使用“专用consumer”的概念,事实上就是仅仅同意一个消费者消费消息,当然这就意味着失去了并发性。


在这方面Kafka做的更好,通过分区的概念,Kafka能够在多个consumer组并发的情况下提供较好的有序性和负载均衡。将每一个分区分仅仅分发给一个consumer组。这样一个分区就仅仅被这个组的一个consumer消费,就能够顺序的消费这个分区的消息。由于有多个分区,依旧能够在多个consumer组之间进行负载均衡。注意consumer组的数量不能多于分区的数量。也就是有多少分区就同意多少并发消费。


Kafka仅仅能保证一个分区之内消息的有序性,在不同的分区之间是不能够的,这已经能够满足大部分应用的需求。

假设须要topic中订购的所有消息。然后,只需让这种topic只有一个分区,当然,它只有一个consumer集团消费它。



漫游Kafka介绍章节简介的更多相关文章

  1. [转帖]kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建 http://www.aboutyun.com/thread-9341-1-1.html 还没看完 感觉挺好的. 问题导读: 1.zook ...

  2. Apache Kafka - 介绍

    原文地址地址: http://blogxinxiucan.sh1.newtouch.com/2017/07/12/Apache-Kafka-介绍/ Apache Kafka教程 之 Apache Ka ...

  3. 1、Kafka介绍

    1.Kafka介绍 1)在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 2)Kafka是一个分布式消息队列. 3)Kafka对消息保存时根据Topic进行归类, ...

  4. [转]kafka介绍

    转自 https://www.cnblogs.com/hei12138/p/7805475.html kafka介绍 1.1. 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台 ...

  5. Kafka介绍及安装部署

    本节内容: 消息中间件 消息中间件特点 消息中间件的传递模型 Kafka介绍 安装部署Kafka集群 安装Yahoo kafka manager kafka-manager添加kafka cluste ...

  6. kafka介绍与搭建(单机版)

    一.kafka介绍 1.1 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and subscribe to ...

  7. kafka介绍及安装配置(windows)

    Kafka介绍 Kafka是分布式的发布—订阅消息系统.它最初由LinkedIn(领英)公司发布,使用Scala和Java语言编写,与2010年12月份开源,成为Apache的顶级项目.Kafka是一 ...

  8. 一、kafka 介绍 && kafka-client

    一.kafka 介绍 1.1.kafka 介绍 Kafka 是一个分布式消息引擎与流处理平台,经常用做企业的消息总线.实时数据管道,有的还把它当做存储系统来使用. 早期 Kafka 的定位是一个高吞吐 ...

  9. Kafka 探险 - 架构简介

    Kafka 探险 - 架构简介 这个 Kafka 的专题,我会从系统整体架构,设计到代码落地.和大家一起杠源码,学技巧,涨知识.希望大家持续关注一起见证成长! 我相信:技术的道路,十年如一日!十年磨一 ...

随机推荐

  1. Swift - 判断设备类型开发兼容的iOS应用(iPad使用分隔视图控制器)

    1,分割视图控制器(UISplitViewController) 在iPhone应用中,使用导航控制器由上一层界面进入下一层界面. 但iPad屏幕较大,通常使用SplitViewController来 ...

  2. C++开源代码项目汇总

    Google的C++开源代码项目 v8  -  V8 JavaScript EngineV8 是 Google 的开源 JavaScript 引擎.V8 采用 C++ 编写,可在谷歌浏览器(来自 Go ...

  3. premake 在64位Ubuntu系统下编译32位GCC程序

    首先,要安装GCC 4.8, 参考前文:Ubuntu 12.04 & 13.04 安装 GCC4.8.1 其中,重点是安装multilib apt-get install gcc-4.8-mu ...

  4. POJ 2991 Crane(线段树+计算几何)

    POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...

  5. 初窥Linux 之 区分硬连接和软连接

    一.Linux下的两种连接文件及创建方式 在Linux下面的连接文件有两种——软连接和硬连接,虽然都是连接文件,但两者却有很大的区别.一种是类似于Windows的快捷方式功能的文件(或目录),这种连接 ...

  6. Github干货系列:C++资源集合-

    Awesome CPP,这又是一个 Awesome XXX 系列的资源整理,由 fffaraz 发起和维护.内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. ...

  7. [Android学习笔记]Canvas的使用

    Canvas文档 http://developer.android.com/training/index.html 在绘制view时候,重写onDraw(canvas)方法,可能需要在canvas上绘 ...

  8. sql连接错误(Microsoft SQL Server,错误:2)

    昨天用SQL语句建表的时候写了一段代码,对于代码的逻辑和内容我不太肯定对不正确.反正是毫不犹豫的让它运行了,过程中出现好几个错误,当时没有太在意,想着大不了出错了再重写一个.结果--玩坏了,从昨天到如 ...

  9. Hadoop大数据面试--Hadoop篇

    本篇大部分内容參考网上,当中性能部分參考:http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performanc ...

  10. 使用xml和java代码混合控制UI界面

    main.xml.................... <?xml version="1.0" encoding="utf-8"?> <Li ...