Kafka 记录

推荐资源

官网http://kafka.apache.org/
Githubhttps://github.com/apache/kafka
书籍《深入理解Kafka 核心设计与实践原理》

Kafka 架构

Kafka使用ZooKeeper作为其分布式协调框架,其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信息。Kafka元数据信息包括如代理节点信息、Kafka集群信息、旧版消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。Kafka在启动或运行过程当中会在ZooKeeper上创建相应节点来保存元数据信息,Kafka通过监听机制在这些节点注册相应监听器来监听节点元数据的变化,从而由ZooKeeper负责管理维护Kafka集群,同时通过ZooKeeper我们能够很方便地对Kafka集群进行水平扩展及数据迁移。后面新版本有KRaft(Kafka Raft)代替Zookeeper。

Kafka Ecosystem 生态系统 

Kafka 核心概念

Topic

Topic:特指Kafka处理的消息源的不同分类。

Kafka的消息通过主题进行分类。(主题好比数据库中的表,或者文件系统里的文件夹)主题可以被分为若干个分区。一个分区就是一个提交日志。一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序,消息以追加的方式写入分区,然后以先入先出(消息队列)的顺序读取。为了提高效率,消息被分批次写入Kafka。批次就是一组消息,这些消息属于同一个主题(topic)和分区(Partition)。消息由字节数组组成。

Partition

Partition:Topic物理上的分组,一个Topic可以分为多个Partition,每个Partition是一个有序的队列。Partition中的每条消息都会被分配一个有序的id。

每个主题对应的分区数可以在Kafka启动时所加载的配置文件中配置,也可以在创建主题时指定。当然,客户端还可以在主题创建后修改主题的分区数。

分区使得Kafka在并发处理上变得更加容易,理论上来说,分区数越多吞吐量越高,但这要根据集群实际环境及业务场景而定。同时,分区也是Kafka保证消息被顺序消费以及对消息进行负载均衡的基础。

Kafka只能保证一个分区之内消息的有序性,并不能保证跨分区消息的有序性。每条消息被追加到相应的分区中,是顺序写磁盘,因此效率非常高,这是Kafka高吞吐率的一个重要保证。同时与传统消息系统不同的是,Kafka并不会立即删除已被消费的消息,由于磁盘的限制消息也不会一直被存储(事实上这也是没有必要的),因此Kafka提供两种删除老数据的策略,一是基于消息已存储的时间长度,二是基于分区的大小。

由于Kafka副本的存在,就需要保证一个分区的多个副本之间数据的一致性,Kafka会选择该分区的一个副本作为Leader副本,而该分区其他副本即为Follower副本,只有Leader副本才负责处理客户端读/写请求,Follower副本从Leader副本同步数据。如果没有Leader副本,那就需要所有的副本都同时负责读/写请求处理,同时还得保证这些副本之间数据的一致性,

Message

Message:消息,是通信的基本单位。每个Producer可以向一个Topic(主题)发布一些消息。

Kafka的数据单元被称为消息。(可以把消息看成是数据库里的一个“数据行”或“记录”)

Producer

Producer:消息和数据生产者。向Kafka的一个Topic发布消息的过程叫作Producer。

Consumer

Consumer:消息和数据消费者。订阅Topics并处理其发布的消息的过程叫作Consumer。

Broker

Broker:缓存代理。Kafka集群中的一台或多台服务器统称为Broker。一台Kafka服务器就是一个Broker。一个集群由多个Broker组成,一个Broker可以容纳多个Topic。

Kafka集群就是由一个或多个Kafka实例构成,我们将每一个Kafka实例称为代理(Broker),通常也称代理为Kafka服务器(KafkaServer)。在生产环境中Kafka集群一般包括一台或多台服务器,我们可以在一台服务器上配置一个或多个代理。每一个代理都有唯一的标识id,这个id是一个非负整数。在一个Kafka集群中,每增加一个代理就需要为这个代理配置一个与该集群中其他代理不同的id, id值可以选择任意非负整数即可,只要保证它在整个Kafka集群中唯一,这个id就是代理的名字,也就是在启动代理时配置的broker.id对应的值。发布与订阅系统一般有一个broker,也就是发布消息的中心点。

Broker默认的消息保留策略是这样的:要么保留一段时间(比如7天),要么保留到消息达到一定大小的字节数(比如1GB)。

Relationship Overview for Broker, Producer, Consumer, Topic, Topic Partition, Replicas, Leader and Follower

ISR & OSR

Log End Offset & WAL

ack

There are two settings here that affect the producer:

  • acks - this is a producer-level setting
  • min.insync.replicas - this is a topic-level setting

The acks property determines how you want to handle writing to kafka:

acks=0 - I don't care about receiving acknowledgment of receipt 

acks=1 - Send an acknowledgment when the leader partition has received the batch in memory

all/-1 - Wait for all replicas to receive the batch before sending an acknowledgment 

Kafka Producer Architecture and Workflow

Java code

Producer:

Consumer:

如果处理重复消息

幂等处理重复消息
幂等是数学上的概念,我们就理解为同样的参数多次调用同一个接口和调用一次产生的结果是一致的。例如这条 SQL:update t1 set money = 150 where id = 1 and money = 100; 执行多少遍 money 都是150,这就叫幂等。
因此需要改造业务处理逻辑,使得在重复消息的情况下也不会影响最终的结果。

1. 前置条件判断
可以通过像上面 SQL 一样,做个前置条件判断,即 money = 100,并且直接修改;更通用的是做个 version 即版本号控制,对比消息中的版本号和数据库中的版本号。

