简单谈谈对云原生领域mq组件kafka的理解

隐风 隐风     2022-12-05     435

关键词:

1. 定义:

kafka具备大吞吐量,内置分区,可以进行数据备份,同时具备数据容错性的消息系统。

kafka主要特点体现如下:

  1. Kafka可以完成在线或者离线数据消费,所谓离线数据消费实际上就是kafka将消息数据保留在磁盘上。
  2. kafka会做数据备份,防止节点宕机从而导致数据丢失。
  3. 和spark产品的整合性非常好,可以完成实时的流式大数据分析
  4. 理论上,kafka的节点可以无限扩容

2. 消息系统:

定义

  1. 将数据从一个应用程序传递到另一个应用程序,通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
  2. 分布式系统利用消息系统,在多应用之间进行高效、稳定、安全的数据传递。
  3. 应用场景有跨系统数据传递、高并发流量削峰、数据异步处理。

两种消息模式:

  1. 点对点:若干个生产和消费者,处理队列当中的数据,一旦该数据被消费,则从队列当中被移除。(多线程:生产消费者模型)
  2. 发布-订阅:消息是被保留在主题当中,消费者一个消费一个或者若干个主题当中的消息

3. kafka的一些概念

1. 术语:

术语术语
Topics(主题)Kafka Cluster(Kafka集群)
Partition(分区)Producers(生产者)
Partition offset(分区偏移)Consumers(消费者)
Replicas of partition(分区备份)Leader(领导者)
BrokersFollower(追随者)

2. 发布和订阅的流程

  1. 生产者向topic当中提交消息,Brokers将topic当中的数据在对应的分区当中依次保存;
  2. 消费者向Brokers请求获取消息,Brokers向消费者提供偏移量,消费者根据偏移量要求获取消息。
  3. 消费者排队的前提,消费者数量大于分区数量
  4. 同一个消费者组内的消息不会重复消费。

3. 生产者:

主要是消息提供者,根据业务需要往指定的topic推消息,一般也俗称为消息的上游。

4. 消费者:

  1. 要指定消费者的分组:默认情况下,分组是test
  2. 消费者可以同时消费若干个topic:
    1. 消息是已key-value格式进行发送
    2. 每个key如果重复发送,其偏移量会递增
    3. 新key的偏移量从0开始
  3. 消费者要放在一个独立的线程当中,才能始终处于消费状态
  4. Spring是没有办法直接给线程当中进行依赖注入的
  5. 消费者的线程如果要通知其他的任务执行,需要从Spring的bean当中获取相关的业务对象

5. kafka写消息的路由策略

  1. 如果指定分区:直接使用分区进行路由
  2. 指定了key,但是没有指定分区,那么会对key进行hash运算,通过运算的值得到一个分区
  3. 如果都没指定,那么会轮询写入一个分区

6. kafka写硬盘:

  1. 传统写硬盘是随机写
  2. kafka是顺序写硬盘,是随机写硬盘速度的6000倍
  3. 写数据的流程
    1. 首先找到leader
    2. 将消息写入leader的日志文件
    3. Followers(包含ISR中的成员,也包含不在ISR中的成员)会同步leader当中的消息,同步完以后会向leader发送一个ACK确认。
    4. leader在接收到isr所有成员的ACK确认后,正式提交commit保存

7. kafka的消息安全策略:

  1. 默认是保证一定成功(同步)
  2. 不重复发送,不保证成功(异步)

8. kafka的备份:

  1. 备份是由分区来创建的
  2. 一个分区有1个leader和0-n个follower,只要leader不宕机,所有的follower都宕机了也不影响读写。follower只负责数据备份,不负责数据读写。

9. Kafka的isr:

  1. 同步备份:保证isr集合当中至少存活一个,如果leader不挂,正常提供服务,如果leader挂了,重新选leader然后提供服务;每个分区都有自己的isr
    1. 备份的算法:
    1. 分区:分区编号,取余代理数量 (p_i mod b_num)
    2. 备份:分区编号 + 备份编号之和, 取余 代理数量(p_i+r_j) mod b_num
  2. 判定存活:配置延时replica.log.max.messages,replica.log.time.max.ms来判定是否宕机
  3. kafka如何解决zookeeper的压力的
    1. Kafka有容器机制
    2. 每一个代理会创建一个新的容器
    3. 容器负责维护leader的读写,和选举
  4. leader是在zk上竞争创建节点来获取leader资格,如果leader宕机,选举策略是所有的follower(ISR当中保存的成员)重新竞争创建节点,获取leader资格;容器会记录新的leader,并保持
  5. 如果所有的ISR成员都死亡:
    1. 等待ISR成员任意一个苏醒,但是这个过程是不可控的
    2. 默认:只要有一个不是isr的成员存活,把这个作为新的leader。但是并不能保证这个成员是否数据和原本leader数据一致。

10. kafka的数据保存:

  1. Kafka的日志分为两种,一种是运行日志;还有一种是用于保存消息的日志;
  2. 一个分区对应日志当中的一个目录
    1. 索引文件
    2. 数据文件
      1. 数据长度
      2. 数据类型
      3. 时间戳
      4. 偏移量
      5. Key
      6. Value
      7. 头信息
    3. 数据保留策略
      1. 时间:
      2. 大小:
      3. 注意:清理数据对kafka的读写没有任何影响
      4. Kafka是在硬盘磁道上进行顺序读写,所以性能和文件大小没有任何关系

11. topic的创建和删除流程:

  1. 创建topic,是首先获取代理的ids,然后将这些ids组成一个isr,作为一个新的容器
  2. 删除topic:
    1. 默认情况下delete.topic.enable=false;也就是被删除的节点会被移入zk的这个节点/admin/delete_topics
    2. 要彻底删除
    1. delete.topic.enable=true:一旦删除,容器会清空在/admin/delete_topics节点上的监听
    2. auto.create.topics.enable=false:自动创建主题,如果他为true,那么只要还有一个用户在往这个主题当中写消息,这个主题就不会真正被删除。即便是你已经删了,他依然还会创建一个出来。

