Kafka消息队列学习(一)

文章目录

  • 概述
  • 核心概念
    • 生产者
      • 示例
      • 同步 / 异步发送消息
      • 生产者参数配置
        • ack-确认机制
        • retries - 重试次数
        • compression_type - 消息压缩类型
    • 分区机制
      • 分区策略
    • 消费者
      • 消息有序性
      • 提交和偏移量
        • 偏移量提交方式
        • 手动提交
    • 高可用设计
  • SpringBoot集成Kafka
    • 基本使用
    • 传递对象消息

概述

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

核心概念

Kafka将生产者发布的消息发布到topic中,需要这些消息的消费者可以订阅这些主题。
下面这张图也为我们引出了,Kafka 比较重要的几个概念:

  • Producer(生产者) : 产生消息的一方。

  • Consumer(消费者) : 消费消息的一方。

  • Broker(代理 / 单个kafka实例):可以看作是一个独立的Kafka实例。

    • 多个Kafka Broker组成一个Kafka Cluster。
    • 每个 Broker 中又包含了 Topic 以及 Partition这两个重要的概念
  • Topic(主题) : Producer将消息发送到特定的主题,Consumer通过订阅特定的 Topic(主题) 来消费消息。

  • Partition(分区 / 队列) : Partition 属于 Topic 的一部分。一个 Topic 可以有多个 Partition ,并且同一 Topic 下的 Partition 可以分布在不同的 Broker 上,这也就表明一个 Topic 可以横跨多个 Broker
    划重点:Kafka 中的 Partition(分区) 实际上可以对应成为消息队列中的队列。

  • 消费者组:同一个消费者组中,多个消费者订阅同一个topic,只有一个消费者可以接收到消息。

在这里插入图片描述

生产者

示例

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

同步 / 异步发送消息

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

生产者参数配置

ack-确认机制

在这里插入图片描述

retries - 重试次数

在这里插入图片描述

compression_type - 消息压缩类型

在这里插入图片描述

分区机制

在这里插入图片描述
kafka分区机制,允许消息存放在不同broke的不同分区上。
在这里插入图片描述

分区策略

默认是轮询。在这里插入图片描述

消费者

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

消息有序性

在这里插入图片描述
在这里插入图片描述
消息都发给同一个分区,就可以保证消息有序性。

提交和偏移量

消费者在消费消息时,可以追踪消息再分区的位置(偏移量),并自动向一个叫做_consumer_offset的特殊topic发送消息,包含了分区的偏移量。

在这里插入图片描述

如果消费者发送崩溃或者有新的消费者加入群组,会触发再平衡。例如消费者2挂掉了,那么分区3和分区4将被再平衡机制,指向到其他消费者。
在这里插入图片描述
在自动提交偏移量模式下,再平衡机制可能会引发问题,因为挂掉的消费者提交的消息偏移量与新指定的消费者正在处理的消息偏移量是不一致的。
提交偏移量小于正在处理的偏移量:
在这里插入图片描述
如果提交的偏移量小于正在处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理。

提交偏移量大于正在处理的偏移量:
在这里插入图片描述
如果提交的偏移量大于正在处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息将会丢失。

偏移量提交方式

在这里插入图片描述

手动提交

首先将自动提交设置为false:
在这里插入图片描述

同步提交
使用 commitSync() 提交偏移量最简单也最可靠。这个 API 会提交由 poll() 方法返回的最新偏移量,提交成功后马上返回,如果提交失败就抛出异常。
在这里插入图片描述
commitSync() 将会提交由 poll() 返回的最新偏移量,所以在处理完所有记录后要确保调用了 commitSync(),否则还是会有丢失消息的风险。

如果发生了再均衡,从最近一批消息到发生再均衡之间的所有消息都将被重复处理。

同时在这个程序中,只要没有发生不可恢复的错误,commitSync() 方法会一直尝试直至提交成功。如果提交失败,我们也只能把异常记录到错误日志里。

