一图流思维导图kafka (出现背景/ 核心概念/Kafka的集群架构/优秀架构思考-总结高并发高可用高性能/实际应用)

Posted alwarse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一图流思维导图kafka (出现背景/ 核心概念/Kafka的集群架构/优秀架构思考-总结高并发高可用高性能/实际应用)相关的知识,希望对你有一定的参考价值。

参照 大白话 kafka 架构原理

kafka消息队列

出现背景

解耦合

异步处理

  • 秒杀活动

    • 1: 风险控制 、2: 库存锁定 、3: 生成订单 、4: 短信通知 、5: 更新数据

通过消息系统将秒杀活动业务拆分开

将不急需处理的业务放在后面慢慢处理

  • 秒杀活动

    • 1: 风险控制 、2: 库存锁定 、3: 消息系统 、4: 生成订单 、5: 短信通知 、6: 更新数据

流量的控制

    1. 网关在接受到请求后,就把请求放入到消息队列里面
  • 2.后端的服务从消息队列里面获取到请求,完成后续的秒杀处理流程。然后再给用户返回结果
  • 优点:控制了流量 缺点:会让流程变慢

核心概念

生产者

  • Producer 往Kafka集群生成数据

消费者

  • Consumer 往Kafka里面去获取数据,处理数据、消费数据 Kafka的数据是由消费者自己去拉去Kafka里面的数据

主题

  • topic

分区

  • partition 默认一个topic有一个分区(partition),自己可设置多个分区(分区分散存储在服务器不同节点上)

Kafka的集群架构

broker

  • 一个kafka服务器就是一个broker

partition

  • Topic只是逻辑上的概念,partition在磁盘上就体现为一个目录。

Consumer Group

  • 消费组 消费数据的时候,都必须指定一个group id,指定一个组的id假定程序A和程序B指定的group id号一样,那么两个程序就属于同一个消费组。

  • 特殊:

    • 同一个消费者成员,只有一个能消费topic
    • 同一个topic,重新指定一个group id号以后,可以消费
    • 不同消费组之间没有影响,消费组需自定义,消费者名称程序自动生成(独一无二)

Controller

  • Kafka节点里面的一个主节点,借助zookeeper。

kafka写数据

  • 顺序写(追加写)

    • 保证写数据性能

零拷贝机制

  • 消费者读取数据流程:

    • 消费者发送请求给kafka服务
    • kafka服务去os cache缓存读取数据(缓存没有就去磁盘读取数据)
    • 从磁盘读取了数据到os cache缓存中
    • os cache复制数据到kafka应用程序中
    • kafka将数据(复制)发送到socket cache中
    • socket cache通过网卡传输给消费者
  • linux sendfile技术

    • 1.消费者发送请求给kafka服务
    • 2.kafka服务去os cache缓存读取数据(缓存没有就去磁盘读取数据)
    • 3.从磁盘读取了数据到os cache缓存中
    • 4.os cache直接将数据发送给网卡
    • 5.通过网卡将数据传输给消费者

Kafka日志分段保存

  • topic_a

    • 三个分区

      • 服务器1

        • 目录topic_a-0

          • kafka数据就是message

          • 数据存储在log文件里

            • .log结尾的就是日志文件
            • 在kafka中把数据文件就叫做日志文件
          • (分段存储)

            • 一个分区下面默认有n多个日志文件

              • 一个日志文件默认1G
      • 服务器2

        • 目录topic_a-1
      • 服务器3

        • 目录topic_a-2:

Kafka二分查找定位数据

  • 一条消息就有两个位置

    • offset:相对偏移量(相对位置)

      • 存在物理磁盘上面,在position Position
    • position:磁盘物理位置

  • 稀疏索引

    • kafka每当写入了4k大小的日志(.log),就往index里写入一个记录索引。其中会采用二分查找。

高并发网络设计

  • NIO

    • Reactor网络设计模式

Kafka冗余副本保证高可用

  • 创建主题时,可以指定分区,也可以指定副本个数

  • 副本是有角色的:leader partition

    • 1、写数据、读数据操作都是从leader partition去操作的。
    • 2、会维护一个ISR(in-sync- replica )列表,但是会根据一定的规则删除ISR列表里面的值
  • 生产者发送消息流程

    • 消息首先要写入到leader partition中
    • 写完了以后,还要把消息写入到ISR列表里面的其它分区,写完后才算这个消息提交
    • follower partition:从leader partition同步数据

优秀架构思考-总结

高并发、高可用、高性能

  • 高可用:多副本机制

  • 高并发:网络架构设计

    • 三层架构:多selector -> 多线程 -> 队列的设计(NIO)
  • 高性能:

    • 写数据

      • 把数据先写入到OS Cache
      • 写到磁盘上面是顺序写,性能很高
    • 读数据:

      • 根据稀疏索引,快速定位到要消费的数据
      • 零拷贝机制 减少数据的拷贝 减少了应用程序与操作系统上下文切换

实际应用

