Kafka系列(一)【消息队列、Kafka的基本概念、Kafka的工作机制、Kafka可满足的需求、Kafka的特性、Kafka的应用场景】

kafka系列 一

    • 一、消息队列
      • 1. 消息队列的来源
      • 2. 什么是消息队列
      • 3. 消息队列主要有哪些作用
    • 二、Kafka的基本概念
      • 代理、生产者、消费者、消费者组
      • 主题、分区、副本、记录
    • 三、了解 Kafka的工作机制-生产消息/消费消息
    • 四、Kafka可满足的需求
    • 五、Kafka的特性
    • 六、Kafka的场景

转自《Kafka并不难学!入门、进阶、商业实战》

一、消息队列

1. 消息队列的来源

在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞。
例如,大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(TooMany Connections)错误。
因此,在高并发的应用场景中需要一个缓冲机制,而消息队列则可以很好地充当这样一个角色。消息队列通过异步处理请求来缓解系统的压力。

2. 什么是消息队列

“消息队列”(Message Queue,MQ)从字面来理解,是一个队列,拥有先进先出(FirstInputFirst Output,FIFO)的特性。它主要用于不同进程或线程之间的通信,用来处理一系列的输入请求。
消息队列采用异步通信机制。即,消息的发送者和接收者无须同时与消息队列进行数据交互,消息会一直保存在队列中,直至被接收者读取。每一条消息记录都包含详细的数据说明,包括数据产生的时间、数据类型、特定的输入参数。

3. 消息队列主要有哪些作用

在实际的应用中,消息队列主要有以下作用。

  1. 应用解耦:多个应用可通过消息队列对相同的消息进行处理,应用之间相互独立,互不影响;
  2. 异步处理:相比于串行和并行处理,异步处理可以减少处理的时间;(不需要等待响应)
  3. 数据限流:流量高峰期,可通过消息队列来控制流量,避免流量过大而引起应用系统崩溃;
  4. 消息通信:实现点对点消息队列或聊天室等。

二、Kafka的基本概念

Kafka 是一个分布式实时数据流平台,可独立部署在单台服务器上,也可部署在多台服务器上构成集群。它提供了发布与订阅功能。用户可以发送数据到 Kafka 集群中,也可以从Kafka集群中读取数据。

代理、生产者、消费者、消费者组

  1. 代理 (Broker)

在Kafka集群中,一个Kafka进程(Kafka进程又称为 Kafka实例)被称为一个代理(Broker)节点。代理节点是消息队列中的一个常用概念。通常,在部署分布式 Kafka 集群时,一台服务器上部署一个Kafka 实例。

  1. 生产者 (Producer)

在Kafka 系统中,生产者通常被称为 Producer。
Producer 将消息记录发送到 Kafka 集群指定的主题(Topic)中进行存储,同时生产者(Producer)也能通过自定义算法决定将消息记录发送到哪个分区(Partition)。

  1. 消费者(Consumer)

消费者(Consumer)从 Kafka 集群指定的主题(Topic)中读取消息记录。在读取主题数据时,需要设置消费组名(Groupd)。如果不设置,则 Kafka 消费者会默认生成一个消费组名称。

  1. 消费者组(Consumer Group)

消费者程序在读取 Kafka 系统主题 (Topic)中的数据时,通常会使用多个线程来执行。一个消费者组可以包含一个或多个消费者程序,使用多分区和多线程模式可以极大提高读取数据的效率。

主题、分区、副本、记录

  1. 主题 (Topic)

Kafka 系统通过主题来区分不同业务类型的消息记录。
例如,用户登录数据存储在主题 A 中,用户充值记录存储在主题 B 中,则如果应用程序只订阅了主题A,而没有订阅主题 B,那该应用程序只能读取主题A 中的数据。

  1. 分区(Partition)