异步提交
同步提交有一个不足之处,在 broker 对提交请求作出回应之前,应用程序会一直阻塞,这样会限制应用程序的吞吐量。我们可以通过降低提交频率来提升吞吐量,但如果发生了再均衡,会增加重复消息的数量。 这个时候可以使用异步提交 API。我们只管发送提交请求,无需等待 broker 的响应。
在这里插入图片描述
在成功提交或碰到无法恢复的错误之前,commitSync() 会一直重试,但是 commitAsync() 不会,这也是 commitAsync() 不好的一个地方。 它之所以不进行重试,是因为在它收到服务器响应的时候,可能有一个更大的偏移量已经提交成功。假设我们发出一个请求用于提交偏移量 2000,这个时候发生了短暂的通信问题,服务器收不到请求,自然也不会作出任何响应。与此同时,我们处理了另外一批消息,并成功提交了偏移量 3000。如果 commitAsync() 重新尝试提交偏移量 2000,它有可能在偏移量 3000 之后提交成功。这个时候如果发生再均衡,就会出现重复消息。 commitAsync() 也支持回调,在 broker 作出响应时会执行回调。回调经常被用于记录提交错误或生成度量指标。如果要用它来进行重试,则一定要注意提交的顺序。

同步和异步混合提交
一般情况下,针对偶尔出现的提交失败,不进行重试不会有太大问题,因为如果提交失败是因为临时问题导致的,那么后续的提交总会有成功的。 但如果这是发生在关闭消费者或再均衡前的最后一次提交,就要确保能够提交成功。因此在这种情况下,我们应该考虑使用混合提交的方法:
在这里插入图片描述

高可用设计

  1. 集群方式(cluster),一个kafka集群由多个broke组成,一个broke宕机,其他机器上的broke依然可以对外服务。

在这里插入图片描述

  1. 备份机制(replication):kafka中为了保证消息的安全性,将信息进行了备份,并且定义了两类副本:
    • 领导者副本:生产者首先将消息发送到领导者副本进行备份,领导者副本只有一个。
    • 追随者副本 :领导者副本,将自己的消息与追随者副本进行同步。追随者副本可以有多个,且可以分为两类:
      • ISR(in - sync replica):需要同步复制保存的follower。
      • 普通: 与领导者副本之间是异步保存。
    • 当leader失效后,需要选出新的leader,选举原则如下:
      • 优先从ISR中选择,因为ISR中的消息数据是与leader同步的
      • 如果ISR列表中的follower都不行了,就只能从其他follow中选取。
      • 极端情况:所有副本都失效了,这时有两种方案:
        • 等待ISR中的一个活过来,选为leader,数据可靠,但是时间不确定。
        • 选择第一个活过来的副本为leader,不一定位ISR中的, 以最快速度恢复可用性,但是数据不一定完整。

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

SpringBoot集成Kafka

基本使用

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

传递对象消息

在这里插入图片描述

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

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

相关文章

2023企业微信0day漏洞复现以及处理意见

2023企业微信0day漏洞复现以及处理意见 一、 漏洞概述二、 影响版本三、 漏洞复现小龙POC检测脚本: 四、 整改意见 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#x…

Arduino+esp32学习笔记

学习目标: 使用Arduino配置好蓝牙或者wifi模块 学习使用python配置好蓝牙或者wifi模块 学习内容(笔记): 一、 Arduino语法基础 Arduino语法是基于C的语法,C又是c基础上增加了面向对象思想等进阶语言。那就只记录没见过的。 单多…

Mysql in 查询的奇怪方向

Mysql in 查询的奇怪方向 关于表字段存储的数据为 num1,num2,num3时, 还要通过多个num1,num2入参针对该字段进行查询 建表语句 CREATE TABLE test (test_ids varchar(100) DEFAULT NULL COMMENT 保存ids 以逗号分隔 ) ENGINEInnoDB;数据项 查询语句 SELECT test_ids FROM t…

