Kafka 是主流的消息流系统,其中的概念还是比较多的,下面通过图示的方式来梳理一下 Kafka 的核心概念,以便在我们的头脑中有一个清晰的认识。

基础

Kafka 是一套流处理系统,可以让后端服务轻松的相互沟通,是微服务架构中常用的组件。

生产者消费者

生产者服务 Producer 向 Kafka 发送消息,消费者服务 Consumer 监听 Kafka 接收消息。

一个服务可以同时为生产者和消费者。

Topics 主题

Topic 是生产者发送消息的目标地址,是消费者的监听目标。

一个服务可以监听、发送多个 Topics。

Kafka 中有一个【consumer-group(消费者组)】的概念。

这是一组服务,扮演一个消费者。

如果是消费者组接收消息,Kafka 会把一条消息路由到组中的某一个服务。

这样有助于消息的负载均衡,也方便扩展消费者。

Topic 扮演一个消息的队列。

首先,一条消息发送了。

然后,这条消息被记录和存储在这个队列中,不允许被修改。

接下来,消息会被发送给此 Topic 的消费者。

但是,这条消息并不会被删除,会继续保留在队列中。

继续发送消息。

像之前一样,这条消息会发送给消费者、不允许被改动、一直呆在队列中。

(消息在队列中能呆多久,可以修改 Kafka 的配置)

Partitions 分区

上面 Topic 的描述中,把 Topic 看做了一个队列,实际上,一个 Topic 是由多个队列组成的,被称为【Partition(分区)】。

这样可以便于 Topic 的扩展。

生产者发送消息的时候,这条消息会被路由到此 Topic 中的某一个 Partition。

消费者监听的是所有分区。

生产者发送消息时,默认是面向 Topic 的,由 Topic 决定放在哪个 Partition,默认使用轮询策略。

也可以配置 Topic,让同类型的消息都在同一个 Partition。

例如,处理用户消息,可以让某一个用户所有消息都在一个 Partition。

例如,用户1发送了3条消息:A、B、C,默认情况下,这3条消息是在不同的 Partition 中(如 P1、P2、P3)。

在配置之后,可以确保用户1的所有消息都发到同一个分区中(如 P1)。

这个功能有什么用呢?

这是为了提供消息的【有序性】。

消息在不同的 Partition 是不能保证有序的,只有一个 Partition 内的消息是有序的。

架构

Kafka 是集群架构的,ZooKeeper是重要组件。

ZooKeeper 管理者所有的 Topic 和 Partition。

Topic 和 Partition 存储在 Node 物理节点中,ZooKeeper负责维护这些 Node。

例如,有2个 Topic,各自有2个 Partition。

这是逻辑上的形式,但在 Kafka 集群中的实际存储可能是这样的:

Topic A 的 Partition #1 有3份,分布在各个 Node 上。

这样可以增加 Kafka 的可靠性和系统弹性。

3个 Partition #1 中,ZooKeeper 会指定一个 Leader,负责接收生产者发来的消息。

其他2个 Partition #1 会作为 Follower,Leader 接收到的消息会复制给 Follower。

这样,每个 Partition 都含有了全量消息数据。

即使某个 Node 节点出现了故障,也不用担心消息的损坏。

Topic A 和 Topic B 的所有 Partition 分布可能就是这样的:

感谢阅读,希望对你有所帮助 :)

翻译整理自:

https://timothystepro.medium.com/visualizing-kafka-20bc384803e7

精彩文章推荐

梁鑫:美股交易架构实践

2021-04-26

数据中台:企业数据质量参差不齐?听听专家怎么说

2021-04-22

王启军:云原生架构下如何拆分微服务?

2021-04-20

原创精华:剖析亿级请求下的多级缓存

2021-04-19

ThoughtWorks专家:使用 DDD 指导微服务拆分的逻辑

2021-04-15

梁鑫:重构 - 在美股行情系统的实践

2021-04-09

浅谈架构:架构的缘起与目标

2021-04-07

Jartto: 如何成为一名合格的技术面试官?

2021-04-06

Francisco: 构建前瞻性应用架构的优秀实践

2021-03-31

代码重构技巧宝典,学透本篇就足够了!

2021-04-27