coordinator

  • 每个consumer group都会选择一个broker作为自己的coordinator

  • 他是负责监控这个消费组里的各个消费者的心跳,以及判断是否宕机,然后开启rebalance的

  • 运行流程

    • 1)每个consumer都发送JoinGroup请求到Coordinator
    • 2)然后Coordinator从一个consumer group中选择一个consumer作为leader
    • 3)把consumer group情况发送给这个leader
    • 4)接着这个leader会负责制定消费方案
    • 5)通过SyncGroup发给Coordinator
    • 6)接着Coordinator就把消费方案下发给各个consumer
    • 他们会从指定的分区的 leader broker开始进行socket连接以及消费消息

Rebalance

  • consumer group靠coordinator实现了Rebalance

  • 策略

    • range

      • range策略就是按照partiton的序号范围

        • p0~3 consumer1
        • p4~7 consumer2
        • p8~11 consumer3
    • round-robin

      • 轮询分配

        • consumer1: 0,3,6,9
        • consumer2:1,4,7,10
    • sticky

      • 尽可能保证在rebalance的时候,让原本属于这个consumer 的分区还是属于他们,然后把多余的分区再均匀分配过去,这样尽可能维持原来的分区分配的策略

        • consumer1:0-3 consumer2: 4-7 consumer3: 8-11
        • 假设consumer3挂了
        • consumer1:0-3,+8,9 consumer2: 4-7,+10,11

controller如何管理整个集群

  • 1: 竞争controller的 /controller/id
  • 2:controller服务监听的目录:/broker/ids/ 用来感知 broker上下线 /broker/topics/ 创建主题,我们当时创建主题命令,提供的参数,ZK地址。
  • /admin/reassign_partitions 分区重分配 ……

时间轮机制

延时任务

Broker管理

  • LEO

    • 在kafka里面,无论leader partition还是follower partition统一都称作副本(replica)。
    • 每次partition接收到一条消息,都会更新自己的LEO,也就是log end offset,LEO其实就是最新的offset + 1
  • HW

    • 高水位 LEO有一个很重要的功能就是更新HW,如果follower和leader的LEO同步了,此时HW就可以更新 HW之前的数据对消费者是可见,消息属于commit状态。HW之后的消息消费者消费不到。

其他

  • Kafka的核心原理
    如何去评估一个集群资源
    搭建了一套kafka集群 -》 介绍了简单的一些运维管理的操作。
    生产者(使用,核心的参数)
    消费者(原理,使用的,核心参数)
    broker内部的一些原理

XMind - Trial Version