每一个主题(Topic)中可以有一个或者多个分区(Partition)。在 Kafka 系统的设计思想中,分区是基于物理层面上的,不同的分区对应着不同的数据文件。
Kafka 通过分区(Partition)来支持物理层面上的并发读写,以提高Kafka 集群的吞吐量
每个主题(Topic)下的各分区(Partition)中存储数据的具体流程在这里插入图片描述每个分区(Partition)内部的消息记录是有序的,每个消息都有一个连续的偏移量序号(Offset)
一个分区只对应一个代理节点 (Broker),一个代理节点可以管理多个分区。

  1. 副本(Replication)

在 Kafka 系统中,每个主题 (Topic)在创建时会要求指定它的副本数,默认是 1。通过副本(Replication)机制来保证 Kafka 分布式集群数据的高可用性。

  1. 记录(Record)

被实际写入到 Kafka 集群并且可以被消费者应用程序读取的数据,被称为记录(Record)。每条记录包含一个键(Key)、值 (Value)和时间戳(Timestamp)

三、了解 Kafka的工作机制-生产消息/消费消息

Kafka 作为一个消息队列系统,其核心机制就是生产消息和消费消息。
在Kafka 基本结构中,生产者(Producer)组件和消费者(Consumer)组件互不影响,但又是必须存在的。缺少生产者和消费者中的任意一方,整个Kafka 消息队列系统将是不完整的。

  • 生产者 (Producer)负责写入消息数据。将审计日志、服务日志、数据库、移动 App 日志,以及其他类型的日志主动推送到 Kafka 集群进行存储。

  • 消费者(Consumer)负责读取消息数据。例如,通过 Hadoop 的应用接口、Spark 的应用接口、Storm 的应用接口、ElasticSearch 的应用接口,以及其他自定义服务的应用接口,主动拉取 Kafka 集群中的消息数据

另外,Kafka 是一个分布式系统,用 Zookeeper 来管理、协调 Kafka集群的各个代理(Broker)节点。当 Kafka 集群中新添加了一个代理节点,或者某一台代理节点出现故障时,Zookeeper服务将会通知生产者应用程序和消费者应用程序去其他的正常代理节点读写。

四、Kafka可满足的需求

  1. 高吞吐量

日常生活中所使用的支付宝、微信、QQ 这类软件的用户量非常庞大,每秒产生的数据流量也非常巨大。面对这类场景,若要实时地聚合消息日志,必须具有高吞吐量才能支持高容量事件流。

  1. 高可用队列

分布式消息队列系统都具有异步处理机制。另外,分布式消息队列系统一般都拥有处理大量数据积压能力,以便支持其他离线系统的定期数据加载。

  1. 低延时

实时应用场景对时延的要求极为严格。耗时越少,则结果越理想。这意味着,设计出来的系统必须拥有低延迟处理能力。

  1. 分布式机制

系统还需具有支持分区、分布式、能实时处理消息等特点,并能在机器出现故障时保证数据不丢失。

五、Kafka的特性

  1. 异步生产数据

从Kafka 0.8.2起,生产者 (Producer)写数据时不再区分同步和异步,所有的操作请求均以异步的方式发送,这样大大地提高了客户端写数据的效率。
异步方式将数据批量的发送到 Kafka 不同的代理 (Broker)节点因此也减少了 Kafka 服务端的资源开销。这种方式在与 Kafka 系统进行网络通信时,能够有效地减少等待时间。

  1. 偏移量迁移
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

六、Kafka的场景

在这里插入图片描述

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

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

相关文章

[MFC] MFC消息机制的补充

之前写了[MFC] 消息映射机制的使用和原理浅析,还有些需要补充的,都记在这里。 MFC 消息的分类 MFC消息分为系统消息和自定义消息。 图片来源:C语言/C教程 大型源码案例分析:MFC消息系统的代码解析 易道云编程 系统消息分为窗口…

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命 开源软件如何推动技术创新开源软件的开放性和协作精神促进知识共享和技术迭代推动关键技术的发展开源软件与新技术的融合 开源软件的商业模式开源软件的商业模式将开源软件与商业软件相结合 开源软件的安全风…

2023年哪个前端框架用的最多?

2023 年,TypeScript 的每月下载量持续稳定增长,年度累计下载量高达2,071,832,110(20.7 亿),展现了强大的市场需求和用户认可。 本文来通过详细的数据(2023 年 npm 累计下载量),看看…