谈谈我对云原生的理解

这里我不想再引用Pivotal的MattStine的定义,只是想从个人角度思考一下什么是云原生。云原生是啥?在我看来是一套思想,一套完整的方法论和体系。是不是太虚了,的确,云原生就是一套指导意见。它主要有... 查看详情

谈谈我对云原生与软件供应链安全的思考(代码片段)

2011年,互联网技术先驱MarcAndreessen宣称,软件正在吞噬世界(Softwareiseatingtheworld)。由软件驱动的行业创新正在颠覆着传统业务模式,推动着全球经济实现数字化连接。随着互联网的快速发展,数字化转型... 查看详情

你了解云计算吗?——谈谈对云计算的理解

...正理解云计算这三个字背后的本质呢?那么今天就来好好谈谈云计算是个什么鬼。但笔者自知才疏学浅,若有纰漏之处还望大家指正。一、云计算的由来与发展1.1云计算的由来?万物起源必有原因,云计算也不例外。谈到云计算... 查看详情

我所理解的云原生

...原生的前世今生(一)》跟大家分享了Pivotal和CNCF对云原生的定义,这篇聊聊我自己对云原生的理解。先抛结论,我理解的云原生是一种利用云计算交付优势来构建和运行应用的方法论,当你的应用按照云计算... 查看详情

云原生这么火,你不来了解下?

目录一、前言二、大家对云原生的理解三、云原生的产生四、DevOps+持续交付+微服务+容器化的理解五、云原生技术栈六、怎么学习云原生呢?ⅠdockerⅡk8sⅢKubeSphereⅣSpringCloudⅤDevOps七、部署实战八、小结一、前言随着云计算的不... 查看详情

01.pulsar基本介绍多租户模式云原生架构segmentedstreams支持跨地域复制pulsar组件介绍pulsario(connector)pulsar与kafka的对比

...出的,到目前为止,云原生的概念发生了多次变更,目前最新对云原生定义为:DevOps+持续交付+微服务+容器而符合云原生架构的应用程序是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提供灵活性和可维护... 查看详情

谈谈我对前端组件化中“组件”的理解,顺带写个vue与react的demo

谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo前言前端已经过了单兵作战的时代了,现在一个稍微复杂一点的项目都需要几个人协同开发,一个战略级别的APP的话分工会更细,比如携程:携程app=机票频道+酒店... 查看详情

我所理解的云原生

...解什么是云原生,需要先理解什么是云计算。云计算简单来说就是云平台提供(包括服务器、存储、数据库、网络、软件、分析和智能)等云服务,通过因特网提供快速创新、弹性资源和规模经济。对于云服务而... 查看详情

kafka入门概述部署与api的简单使用(代码片段)

Kafka入门(一)概述、部署与API的简单使用MQ传统架构的问题MQ简介MQ的优缺点优点缺点同步与异步P2P模式订阅发布模式Kafka概述简介特点名称解释BrokerProducerConsumerConsumerGroupTopicPartition分区副本SegmentOffset对比Kafka集群架构部... 查看详情

简单明了,kafka与mq的区别

参考技术A作为消息队列来说,企业中选择mq的还是多数,因为像Rabbit,Rocket等mq中间件都属于很成熟的产品,性能一般但可靠性较强,而kafka原本设计的初衷是日志统计分析,现在基于大数据的背景下也可以做运营数据的分析统... 查看详情

谈谈消息队列的流派(代码片段)

...讯,屏蔽底层复杂的通讯协议,定义了一套应用层上更加简单的通讯协议。一套分布式系统中两个模块之间通讯要么是HTTP,要么是TCP,但这两种协议其实都是原始的协议。前者 查看详情

软件设计——云原生12要素

...布、运行-Build,Release,Run环境对等-Dev/prodparity第二类:对云原生应用及其重要的分离基础的后端组件-Back 查看详情

如何设计一个复杂的业务系统?从对领域设计云原生微服务中台的理解开始

大年初一,看完中国队1:3越南队的比赛,在思考中国足球每况愈下的深层次原因之外,不禁回想起这几年做过的一些大型企业数字化转型项目,有得有失,最终回归到本源“如何设计和实施一个复杂软件工程”这个问题上,趁着... 查看详情

如何设计一个复杂的业务系统?从对领域设计云原生微服务中台的理解开始...

点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料01如何解决复杂业务设计Aliware软件架构设计本身就是一个复杂的事情,但其实业界已有一个共识,那就... 查看详情

也谈谈我对docker的简单理解

...一个工具的出现必然需要解决一些问题,Docker也不例外,简单说说我们常见的2种情况Docker是如何解决的吧。1、程序在我这跑得好好的,在你那怎么就不行呢?!这是一个典型的应用场景,作为程序员别说没有遇到过这个问题。D... 查看详情

mq---jms

...信耦合度更低,消息服务更加可靠以及异步性。我们可以简单的理解:两个应用程序之间需要进行通信,我们 查看详情

从mixin到hooks,谈谈对react16.7.0-alpha中即将引入的hooks的理解(代码片段)

??为了实现分离业务逻辑代码,实现组件内部相关业务逻辑的复用,在React的迭代中针对类组件中的代码复用依次发布了Mixin、HOC、Renderprops等几个方案。此外,针对函数组件,在Reactv16.7.0-alpha中提出了hooks的概念,在本身无状态... 查看详情

kafka一文总结(代码片段)

...蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。传统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。最新定义:Kafka是一个... 查看详情