kafka原理与应用

架构图

在这里插入图片描述
在这里插入图片描述

Broker

  1. Kafka集群包含多个服务器,服务器节点称为Broker
  2. Broker存储Topic数据
    1. 如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
    2. 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
    3. 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

Leader&Follower

  1. 每个Partition有多个副本,有且仅有一个作为Leader
  2. Leader是当前负责数据读写的Partition
  3. 所有写请求通过Leader路由,数据变更会广播给Follower。
  4. 若Leader失效,会送Follower中选举Leader。
  5. 当Follower与Leader卡住、挂掉、同步慢,Leader会将Follower删除,重新创建Follower。

Topics和Partition

  1. Topic逻辑上理解为一个queue,每条消息都对应一个Topic
  2. Partition:物理上一个Topic分成多个Partition,对应一个文件夹,存储消息和索引文件
  3. Topic可以指定分区数,越多,吞吐量越大,资源越多,不可用性越高
  4. 单个Partition中数据有序
  5. 收到消息,均衡策略,append到Partition。属于顺序写磁盘,高效
  6. Partition可分布在不同的broker,同一Topic消息可并行写入Partition,高效
  7. Kafka会保留所有消息,提供时间空间删除策略
  8. Consumer的offset控制消费位点,所以broker无状态,不标记是否被消费,不需要锁避免重复消费,高效

Producer

  1. Producer发送消息到broker
  2. Partition机制选择存储到哪一个partition
  3. 消息可以制定key,producer根据key和partition机制判断发送到那个partition
  4. Partition机制可以通过指定Producer的partition.class。该calss必须实现Partitioner接口

Consumer Group

在这里插入图片描述

  1. 同一Topic的消息只能被一个Consumer Group的一个Consumer消费,多个Comsumer Group可以同时消费。
  2. 借此实现广播和单点。广播时,每个Consumer独立Group;单点时,所有Consumer在同一个Group

Push&Pull

  1. Producer向Broker push消息。
  2. Consumer从Broker pull消息。

Replication(副本)

  1. 0.8以前版本没有Replic,一旦某个Broker宕机,其上所有Partition都不可消费
  2. 为了负载均衡,Kafka尽量将Partition均匀分配到每个Broker。
  3. 为了提高容错,Kafka尽量将同一个Partition的Replic分散到不同的Broker。
  4. 分配Replication的算法
    1. 将所有Broker(假设共n个Broker)和待分配的Partition排序
    2. 将第i个Partition分配到第(i mod n)个Broker上
    3. 将第i个Partition的第j个Replica分配到第((i + j) mode n)个Broker上

消息同步流程

在这里插入图片描述

  1. 同步流程
    1. Producer发送消息
    2. Leader接收,写入本地log
    3. Follower pull,写入log,发送ACK
    4. Leader收到所有ISR(in sync replication)的ACK,增加HW,向Producer发送ACK
    5. Consumer从Leader读取已被commit的消息
  2. ZooKeeper的心跳机制检测Broker是否存活
  3. Leader会将Broker从ISR中移除
    1. Follower宕机
    2. Follower消息数落后于Leader指定值
    3. Follower指定时间未向Leader发送fetch请求

集成SpringBoot

  1. POM

    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
        <version>1.3.5.RELEASE</version>
    </dependency>
    
  2. Application.properties

    spring:
      kafka:
        bootstrap-servers: 127.0.0.1:9092 #指定kafka server的地址,集群配多个,中间,逗号隔开
        producer:
          key-serializer: org.apache.kafka.common.serialization.StringSerializer
          value-serializer: org.apache.kafka.common.serialization.StringSerializer
        consumer:
          group-id: default_consumer_group #群组ID
          enable-auto-commit: true
          auto-commit-interval: 1000
          key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
          value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    server:
      port: 8500
    
  3. 生产者

    @Autowired
    private KafkaTemplate<String,Object> kafkaTemplate;
    kafkaTemplate.send("Topic", msg);
    
  4. 消费者

    @KafkaListener(topics = "demo")
        public void listen (ConsumerRecord<?, ?> record){
            System.out.printf("topic is %s, offset is %d, value is %s \n", record.topic(), record.offset(), record.value());
        }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/97621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习优化入门:Momentum、RMSProp 和 Adam

目录 深度学习优化入门&#xff1a;Momentum、RMSProp 和 Adam 病态曲率 1牛顿法 2 Momentum:动量 3Adam 深度学习优化入门&#xff1a;Momentum、RMSProp 和 Adam 本文&#xff0c;我们讨论一个困扰神经网络训练的问题&#xff0c;病态曲率。 虽然局部极小值和鞍点会阻碍…

发布的策略

简介 应用程序升级面临最大挑战是新旧业务切换&#xff0c;将软件从测试的最后阶段带到生产环境&#xff0c;同时要保证系统不间断提供服务。 长期以来&#xff0c;业务升级渐渐形成了几个发布策略&#xff1a;蓝绿发布、灰度发布和滚动发布&#xff0c;目的是尽可能避免因发…

计算机网络(速率、宽带、吞吐量、时延、发送时延)

速率&#xff1a; 最重要的一个性能指标。 指的是数据的传送速率&#xff0c;也称为数据率 (data rate) 或比特率 (bit rate)。 单位&#xff1a;bit/s&#xff0c;或 kbit/s、Mbit/s、 Gbit/s 等。 例如 4 1010 bit/s 的数据率就记为 40 Gbit/s。 速率往往是指额定速率或…

Debian 30 周年,生日快乐!

