kafaka学习

news2024/9/20 18:32:34

kafaka

消息队列:通常用来解决一个进程内,多线程环境下,资源竞争的问题;但是消息队列的锁的粒度太大了,需要进行拆分

消息队列中间组件

一个进程中,同时存在生产者、消费者、消息队列,在分布式系统中,需要把消息队列拆分出来,同时实现消息的持久化、解决幂等性问题。

  • 幂等性:网络抖动时,发送多次同样的数据,消息队列应该能过滤去重;同时考虑乱序问题,能让consumer顺序消费消息

分布式系统中,常用服务通信方式的有rpc和消息队列两种,
其中rpc的弊端为:服务A调用服务B的函数,我需要知道B函数的参数以及参数的作用,耦合度太高

消息队列将生产和消费者完全解耦:服务A只给服务B一些消息(消息简单理解就是结构体,也就是包体,但其实也并不是只传数据这么简单),
这些消息中的数据字段的含义以文档提供,这些参数怎么使用,全权由服务B决定

应用场景:

  • 异步处理
  • 系统解耦
  • 流量削峰:后台处理不了那么多请求,就放消息队列里(如12306的排队功能)
  • 日志处理:日志一开始存在缓冲,隔一段时间,或者积累到一定数量才写入磁盘
  • 生产消费
    • 点对点
    • 发布订阅

kafaka基本原理

架构图:

202304120926720

总体上来说,改架构由zookper+kafaka集群组成(zookeeper和etcd都是分布式注册中心)
其中,zk负责注册存储,选举

  1. broker: kafka集群由多个broker节点构成,每个节点上都运行着一个kafka实例,
    这些实例之间基于zk来发现彼此,并由集群控制器 KafkaController 统筹协调运行,
    彼此之间基于socket连接进行通信

  2. topic: 将消息分类处理(减少消息队列锁的粒度),以topic的创建为例()

# 一次启动zk、kafaka
# 创建Topic
sh bin/kafaka-topics.sh --create --zookeeper <zookeeper的ip和端口> --replication-factor <副本数>
-- partitions <分区数量> --topic <主题名>

创建主题时,最重要的是指定分区数量,创建的分区越多,消费的并发量越大,吞吐量越高,但到达一定数量,由于broker资源的限制,也无法再继续提高了

  1. partition:
  • 类似数据库的分库分表,分为leader和follower,在kafaka1.0,follower并不提供读的功能,因为follower不能保证同步的数据是最新,但在kafaka2.0版本后,follower已经支持,这使得消费的并发量更大了。

  • 每次写partition都要写leader消息队列 (通过查询zk能知道leader在哪).

  • 单个p内消息有序,但多个p会使得消息全局乱序,如果要保证全局有序性,一个主题指定一个p.

  • 为什么要划分多个分区

    • 水平扩展,在本节点资源不够用了,可以在其他节点划分分区
    • 并发处理,向一个主题所发送的消息会发送给该主题所拥有的不同的分区中,这样消息就可以实现并行发送与处理,由多个分区来接收所发送的消息

分区与分段

  1. repica:副本,也就是follower,副本节点监听leader进行备份

  2. 消费者组:一个消费者的集合,如一组消费者操作数据库写db,一组消费者用来做数据分析写es

    • 消费者组中的消费者数量大于分区数:有些消费者读不了消息队列
    • 消费者组中的消费者数量等于分区数:最好的状态,一个消费者读一个分区
    • 消费者组中的消费者数量小于分区数:一个消费者读多个分区

tip: 一个组中,一个消费者可以读多个分区,但一个分区只能被一个消费者读 (分区可以被不同消费者组的多个消费者读)

消费者监听一个主题(订单,活动,日志三个主题),当发布者发送了这一类主题消息,消费者就会去处理。

kafaka保证幂等性

给每个生产者一个pid,每次发消息都添加pid+seq,消息队列检查这两个值,如果已经存在了则丢弃,否则发送ack给生产者,生产者收到ack后,seq++

两个选举:

  • controller选举:zk实现
  • partition选举,由controller实现 => leader尽量分散在不同的broker
    • leader:负责数据读写
    • foller:负责数据备份,不提供读的功能(2.0版本支持了)

kafaka读写机制

读写策略

生产者:

  • High level api:随机、轮询(默认)、哈希{hash(key)%p_num}
  • low level api:自己指定分区,ack机制