图解 Kafka,看本篇就足够啦相关推荐

  1. 掌握 Kafka,看这篇就足够了

    Apache Kafka 是一个快速.可扩展的.高吞吐的.可容错的分布式"发布-订阅"消息系统, 使用 Scala 与 Java 语言编写,能够将消息从一个端点传递到另一个端点.较 ...

  2. Flink面试,看这篇就足够了

    概述 2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flink 分支版本)开源,大数据领域一夜间从 Spark 独步天下走向了两强争霸的时代.Fl ...

  3. spring版本 jdk8_从JDK8升级到JDK11,看这篇就足够了

    原文地址:https://blog.codefx.org/java/java-11-migration-guide/. 在原文的基础上,增加了一些我遇到的具体的坑还有在特定场景下的解决方案,供大家参考 ...

  4. 深入理解JVM虚拟机13:JVM面试题,看这篇就足够了(87题详解)

    1.java中会存在内存泄漏吗,请简单描述. 会.自己实现堆载的数据结构时有可能会出现内存泄露,可参看effective java. 2.64 位 JVM 中,int 的长度是多数? Java 中,in ...

  5. 简历中的项目到底该如何写?面试中该如何介绍项目?看这篇就足够了

    简历中的那些项目 原文 前言 前几天有人私信问我,说项目这块没啥亮眼的地方,感觉面试官没啥可问的,就直接让他写算法了.后来看群里的问题有很多很相似,那么我抽时间和几位大佬聊了下,在他们面试候选人的过程 ...

  6. Java基础看这篇就足够用了(基础知识汇总)

    文章目录 第一章.java环境搭建 1.1.Java介绍 1.1.1. Java开发平台 1.1.2. Java开发环境搭建 1.1.3 .Java专业术语 1.1.4. 第一个Java程序 1.1. ...

  7. JVM面试题,看这篇就足够了(87题详解)

    文章目录 1.java中会存在内存泄漏吗,请简单描述. 2.64 位 JVM 中,int 的长度是多数? 3.Serial 与 Parallel GC 之间的不同之处? 4.32 位和 64 位的 J ...

  8. java 后端校验_如何实现Java后端数据校验?看这篇就足够!

    前言 每次我们在搭建一个开源项目的首要任务包括:项目的统一异常处理.统一结果封装以及做项目的数据校验,在前后端分离的情况下,不仅前端需要做数据校验,同样后端也要实现,前端主要使用一些类似与jQuery ...

  9. 什么是UID、UED、UXD、IXD、UCD、IAD,看这篇就足够了

    文章目录 UID: User Interface Design 用户界面设计 UI:User Interface(用户界面) UID(用户界面设计师) UID认知现状 UED: User Experi ...

最新文章

  1. oracle 关闭audit,关于Oracle审计(audit)
  2. html section 布局,section标签的用法
  3. 【LeetCode笔记】剑指 Offer 38. 字符串的排列(Java、字符串、DFS)
  4. c语言割线法解非线性方程,用割线法解非线性方程组.doc
  5. Golang 25 个保留关键字
  6. “康园圈--互联网+校园平台“项目之拓展手机客户端
  7. (转)今天的人工智能比肩工业革命毫不夸张
  8. RAKE接收技术基础知识
  9. 854. 相似度为 K 的字符串(每日一难phase2--day20)
  10. linux ui 布局管理器,第1组UI组件:布局管理器
  11. echarts地图闪烁点大小设置
  12. 中英文代码对比之ZLOGO 4 LOGO
  13. Linux c线程间的同步----互斥锁、条件变量、信号量
  14. 安装opencv3.4遇到Download: opencv_ffmpeg.dll、ippicv等失败的解决方法
  15. Win10去除快捷方式的小箭头
  16. 万能码,你的启明星(安全扫码专业委员会)
  17. 14_Elasticsearch 内部原理详细解析(上篇)
  18. PYNQ实现HDMI输出显示图片
  19. 谷粒商城_01_环境搭建
  20. PHP 字符串分割 explode 与 str_split 函数

热门文章

  1. JAVA xml转dom_如何在Java中将String转换为DOMSource?
  2. fastreport dll_报表如何连接到VistaDB嵌入式数据库?FastReport.Net轻松搞定
  3. 如何根据接口写一个客户端进行发单测试?
  4. Linux 多线程编程使用pthread_creat()函数条件
  5. (计算机组成原理)第二章数据的表示和运算-第三节1:浮点数的表示
  6. shell获取执行脚本路径
  7. Redis 如何实现主从复制
  8. Red Hat Enterprise Linux (RHEL) 6.4 DVD ISO 迅雷下载地址
  9. spark-sql createOrReplaceTempView 和createGlobalTempView区别
  10. 第三章:选择结构(一)