必知必会-使用kafka之前要掌握的知识(代码片段)

上帝De助手 上帝De助手     2022-12-04     397

关键词:

必知必会系列之kafka

前记

消息队列是分布式系统架构中不可或缺的基础组件,它主要负责服务间的消息通信和数据传输。
市面上有很多的开源消息队列服务可以选择,除了kafka,还有Activemq,Rocketmq等。
对于要选择哪一个服务需要根据的实际情况来定,今天主要介绍kafka。

kafka特性

大多数消息队列服务的主要功能都是大同小异,都能完成基本的消息传输和保障机制,只是在具体的实现细节上会有所不同。
而kafka也是有它独特的特性,主要体现在如下几个方面:

  • 文件存储消息日志
  • 支持高并发和大吞吐量
  • 支持消息持久化
  • 可以重复消费消息

除了这些之外的还有通用消息队列服务的标配。比如:

  • 支持队列和订阅2种消息传输方式
  • 支持集群部署
  • 支持多机备份

kafka实现

相比于其它的消息队列服务在内存中存储消息而言,kafka最大的特点就是使用文件存储消息日志。并且这也没有导致kafka的读取性能和整体的吞吐量。
而之所以能达到这样的效果,还要取决于它的设计原理,即保证了高速读写(read before|write behind),又保证了并发效率。

顺序写

kafka之所以能高速写,是因为利用了磁盘的顺序写的特性。经测试发现磁盘的顺序写甚至比内存的随机读还要快很多,因此kafka在写文件时会批量的写入,并且追加到一个文件中。

高速读

高速读除了因为连续读取,操作系统会有预读的机制之外,还体现在它的文件结构的设计。kafka把消息按topic分类,topic又可以按分区读写,分区再按索引文件分割存取。
这样当我们知道了topic、分区、offset之后,就可以通过O(1)的方式找到目标消息所在的位置。

概念介绍

kafka中有几个重要的概念:

  • Topic
  • partition
  • Consumer Group
  • offset

Topic:定义一个消息分类,相关的生产者和消费者通过特定的Topic来进行联通。

partition:Topic下的子概念,一个Topic通常可以分为1或多个partition,该Topic中的消息会分发到不同的partition中,也可以在代码中指定特定的partition。

Consumer Group:消费者组,它的作用的限定一组消费者,同组内的消费者在消费时是一种互斥模式;即同一个组内只有一个消费者可以消费到某个特定的消息。

offset:Topic中记录某条消息位置的偏移量信息,通常offset是消费者读取消息的依据。

分区和分组

分区即一个Topic设置了多个partition(默认是1个),分区有如下的优势:

  • 支持分布式
  • 支持负载并发请求
  • 支持容灾备份
  • 保证分区内的消费顺序

分组即把相关联的消费者放在一个组内(kafka对每个消费者会分配一个默认分组,如果不指定的话),分组有如下优势:

  • 组内多个消费者可以并发处理(提高消费效率的方式)
  • 消费者管理更加灵活

接着,在po一张分区和分组的关系图。

从图中可以看到的关系如下:

  • Topic下的消息会分发给所有的订阅组
  • 组内的消费者会各自消费不同的分区(且在分区和组内消费者数不变的情况下,关系是固定的)
  • 一个消费者可以消费一或多个分区
  • 一个分区只能被同一个组内的一个消费者消费

这个是设计相对合理的分区和消费者数量,组内消费者数 = 分区数 * N。如果分区数和消费者数设置不合理,则会有消费者永远拿不到数据。
所以,分区、分组是kafka支持高并发处理的基础。

队列还是分发

跟其它消息队列一样,kafka的消息模式也支持队列和分发订阅两种方式。
队列模式也称生产消费者模式,特点是同一个消息同时只能被一个消费者消费。其逻辑结构可以简单的通过下面的示意图来说明。

分发订阅模式的特点是同一个消息同时可以被所有的消费者消费。(类似于广播的形式)其逻辑结构的简单示意如下:

kafka中默认会把同一个消息分发给所有的订阅组(Consumer Group),即分发订阅模式。
如果想要实现队列模式,则把所有的消费者存放在一个Consumer Group内,且该Topic只有这一个组有订阅。kafka不同消费模式的示意如下:


消费方式

消息的消费方式是很多初用者会忽略的,因为简单场景下选择任意一种都是可以正常工作的,而到了生成环境可能就会出问题了。
kafka的消费方式有三种:

  • At most once(消息最多被消费一次)
  • At least once(消息最少被消费一次)
  • Exactly once(消息刚好被消费一次)

前两者所有版本的kafka都支持,可以通过是否自动提交offset来控制。
默认kafka是会自动提交offset的,即属于第一种方式。如果设置为手动提交offset则属于第二种方式。

另外如果需要刚好一次的消费语义,则需要0.11以上的kafka版本。
如果你的版本不是0.11之后的,则可以通过At least once配合下游应用的幂等机制来实现。

API

https://kafka-python.readthedocs.io/en/master/usage.html

获取更多感兴趣的文章,请扫描如下二维码!

elasticsearch必知必会的干货知识二:es索引操作技巧(代码片段)