消费者:主要是保存offset的值,

  • High level api:存在kafaka内部的一个主题
  • low level api:自己选择存哪(如数据库)

生产者写

生产者先访问zk,得到往哪几个主题写,然后找到主题对应的leader partition,生产者先给它发送个写请求,

202304120956460

ack的值以及对应的吞吐量

  • 0:不需要回复,直接写消息队列 20w/s
  • 1:无需等待同步
  • -1:需要等待副本同步,再回复生产者 8w/s

消费者读

假设消费者是取出消息,操作数据库,其大致流程为:取出消息,数据操作成功,offset偏移,指向下一个消息;

此时,如果数据库操作成功了,但是消费者宕机了,这个消息就会重复消费

解决方法:db操作+offset偏移编程原子操作,将offset存储在db,如果宕机了就回滚

在kafaka1.0,zk存储上一次消息的partition,以及之前的offset(后续版本有一个专门的主题存储offset)

kafaka总结

消息持久化:消息队列的数据默认保存一周,写分区其实就是写多段的日志
读写高吞吐量: 通过节点 + 分区的方式实现负载均衡, 把消息写到不同的节点
高可用:leader所在节点宕机了,会选取新的leader;其他高可用的案例有:

  • 数据库:主从复制,主节点宕机,etcd选举新的节点
  • redis:去中心化,每个master节点都有两个副本节点,master节点宕机了,另外两个副本节点会选举一个成为新的master节点

工作中遇到的问题

  1. 有时发现一些日志没有写磁盘,是因为这个日志处于不活跃的segment,然后被清理了吗?kafaka日志清除策略
  2. 主推消息乱序是因为一个主题建立了多个分区吗?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络文件传输防止篡改-校验工具(md5sum)的使用

说明 MD5报文摘要算法&#xff08;Message-Digest Algorithm 5&#xff09;常常被用来验证网络文件传输的完整性&#xff0c;防止文件被人篡改。此算法对任意长度的信息逐位进行计算&#xff0c;产生一个二进制长度为128位&#xff08;十六进制长度就是32位&#xff09;的“指…

wordpres漏洞扫描器——wpscan

WordPress 使用PHP语言开发的博客平台 WordPress是使用PHP语言开发的博客平台&#xff0c;用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统&#xff08;CMS&#xff09;来使用。 WordPress是一款个人博客系统&#xff0c…

手把手教你在linux中部署stable-diffusion-webui

stable-diffusion-webui是什么就不用多说了&#xff0c;以下是安装步骤&#xff0c;我以linux系统为例介绍&#xff0c;windows系统大同小异&#xff0c;安装期间没有用到梯子&#xff0c;安装目录/opt/stable-diffusion-webui/。 1.安装Anaconda stable-diffusion-webui要求p…

2023年小红书用户种草转化新路径

随着消费者对商品选择性提高&#xff0c;品牌转化链路随之被拉长&#xff0c;在投放操盘上竞争也愈发激烈&#xff0c;本期和大家聊聊如何在关键节点上引领用户决策&#xff0c;完成用户种草转化。种草链路拉长品牌发力点在何处&#xff1f; 基于平台用户的洞察分析&#xff0c…

ESXi安装CentOS

ESXi安装 参考&#xff1a;https://blog.csdn.net/tongxin_tongmeng/article/details/129466704 CentOS安装 镜像&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64-->CentOS-7-x86_64-DVD-2009.iso CentOS配置 FinalShell连接 ESXi简介 1.ESXi是由VMware公司…

leedcode刷题(6)

各位朋友们大家好&#xff0c;今天是我的leedcode刷题系列的第六篇。这篇文章将与队列方面的知识相关&#xff0c;因为这些知识用C语言实现较为复杂&#xff0c;所以我们就只使用Java来实现。 文章目录设计循环队列题目要求用例输入提示做题思路代码实现用栈实现队列题目要求用…

【回溯法】-----求一个集合的子集问题

leetcode78 subsetsleetcode 78 问题原文ExampleConstraints:解决思路回溯法代码实现leetcode 78 问题原文 Given an integer array nums of unique elements, return all possible subsets (the power set). The solution set must not contain duplicate subsets. Return t…

银行数仓分层架构

一、为什么要对数仓分层 实现好分层架构&#xff0c;有以下好处&#xff1a; 1清晰数据结构&#xff1a; 每一个数据分层都有对应的作用域&#xff0c;在使用数据的时候能更方便的定位和理解。 2数据血缘追踪&#xff1a; 提供给业务人员或下游系统的数据服务时都是目标数据&…