idea中找到所有的TODO

idea中找到所有的TODO (1)快捷键 Alt6 (2)View -> Tool Windows -> TODO

LNMP.

一.mysl配置 1.安装mysql yum install mysql-server -y 2.进入mysql配置文件目录 cd /etc/my.cnf.d3.编辑mysql配置文件 vim mysql-server.cnf 在[mysqld]中添加: character-set-serverutf84.启动mysql服务 systemctl start mysqld5.登入mysql mysql 6.创建数据库 cre…

2023年09月CCF-GESP编程能力等级认证Python编程五级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话。 HTTP协议是无状态的,导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

新产品!可视化试卷搭建平台

hi, 大家好, 我是徐小夕. 之前和大家分享了很多可视化低代码和零代码的技术实现和产品设计思路, 也和大家分享了 H5-Dooring 零代码搭建平台的技术实现和未来规划, 今天继续和大家分享一下我们的新产品——橙子试卷. 橙子试卷 是一款可视化试卷/问卷搭建平台, 我们可以通过拖拽…

HttpRunner自动化测试之实现参数化传递

参数化实现及重复执行 参数化测试:在接口测试中,为了实现不同组数据对同一个功能模块进行测试,需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化: 1、在YAML/JSON 中直接指定参数列表 2、…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-应用弹窗(十一)

一、应用弹窗 1、概述 在我们日常使用应用的时候,可能会进行一些敏感的操作,比如删除联系人,这时候我们给应用添加弹窗来提示用户是否需要执行该操作,如下图所示: 弹窗是一种模态窗口,通常用来展示用户…

树状数组复习

基本原理 树状数组的原理简单来说就是利用二进制拆分区间 我们可以对一个数进行二进制分解,最多分解成log(x)个数,同样我们可以对[1,n]这个区间进行分解。也是最多log段,每次修改时我们维护受到影响的区间,然后查询时用这log个区…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉

专属领域论文订阅 关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起…

论文阅读:Learning Lens Blur Fields

这篇文章是对镜头模糊场进行表征学习的研究,镜头的模糊场也就是镜头的 PSF 分布,镜头的 PSF 与物距,焦距,光学系统本身的像差都有关系,实际的 PSF 分布是非常复杂而且数量也很多,这篇文章提出用一个神经网络…

数仓建模维度建模理论知识

0. 思维导图 第 1 章 数据仓库概述 1.1 数据仓库概述 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据,借助数据仓库的分析能力,企业可从数据中获得宝贵的信息进而改进决策。同时,随着时间的…

算法42:天际线问题(力扣218题)---线段树

218. 天际线问题 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] [lefti, righti, heig…

【学网攻】 第(20)节 -- 网络端口地址转换NAPT配置

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

C语言应用实例——贪吃蛇

(图片由AI生成) 0.贪吃蛇游戏背景 贪吃蛇游戏,最早可以追溯到1976年的“Blockade”游戏,是电子游戏历史上的一个经典。在这款游戏中,玩家操作一个不断增长的蛇,目标是吃掉出现在屏幕上的食物&#xff0c…

CTF(5)

一、[SWPUCTF 2021 新生赛]ez_caesar 1、题目 import base64 def caesar(plaintext):str_list list(plaintext)i 0while i < len(plaintext):if not str_list[i].isalpha():str_list[i] str_list[i]else:a "A" if str_list[i].isupper() else "a"…

C++学习Day01之初识C++ Helloworld

目录 一、程序二、输出三、分析与总结 一、程序 #include <iostream> //标准输入输出流 i - input 输入 o - output 输出 stream 流 相当于 stdio.h using namespace std; //使用 标准 命名空间 //程序入口函数 int main() {// cout 标准输出流对象// <&l…

Java学习-案例-ATM系统

案例ATM系统 大致思路&#xff1a; 实现功能&#xff1a; 案例代码&#xff1a; Account类&#xff1a; packageatmDemo; publicclassAccount{ privateStringcardId; privateStringuserName; privatecharsex; privateStringpassWord; privatedoublemoney; privatedoublelimit; …