.NET 设计模式总结,带思维导图背景说明,赶紧收藏

    背景说明

           以前都在匆匆忙忙写代码,在无穷无尽的需求中间左冲右突,最近终于有一些闲暇的时间,来总结和思考编程中的一些核心思想,磨刀不误砍柴的功夫,期望通过总结和学习,能够在编程设计上能够有更进一步的提升。

    回看设计模式

           这些设计模式,都来源于生活,都是将生活中一些实际场景,应用在编程当中,以解决编程当中遇到的不同问题,使得思路更容易理解、更方便阅读。如果我们是一个对编程有想法、遇到过实际难题的人,我们或许也能设计出属于自己的“设计模式”!

           还是先发个照,纪念一下归纳出23种设计模式的四位前辈。在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。
           ▣ 对接口编程而不是对实现编程。
           ▣ 优先使用对象组合而不是继承。

           下面是25种设计模式的特征、类型、应用场景等,之所以列出英文,因很多情况下,看到英文,就能联想到自己见过的一些类:

  • 设计模式的分类

    • 1.3.行为型

    • 1.3.1.策略模式(Strategy Pattern)
      应用场景:
      应用实例:

      1.3.2.模板模式(Template Pattern)
      应用场景:
      应用实例:

      1.3.3.观察者模式(Observer Pattern)
      应用场景:
      应用实例:

      1.3.4.迭代器模式(Iterator Pattern)
      应用场景:
      应用实例:

      1.3.5.责任链模式(Chain of Responsibility Pattern)
      应用场景:
      应用实例:

      1.3.6.命令模式(Command Pattern)
      应用场景:
      应用实例:

      1.3.7.备忘录模式(Memento Pattern)
      应用场景:
      应用实例:

      1.3.8.状态模式(State Pattern)
      应用场景:
      应用实例:

      1.3.9.访问者模式(Visitor Pattern)
      应用场景:
      应用实例:

      1.3.10.中介者模式(Mediator Pattern)
      应用场景:
      应用实例:

      1.3.11.解释器模式(Interpreter Pattern)
      应用场景:
      应用实例:

      1.3.12.空对象模式(Null Object Pattern)
      应用场景:
      应用实例:

    • 1.2.结构型

    • 1.2.1.适配器模式(Adapter Pattern)
      场景:
      实例:

      1.2.2.装饰器模式(Decorator Pattern)
      应用场景:
      应用实例:

      1.2.3.代理模式(Proxy Pattern)
      应用场景:
      应用实例:

      1.2.4.外观模式(Facade Pattern)
      应用场景:
      应用实例:

      1.2.5.桥接模式(Bridge Pattern)
      应用场景:
      应用实例:

      1.2.6.组合模式(Composite Pattern)
      应用场景:
      应用实例:

      1.2.7.享元模式(Flyweight Pattern)
      应用场景:
      应用实例:

      1.2.8.过滤器模式(Filter Pattern)
      应用场景:
      应用实例:

    • 1.1.创建型设计模式

    • 1.1.1.单例模式(Singleton Pattern)
      特征:
      全局只有一个实例
      必须自己创建自己的唯一实例
      类型:
      懒汉式
      饿汉式
      双检锁
      登记式

      1.1.2.工厂模式(Factory Pattern) 类型:
      简单工厂模式
      .NET 设计模式总结,带思维导图、背景说明,赶紧收藏
      工厂方法模式
      .NET 设计模式总结,带思维导图、背景说明,赶紧收藏
      抽象工厂模式
      .NET 设计模式总结,带思维导图、背景说明,赶紧收藏

      场景:
      创建相似对象
      角色
      AbstractFactory:抽象工厂角色
      ConcreteFactory:具体工厂角色
      AbstractProduce:抽象产品角色
      ConcreteProduce:具体产品角色
      区别:用生产鼠标作例子,试图理解其区别
      简单工厂模式
      产品清单:本厂专业生产罗技品牌的有线鼠标、机械鼠标,欢迎随时预定
      客户需求:
      客户:我要罗技机械鼠标
      工厂:好的,我有现成的
      三个月后...
      客户:我要罗技无线鼠标
      工厂:也可以,我先改造我的生产技术和设备先....
      设备升级中...
      工厂:好了,现在我能生产罗技品牌的有线鼠标、机械鼠标、无线鼠标,有需要随时找我
      客户:不好意思,我想再要一批罗技智能鼠标
      工厂:......
      工厂方法模式
      产品清单:我们提供罗技鼠标和双飞燕鼠标的专业生产能力,下属两个大厂,一个厂专门生产罗技鼠标,一个厂专门生产双飞燕鼠标
      客户需求:
      客户:我要罗技鼠标
      我:好的,我让罗技工厂做好后发货给你
      客户:我要双飞燕鼠标
      我:好的,我让双飞燕工厂马上进行生产
      客户:我要雷蛇鼠标
      我:......好的,我先去贷款建个厂先...
      抽象工厂模式
      产品清单:我厂提供双飞燕鼠标、键盘等双飞燕旗下产品的委托生产制造
      客户需求:
      客户:我要双飞燕鼠标
      工厂:好的,我联系双飞燕工厂,做完后发货过来
      客户:我要双飞燕键盘
      工厂:好的,我联系双飞燕工厂,做完后发货过来
      客户:我要罗技音响
      工厂:不好意思,我们暂时和罗技厂商那边还没有取得合作关系,不过我有双飞燕生产的音响,您需要吗?
      客户:不,我就要罗技音响....
      工厂:额...我们后期也会考虑和罗技进行合作的
      客户:你们没有办法自己生产罗技音响吗?
      工厂:抱歉,我们只是抽象工厂,没有实际的产能,只能联系实体工厂那边进行生产的

      1.1.3.建造者模式(Builder Pattern)
      类图:
      .NET 设计模式总结,带思维导图、背景说明,赶紧收藏
      场景:创建复杂对象
      角色:
      Director:指挥者
      Client:客户端
      ConcreteBuilder:建造者
      Product:产品
      实例:
      比如StringBuilder,参考StringBuilder与建造者模式
      有一些编译器,也以Builder来命名,比如C++ Builder、PowerBuilder,由程序员指挥编译器,经过复杂的过程,生成编译文件。

      1.1.4.原型模式(Prototype Pattern)
      类图:
      .NET 设计模式总结,带思维导图、背景说明,赶紧收藏
      场景:
      创建重复的对象,同时又能保证性能(安全执行 + 深度复制 + 快速反馈)
      当直接创建对象的代价比较大时,则采用这种模式
      角色:
      客户(Client):客户类提出创建对象的请求。
      抽象原型(Prototype):规定拷贝接口。
      具体原型(Concrete Prototype):被拷贝的对象。

  • 思维导图 

  • 后记

  • 源码下载及图片出处说明

    Github .NET 源码例子,会持续进行更新

       Github:https://github.com/xiangaylian/augusthigos


    类图摘自于简书作者Whyn的系列文章中。

    思维导图是我自己所画,转载请注明出处。

  • 作者声明

    文章主要是我自己学习设计模式的总结,也期望给正在学习的伙伴带来帮助,不足之处,感谢留言指正。
    文章与源码例子会持续于本文中和Github仓库进行更新,仅此一篇,不会另写系列文章。


出处:https://www.cnblogs.com/anylian/p/13293742.html


以上是关于一图流思维导图kafka (出现背景/ 核心概念/Kafka的集群架构/优秀架构思考-总结高并发高可用高性能/实际应用)的主要内容,如果未能解决你的问题,请参考以下文章

一图流简单的时间序列分析工具

《麦肯锡方法》第11章 用图表说明问题-思维导图

《麦肯锡方法》第11章 用图表说明问题-思维导图

脑图和思维导图的区别是啥?

.NET 设计模式总结,带思维导图背景说明,赶紧收藏

25 RocketMQ原理思维导图与扩展思考