2. 通过数据库的约束例如唯一键,例如 insert into update on duplicate key ... 

3. 记录关键的key,例如处理订单,记录订单ID,假如有重复的消息过来,先判断下这个ID是否已经被处理过了,如果没处理再进行下一步。当然也可以用全局唯一ID等。

基本上就这么几个方式,真正应用到实际中还是得看具体业务细节。

如何保证消息不丢失

如何保证消息的有序性

消息队列的推拉模式

Kafka Admin (Setup, Operation, Monitoring)

(后续再整理)

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

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

相关文章

使用流服务器m7s对接gb28181

优:sip品牌兼容性比较好,大华,海康都稳定可以,srs的5.0 sip品牌兼容性大华没反应,akstream-sip 大华也有问题,wvp也还可以 缺:目前最新的4.7.4版本,,sip协议用udp正常&a…

年底特殊时期外贸装柜多花点心思

如果可以,尽量不要在工厂快要放假的时候安排装柜了,一个是人手不够,一个是容易漏货,还有就是柜子不好定。 看到有人说自己客户收到货的时候比预期晚了两个星期,一直延误,已经比原来要计划开业的时间推迟&a…

mini-spring 实现应用上下文,自动识别、资源加载、扩展机制

我们不能让面向 Spring 本身开发的 DefaultListableBeanFactory 服务,直接给予用户使用 DefaultListableBeanFactory、XmlBeanDefinitionReader,是我们在目前 Spring 框架中对于服务功能测试的使用方式,它能很好的体现出 Spring 是如何对 xm…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统,完全依赖代码进行实现,动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标(x,y) //1秒时间内,移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

Walrus file 是 Walrus 0.5 版本推出的新功能,用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置,然后通过 Walrus CLI 执行 walrus apply或在 Walrus UI 上进行import,将 Walrus file 提交给 Walrus server,由 …

Qt简易的五子棋

五子棋是个简单的小游戏,尝试使用Qt将他做出来,学习时的练习demo。 成果展示 需求分析 五子棋:在棋盘上,黑棋先行,交替下棋,五子练成直线获取胜利。 实现过程 1.棋盘绘制:下棋的第一步肯定是绘制…

7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析

本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ,包含对 RibbitMQ 的架构介绍、应用场景、坑点解析以及代码实战。 我将使用 waynboot-mall 项目作为代码讲解,项目地址:https://github.com/wayn111/waynboot-mall。本文大…

无需 Root 卸载手机预装软件,精简过的老年机又行了

基础准备 准备目标手机、USB 数据线、以及一台电脑。手机 USB 连接电脑,开发者选项中打开 USB 调试。(开发者选项默认隐藏,需要在关于手机中多次点击版本号才能调出)。 安装手机驱动,下载安装 ADB 工具包。 开始操作…

世界坐标系转换为平面地图坐标

将世界坐标系转换为平面地图坐标的方法通常涉及地图投影。地图投影是一种将地球(一个三维球体)上的点转换为平面(二维)地图上的点的方法。 这里介绍几种常见的地图投影方法: 墨卡托投影(Mercator Projection): 这是最常见的投影方式之一,尤其用于航海地图。它将经纬度…

3D数据转换器HOOPS Exchange如何获取模型的几何数据? 干货预警!

一、概述 前面讲解过模型在内存中的结构,现在回顾一下,当模型导入成功后,整个模型数据会以原生结构的 PRC 组装树形式存放到内存中。(申请 HOOPS Exchange 试用) PRC结构的主要类型包含四种,分别是…

Pipwork相关测试过程

pipework可以减轻docker实施过程中的工作量,在网上也找了几篇类似的文章,按照相应配置,结果并不相同 如下测试过程记录下: docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…

数据结构:大顶堆、小顶堆

堆是其中一种非常重要且实用的数据结构。堆可以用于实现优先队列,进行堆排序,以及解决各种与查找和排序相关的问题。本文将深入探讨两种常见的堆结构:大顶堆和小顶堆,并通过 C 语言展示如何实现和使用它们。 一、定义 堆是一种完…

【代码随想录-链表】两两交换链表中的节点

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

虹科方案|释放总线潜力:汽车总线离线模拟解决方案

导读:传统的ECU模拟工具通常需要依赖上位机软件来发起通信,这在离线场景和自动化产线中带来不便。为了应对这一挑战,虹科推出了创新的汽车总线离线模拟解决方案,基于PCAN-Router系列网关,通过内部可编程固件&#xff0…

Ubuntu 22.04 中文乱码解决方案

sudo apkg-reconfigure locales 按空格键选中

TypeScript(七) 函数

1. TypeScript 函数 1.1. 函数的定义 函数就是包裹在花括号中的代码块,前面使用关键字function。 语法: // An highlighted block function function_name() {// 执行代码 }实例: function test() { // 函数定义console.log("我就是…

【leetcode题解C++】257.二叉树的所有路径 and 404.左叶子之和 and 112.路径总和

257. 二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:["1->2->5",&…

给准备从事软件开发工作的年轻人的13个建议

从事软件开发是一个不断学习和适应变化的过程。这里有一些针对刚入行或准备从事软件开发工作的年轻人的建议: 掌握基础知识:确保你有扎实的编程基础。了解至少一种编程语言的语法和核心概念,比如C语言、Python、Java或C#。同时,理…

fastadmin后台自定义按钮和弹窗

工具栏自定义按钮-ajax请求 前端代码 1.在对应模块的模板文件index.html添加自定义按钮&#xff0c;注意按钮要添加id以绑定点击事件 <div class"panel panel-default panel-intro">{:build_heading()}<div class"panel-body"><div id&qu…