导读近日是 Debian 日&#xff0c;也是由伊恩-默多克&#xff08;Ian Murdock&#xff09;创立的 Debian GNU/Linux 通用操作系统和社区支持的 Debian 项目 30 周年纪念日。 不管你信不信&#xff0c;从已故的伊恩-默多克于 1993 年 8 月 16 日宣布成立 Debian 项目&#xff0c…

【大数据毕设】基于Hadoop的招聘网站可视化的设计与实现(一)

博主介绍&#xff1a;✌全网粉丝6W,csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于大数据技术领域和毕业项目实战✌ &#x1f345;文末获取项目联系&#x1f345; 基于Hadoop的招聘网站可视化的设计与实现 摘要&#…

Android 使用模拟器模拟Linux操作系统

1. 简介 在Android手机上使用模拟器模拟ubuntu等操作系统&#xff0c;便于测试 2. 软件准备 Termux&#xff1a;是一款 Android 终端模拟器和 Linux 环境应用程序&#xff0c;无需 root 或设置即可直接运行。虽然酷安和谷歌菜市场都能下载&#xff0c;但这些渠道都很久没更新…

gitlab提交项目Log in with Access Token错误

目录 报错信息 问题描述 解决方案 报错信息 问题描述 在提交项目到gitlab时&#xff0c;需要添加账户信息 &#xff0c;但是报了这样一个错&#xff0c;原因应该就是路径问题&#xff0c;我在填写server地址的时候&#xff0c;就出现了路径问题&#xff0c;我把多余的几个/…

.NetCore之log4net的使用

1.首先下载log4ne的包&#xff1a; 2.添加配置文件log4net.config <?xml version"1.0" encoding"utf-8" ?> <configuration><!-- This section contains the log4net configuration settings --><log4net><appender name&q…

qt设计界面

widget.h #ifndef WIDGET_H #define WIDGET_H //防止文件重复包含#include <QWidget> //QWidget类所在的头文件&#xff0c;父类头文件 #include<QIcon> #include<QPushButton> …

ClickHouse 使用

CREATE DATABASE test on cluster ck_00_1repl; DROP TABLE local_t_ordt_order on cluster ck_00_1repl; 创建本地 local 表 CREATE TABLE test.local_order_db_t_order on cluster ck_00_1repl ( forder_id_hash String, forder_id String, fuid Int32, forder_type Int32…

Android 蓝牙开发( 二 )

前言 上一篇文章给大家分享了Android蓝牙的基础知识和基础用法&#xff0c;不过上一篇都是一些零散碎片化的程序&#xff0c;这一篇给大家分享Android蓝牙开发实战项目的初步使用 效果演示 : Android蓝牙搜索&#xff0c;配对&#xff0c;连接&#xff0c;通信 Android蓝牙实…

git-tf clone 路径有空格处理方案

git-tf clone 路径存在空格情况下&#xff0c;运行命令报错&#xff1b; 需要对路径进行双引号处理

几个nlp的小任务(机器翻译)

几个nlp的小任务(机器翻译) 安装依赖库数据集介绍与模型介绍加载数据集看一看数据集的样子评测测试数据预处理测试tokenizer处理目标特殊的token预处理函数对数据集的所有数据进行预处理微调预训练模型设置训练参数需要一个数据收集器,把处理好数据喂给模型设置评估方法参数…

Redis——》Redis的部署方式对分布式锁的影响

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Java“魂牵”京东商品详情描述数据,京东商品详情API接口,京东API接口申请指南

要通过京东的API获取商品详情描述数据&#xff0c;您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过京东开放平台API获取商品详情&#xff1a; 首先&#xff0c;确保您已注册成为京东开放平台的开发者&#xff0c;并创…

xxl-job的简单使用

模块介绍 一、以做过的项目一为例&#xff0c;模块分配如下&#xff1a; xxl-job-admin&#xff1a;任务管理后台模块 xxl-job-executor-paofu&#xff1a;任务代码执行模块 二、以做过的项目二为例&#xff0c;模块分配如下&#xff1a; 为什么要介绍一下模块的分配&#x…

【kubernetes】使用kubepshere部署中间件服务

KubeSphere部署中间件服务 入门使用KubeSphere部署单机版MySQL、Redis、RabbitMQ 记录一下搭建过程 (内容学习于尚硅谷云原生课程) 环境准备 VMware虚拟机k8s集群&#xff0c;一主两从&#xff0c;master也作为工作节点&#xff1b;KubeSphere k8skubesphere devops比较占用磁…

【Unity开发必备】100多个 Unity 学习网址 资源 收藏整理大全【持续更新】

Unity 相关网站整理大全 众所周知&#xff0c;工欲善其事必先利其器&#xff0c;有一个好的工具可以让我们事半功倍&#xff0c;有一个好用的网站更是如此&#xff01; 但是好用的网站真的太多了&#xff0c;收藏夹都满满的(但是几乎没打开用过&#x1f601;)。 所以本文是对…

NodeJs-Buffer(缓冲器)

目录 一、概念二、特点三、使用3.1 创建Buffer3.2 Buffer 与字符串的转化3.3 Buffer 的读写 一、概念 Buffer 是一个类似于数组的 对象 &#xff0c;用于表示固定长度的字节序列 Buffer 本质是一段内存空间&#xff0c;专门用来处理 二进制数据 。 二、特点 Buffer 大小固定且…

【Docker】01-Centos安装、简单使用

参考教程&#xff1a; https://www.bilibili.com/video/BV1Qa4y1t7YH/?p5&spm_id_frompageDriver&vd_source4964ba5015a16eb57d0ac13401b0fe77 什么是Docker&#xff1f; Docker是一种开源的容器化平台&#xff0c;用于构建、打包、部署和运行应用程序。它通过使用容…