WebTest搭建

0.前言 此框架为真实项目实战&#xff0c;所以有些数据不便展示&#xff0c;只展示架构和思想 工具&#xff1a;pythonseleniumddtunittest 1.架构说明 2.代码封装 Commom层 base_page.py #__author__19044168 #date2021/8/26 import logging import datetime from sele…

【数据分析之道-NumPy(六)】数组操作

文章目录专栏导读1、修改数组形状reshape()resize()flatten()ravel()2、翻转数组transpose()flip()fliplr()flipud()3、修改数组维度newaxis()squeeze()4、连接数组concatenate()stack()hstack()、vstack()5、分割数组split()hsplit()vsplit()array_split()6、数组元素的添加和…

2023学习软件测试,如何月薪过万?这几条必须具备

软件测试&#xff0c;如何月薪过万&#xff1f; 这个问题换做前几年的功能测试或许还有点小难。但如今以点点点为主的功能测试&#xff0c;即将被淘汰&#xff0c;适者生存的法则下&#xff0c;自动化测试如雨后春笋登上舞台。 同一时间&#xff0c;随着各大互联网公司迅速扩…

Carla仿真二:Carla多视图切换代码详解

文章目录前言一、Carla多视图切换效果二、Camera安装坐标系1、Carla.Location2、Carla.Rotation三、接口及代码详解1、接口介绍2、生成上帝视图代码3、生成Camera视图代码四、完整代码前言 1、Carla提供了大量的Python API接口&#xff0c;用户可以通过查找文档实现各类功能&a…

【前缀和】

目录知识框架No.0 筑基No.1 普通前缀和题目来源&#xff1a;牛客网-NC14556&#xff1a;数圈圈题目来源&#xff1a;牛客网-NC14600&#xff1a;珂朵莉与宇宙题目来源&#xff1a;牛客网-NC21195 &#xff1a;Kuangyeye and hamburgers题目来源&#xff1a;牛客网-NC19798&…

混合开发中h5前端离线打包规范流程

1、离线化的目的 首先在H5Native的混合开发实战中&#xff0c;让人头疼最多的恐怕就是网页加载过程中的白屏了&#xff0c;以及弱网、断网状态下h5页面无法正常加载的问题&#xff0c;那么为了解决这些问题&#xff0c;我们H5端跟原生端共同讨论采用Hybrid App离线加载方案&…

fiddler(抓包)的用法和HTTP 协议的基本格式

目录 fiddler(抓包)用法&#xff1a; HTTP 协议的基本格式 HTTP请求&#xff1a; 首行 认识HTTP方法 GET和POST的典型区别&#xff1a; 认识请求“报头”&#xff08;header&#xff09; HTTP 响应 HTTP状态码&#xff1a; 状态码的分类&#xff1a; 认识响应 …

SD-WAN基本介绍

一、SD-WAN是什么&#xff1f;它能为我们带来什么&#xff1f; SD-WAN&#xff0c;即软件定义广域网络&#xff0c;是将SDN技术应用到广域网场景中所形成的一种服务。这种服务用于连接广阔地理范围的企业网络、数据中心、互联网应用及云服务&#xff0c;旨在帮助用户降低广域网…

STL——array和vector容器

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

解密HTTP协议:探索其组成部分与工作原理

前言 欢迎来到今天的每日一题&#xff0c;每日一提。昨天有聊到&#xff0c;HTTP 和 HTTPS 之间有什么区别&#xff1f;面试官基本秉承着刨根问题的原则&#xff0c;肯定是不会轻易放过我们的&#xff0c;那么自然是要继续拷问了。所以我们今天就聊聊什么是 HTTP&#xff0c;它…

微服务分布式搜索引擎 Elastic Search RestClient 操作文档

文章目录⛄引言一、初始化 Java RestClient二、RestClient 对文档的CRUD操作⛅新增文档⏰查询文档⚡修改文档⌚删除文档三、RestClient 批量文档导入⛵小结⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能…

SpringBoot整合XXL-JOB

XXL-JOB&#xff1a; 官网文档地址&#xff1a;分布式任务调度平台XXL-JOB GitHub地址&#xff1a;https://github.com/xuxueli/xxl-job Gitee地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job 拉取代码&#xff0c;首先执行一下doc/db下的sql文件 tables_xxl_job.sq…