该系列上一篇文章《Elasticsearch必知必会的干货知识一:ES索引文档的CRUD》讲了如何进行index的增删改查,本篇则侧重讲解说明如何对index进行创建、更改、迁移、查询配置信息等。仅创建索引:PUTindexPUT/index添加字段设置(mappings... 查看详情

《正则表达式必知必会》读书笔记(代码片段)

注:《正则表达式必知必会》这本书很适合入门正则表达式,比网上很多教程都适合。其实正则表达式主要学习的就是各种元字符的使用,最后搭配起来就是一个完整的正则表达式。前8章重点学习掌握;第9章也... 查看详情

必知必会的设计原则——合成复用原则(代码片段)

 设计原则系列文章 必知必会的设计原则——单一职责原则必知必会的设计原则——开放封闭原则必知必会的设计原则——依赖倒置原则必知必会的设计原则——里氏替换原则必知必会的设计原则——接口隔离原则必知必... 查看详情

mysql必知必会语法和基础知识大总结(代码片段)

概述主键:唯一区分表中每个行(不可重复,不允许nullmysql:基于客户-服务器的数据库系统使用mysqlmysql是部署在主机上的,可以通过ssh建立mysql连接#显示数据库showdatabases;#选择数据库usedatabases;#显示库中的表s... 查看详情

mysql必知必会语法和基础知识大总结(代码片段)

概述主键:唯一区分表中每个行(不可重复,不允许nullmysql:基于客户-服务器的数据库系统使用mysqlmysql是部署在主机上的,可以通过ssh建立mysql连接#显示数据库showdatabases;#选择数据库usedatabases;#显示库中的表s... 查看详情

持续更新,建议收藏python必知必会的知识点,极大提升开发效率(代码片段)

问题本文主要介绍Python编程的一些必知必会的知识点,方便后续编程,提升效率。方法字符串转整数#字符串是普通整数a=int('1000')print(a)#1000#字符串是二进制b=int('1000',2)print(b)#8#整数转固定长度的二进制... 查看详情

springmvc--必知必会(代码片段)

  SpringMVC基于模型--视图--控制器(Model-View-Controller,MVC)模式实现,属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无需实现任何接口。同时它还支持... 查看详情

持续更新,建议收藏python必知必会的知识点,极大提升开发效率(代码片段)

问题本文主要介绍Python编程的一些必知必会的知识点,方便后续编程,提升效率。方法整数列表join设有一个整数列表,实现连接所有整数形成一个字符串,如下:d=[1,2,3,4]print(''.join(d))很遗憾,上... 查看详情

小白学python:这10个pandas函数属于必知必会!(代码片段)

Hello大家好,今天我将和大家一起学习竞赛中的各种基础知识点,从基础库使用到具体的比赛案例。今天我们将学习Pandas,一个非常强大的数据分析、数据清洗和读取的工具,也是在Kaggle竞赛中必备的库。在这篇... 查看详情

h5系列之history(必知必会)(代码片段)

H5系列之History(必知必会)目录概念兼容性属性方法H5方法概念理解HistoryApi的使用方式目的是为了解决哪些问题作用:ajax获取数据时,可以改变历史记录,从而可以使用浏览器的后退和前进。【】规范地址:http://www.w3.org/TR/html5... 查看详情

java开发者必知必会的50个redis知识点,面试/学习都无所畏惧(代码片段)

推荐阅读关于"高并发系统设计"看这篇就够了,阿里、百度、美团都在用Redis作为目前的主流NoSql数据库,不会是不可能的,在面试中也是非常高频的,一定不能在这个环节丢分,不管是学习,还是面试,以下知识点,都... 查看详情

必知必会的mysql知识②使用mysql(代码片段)

...连接MySQLMySQL数据库基本命令小结前言根据上一篇文章【必知必会的MySQL知识】①初探MySQL的内容,想必您对MySQL数据库有了一个整体的了解了,并且应该在自己电脑上已经安装上了MySQL。这一篇呢我们来说一说这么连接上数据库并... 查看详情

scala必知必会(代码片段)

文章目录入门概述安装JavaVSScalaval和var基本数据类型lazy在Scala中的应用开发工具IDEAMaven函数方法定义默认参数命名参数可变参数条件语句循环语句面向对象概述类的定义和使用抽象类伴生类和伴生对象case和trait集合数组ListSetMapOpt... 查看详情

android必知必会-recyclerview恢复上次滚动位置(代码片段)

如果移动端访问不佳,请访问–>Github版记录RecyclerView滚动位置并恢复是一个很常见的需求,通常需要精准恢复到上次的位置。预计会用到RecyclerView相关的三个知识点:监听RecyclerView滚动状态监听RecyclerView完成绘制... 查看详情

threadlocal必知必会(代码片段)

前言自从被各大互联网公司的"造火箭"级面试难度吊打之后,痛定思痛,遂收拾心神,从基础的知识点开始展开地毯式学习。每一个非天才程序猿都有一个对35岁的恐惧,而消除恐惧最好的方式就是面对它、看清它、乃至跨过它... 查看详情

mysql必知必会(初级篇)(代码片段)

mysql1.基本概念2.SQL语言2.1DCL(数据控制语言)2.1.1创建用户2.1.2使用grant命令给用户授权2.1.3使用revoke命令撤销权限2.2DDL(数据定义语言)2.2.1mysql常用约束类型2.2.2使用alter命令修改表结构2.2.3使用drop命令删除表2.3DML(数据操纵语言)2.3.1使... 查看详情

:mysql数据库第21节:mysql-必知必会(上)

大家好,很高兴我们可以继续学习交流Java高频面试题。第五章主要是对MySQL数据库进行浅析,我们主要针对面试中常见的MySQL知识点进行交流分析。在对高频面试题分析的过程中,加入实际工作中经常需要使用到的MySQL优化等知... 查看详情

carson带你学java:关于string类的必知必会!(代码片段)

概述关于String类的必知必会主要包括:String的常用函数equals()与==的区别String、StringBuffer与StringBuilder的区别Switch能否用string做参数?1.String常用函数2.equals()与==的区别附:/***附1:Object的equalsÿ 查看详情