Android之版本号、版本别名、API等级对应关系(全)(一百六十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

数据结构:选择排序

简单选择排序 选择排序是一种简单直观的排序算法。首先在未排序序列中找到最大(最小)的元素,存放到排序学列的其实位置,然后在剩余的未排序的元素中寻找最小(最大)元素,存放在已排序序列的后面…

NLP文本分类

NLP文本分类 落地实战五大利器!_kaiyuan_sjtu的博客-CSDN博客https://zhuanlan.zhihu.com/p/432619164 https://github.com/alibaba/EasyNLP/blob/master/README.cn.md

【5G 核心网】5G 多PDU会话锚点技术介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

Docker部署rabbitmq遇到的问题 Stats in management UI are disabled on this node

1. Stats in management UI are disabled on this node #进入rabbitmq容器 docker exec -it {rabbitmq容器名称或者id} /bin/bash#进入容器后,cd到以下路径 cd /etc/rabbitmq/conf.d/#修改 management_agent.disable_metrics_collector false echo management_age…

什么是gRPC?

1. GRPC是google开源的rpc框架 2. 核心是一个.proto的服务描述文件 3. 添加依赖的grpc相关的包,配置IDEA的grpc插件,就可以很方便的生成调用代码 4. 通过在IDEA的protobuf插件上分别执行以下两个服务,就可以生成需要的调用代码 1&#xff…

2023深圳杯A题完整代码模型

已更新深圳杯A题全部版本,文末获取! 摘要 现代社会,随着生活方式的变化和工作压力的增大,慢性非传染性疾病日益成为威胁公众健康的主要问题。心脑血管疾病、糖尿病、恶性肿瘤及慢性阻塞性肺病等慢性病的发病率呈现出上升趋势。为…

通过将信号频谱与噪声频谱进行比较,自动检测适当的带通滤波器转折频率研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

普通人怎样拥抱AI时代?这几点最为重要!

一、拒绝还是接受? 当纽约公立学校严禁学生用ChatGPT写论文之后,沃顿商学院的教授Ethan Mollick却开始鼓励自己的学生用ChatGPT来写论文。 图源于网络 试想一下,当所有学生都可以用ChatGPT写论文,大家的分数会有明显差别吗?一定…

Go把Map转成对象

最近使用了Redis的Hash,把一个对象给存储到了hash里面,具体如下: 现在需要从RedisHash缓存里面把结果给取出来,同时赋值到一个对象上面 result, err : global.GVA_REDIS.HGetAll(context.Background(), key).Result() 问题是resul…

基于STM32CUBEMX驱动TMOS模块STHS34PF80(1)----获取ID

基于STM32CUBEMX驱动TMOS模块STHS34PF80----1.获取ID 概述样品申请视频教程所有功能接口最小系统图生成STM32CUBEMX串口配置IIC配置IO口设置串口重定向 模块地址参考demoIIC写函数IIC读函数参考程序初始化获取ID主函数 概述 STHS34PF80 是一款非冷却、工厂校准的红外运动和存在…

Exploiting Proximity-Aware Tasks for Embodied Social Navigation 论文阅读

论文信息 题目:Exploiting Proximity-Aware Tasks for Embodied Social Navigation 作者:Enrico Cancelli, Tommaso Campari 来源:arXiv 时间:2023 Abstract 学习如何在封闭且空间受限的室内环境中在人类之间导航&a…

【JavaEE】懒人的福音-MyBatis框架—[单表]增删改查等常规操作

【JavaEE】MyBatis框架要点总结(2) 文章目录 【JavaEE】MyBatis框架要点总结(2)1. 单表查看操作1.1 (条件查询)通过id查找用户1.1.1 接口上声明方法1.1.2 xml文件中去实现方法1.1.3 测试 1.2 传递参数的重点问题:sql注…

监控Elasticsearch的关键指标

Elasticsearch 的核心职能就是对外提供搜索服务,所以搜索请求的吞吐和延迟是非常关键的,搜索是靠底层的索引实现的,所以索引的性能指标也非常关键,Elasticsearch 由一个或多个节点组成集群,集群自身是否健康也是需要我…

虚拟机的创建与使用

一、虚拟机的下载 链接:百度网盘下载链接 提取码:a9p4 二、新建虚拟机系统 需要有版本序列号 注意: 选择 第一个是纯dos 的窗口指令 桌面没有任何东西 选择第二个就是正常的操作系统.有文件夹 我的电脑之类的 三、从主机中复制文件到虚拟机中需要安装 …

阿里云服务器搭建Magento电子商务网站图文教程

本文阿里云百科分享使用阿里云服务器手动搭建Magento电子商务网站全流程,Magento是一款开源电商网站框架,其丰富的模块化架构体系及拓展功能可为大中型站点提供解决方案。Magento使用PHP开发,支持版本范围从PHP 5.6到PHP 7.1,并使…

如何通过CSS选择器选择一个元素的子元素?如何选择第一个子元素和最后一个子元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 选择一个元素的子元素⭐ 选择第一个子元素和最后一个子元素⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…