当前位置: 首页 > news >正文

消息中间件(二)——kafka

文章目录

    • Apache Kafka综述
      • 什么是消息系统?
        • 点对点消息类型
        • 发布-订阅消息类型
      • 什么是Kafka?
        • 优点
        • 关键术语
        • Kafka基本原理
        • 用例

Apache Kafka综述

在大数据中,会使用到大量的数据。面对这些海量的数据,我们一是需要做到能够收集这些数据,其次是要能够分析和处理这些海量数据。在此过程中,需要一套消息系统。

Kafka专门为分布式高吞吐量系统设计。作为一个消息代理的替代品,Kafka往往做的比其他消息中间件做的更好。

与其他消息队列产品相比,它主要有以下优点:

  • 吞吐量高
  • 内置分区
  • 复制能力
  • 固有的容错能力

因此,Kafka非常适合大规模的消息处理应用

什么是消息系统?

消息系统负责将数据从一个应用传递到另一个应用,应用就可以专注于数据,而不用担心数据如何共享。分布式消息传递基于可靠消息队列的概念。消息在客户端应用程序和消息传递系统之间异步排队。
有两种类型的消息模式可用:

  • 点对点模式
  • 订阅-发布模式(pub-sub),也是最常用的一种消息模式
点对点消息类型

在点对点的消息传递类型中,所有的消息都保留在消息队列中。一个或多个消费者可以消耗队列中的消息,但特定的消息只能有最多一个消费者消费。一旦消费者消费了队列中的消息,该消息将会在消息队列中消失。
点对点消息系统最典型的例子是订单处理系统,其中每个订单将有由订单处理器处理,但多个订单处理器也可以同时工作。
在这里插入图片描述

发布-订阅消息类型

在发布-订阅系统中,消息被保留在各个主题中。
与点对点系统不同的是,一个订阅者可以订阅一个或多个不同主题中的消息并使用这些主题中的所有消息。
在发布-订阅系统中,消息的生产者称为发布者,消息的使用者称为订阅者。
一个现实的例子是dish天线电视,它发布不同的渠道和主题,如运动、音乐、电影等,任何人都可以订阅自己需要的主题集,并接收到订阅主题的消息。
在这里插入图片描述

什么是Kafka?

Kafka is a distributed,partitioned,replicated commit logservice.

  1. Apache Kafka 是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使你能够将消息从一个端点传递到另一个端点。
  2. Kafka 适合离线和在线消息消费
  3. Kafka 消息保留在磁盘上,并在群集内复制以防止数据丢失。
  4. Kafka 构建在 ZooKeeper 同步服务之上。 它与 Apache Storm 和 Spark 非常好地集成,用于实时流式数据分析。
优点
  • 可靠性
    Kafka是分布式、分区复制、可容错的
  • 可扩展性
    消息传递系统可以轻松扩缩容,不用关机
  • 耐用性
    Kafka使用“分布式提交日志”,这意味着消息会尽可能快地保留在磁盘上,因此它是持久的。
  • 高性能
    Kafka无论是发布还是订阅消息的吞吐量都是很高的。即使存储了很多TB的消息,还是能够保证高性能。

Kafka非常快,并且能保证零停机和零数据丢失

关键术语
  1. 生产者和消费者:Productor & Customer
    在Kafka中,消息的发布者称为生产者Productor,消息的接受和使用者称为消费者Customer
  2. broker:
    Kafka消息队列集群中有很多台server,每一台server都可以存储消息,这每一台server都可以称做是Kafka的一个实例,也称为broker
  3. 主题:topic
    一个topic中会保存同一类的消息,相当于对消息进行分类。productor在向Custom发送消息的时候,需要指定topic,也就是制定了该消息属于哪一分类。
  4. 分区:partition
    每个topic都划分为多个partition,每个partition在存储层面都是一个append log文件。任何写进某partition的消息都会被追加在一个log文件的尾部。
    分区的意义:Kafka基于文件进行存储,当文件内容过大的时候,很容易达到单个磁盘的上限。使用分区进行存储,一个分区存储一个文件,保证单个文件不会过大的情况下,还能将数据存在不同的broker = Kafka server上,从而实现了负载均衡,能够承载更多的消费者
  5. 偏移量:offset
    一个分区存储一个文件,而消息在文件中的位置就称为是偏移量offset,offset的字符类型为long长字符类型,它可以唯一标记一条消息。由于Kafka并没有提供额外的消息索引机制,因此文件只能顺序读写,所以Kafka基本不允许对消息进行“随机读写”。

小结Kafka:

  • 是基于发布-订阅分布式消息队列
  • 面向大数据,消息存储在topic中,而每个topic会分为多个patition分区;
  • 消息存储在磁盘中,每个partition分区对应一个磁盘上的一个文件来存储消息,消息的写入就是在log文件后追加内容,文件可以在集群内复制防止丢失;
  • 即使消息被消费,消息也不会立刻消失,可以通过配置以实现自动删除来释放空间
  • Kafka依赖分布式协调服务zookeeper,适合离线/在线消息的消费,与storm/spark等实时流式数据处理工具常常结合使用。
Kafka基本原理
  1. 分布式和分区:distributed、partitioned
    Kafka是一个分布式的发布-订阅消息队列,主要体现在哪些方面?
    体现在大量的数据被保存在磁盘上,但单个磁盘的容量是有限的,于是消息被生产者生产的时候分为不同的topic主题来保存,每个topic又被分为多个partition分区,而每个partition分区对应一个文件,以文件的方式来保存消息数据,每个文件又可以被保存在不同的broker上,这样就实现了Kafka集群来分布式存储消息队列。
    另外,每个partition都有一定的副本,可以备份到不同的borker上,从而提高可用性。
    总的来说就是,一个topic对应的多个partition上的文件分散保存在集群的多个不同broker上,存储的方式是一个partition对应一个文件,每个broker负责存储在自己机器上的每个文件的读写。

  2. 副本:replicated
    Kafka可以通过配置指定partition的备份个数(replicas),每个partition将会被备份到多台机器上,提高了可用性,备份数量通过配置文件可以指定。
    实质上,冗余备份在分布式系统中很常见。
    有副本的存在,就会涉及到同一个文件的多个副本如何管理和调度
    Kafka设置了“leader机制”,每个partition选举一个broker作为leader,用来负责对该分区的读写,其余broker则作为follower,只需简单地和leader同步即可。如果原来的leader失效,partition则会选举新的broker成为leader。
    至于如何选取 leader,实际上如果我们了解 ZooKeeper,就会发现其实这正是 Zookeeper 所擅长的,Kafka 使用 ZK 在 Broker 中选出一个 Controller,用于 Partition 分配和 Leader 选举。
    实际上,作为leader的server,承担了整个分区的所有读写请求,负担是比较大的。从整体考虑,有多少个partition就有多少个leader,Kafka将leader分摊到不同的broker上,也算是整体上的一种负载均衡。

  3. Kafka数据流处理
    在这里插入图片描述
    (1)数据产生方式:produce

生产者写入消息数据可以指定4个参数,分别为topic,partition,key,value。其中topic和value(要写入的数据)必须指定,而key和partition是可选的。
对于一条记录,要先对其进行序列化,再按照topic和partition,发送到对应的队列中去。如果没有指定partition,有两种情况:

  • 指定key,按照key进行哈希,同一个key的消息进一个partition

  • 未指定key, round-robin进行partition的选择
    producer将会和topic下的每个partiton leader保持socket连接,消息由producer直接发送给broker。
    其中partition leader的身份在zookeeper中已经注册,producer作为zookeeper client,已经注册了watch用来监听partition leader的变更事件,因此可以准确知道leader是谁。
    producer端采用异步发送,先将一部分的消息存在客户端的buffer里,并将其分批发送给broker,小数据io很多会增加整体网络的延迟,批量延迟发送实际上是提供了网络效率。
    (2)数据消费过程:custome

  • 对于消费者,不是以单独形式存在的,每个消费者都属于一个消费群租customer group,一个group包含多个consumer。需要注意的是,消费者的订阅topic行为都是以customer group的形式来订阅的,发送到topic的消息,只会被订阅该topic的每个group中的每个customer消费。

  • 如果说所有的customer都有共同的group,那么就像是一个点对点的消息系统;如果每个消费者都属于不同的group,那么消息会广播给所有的消费者。

  • 实际上消息是根据partition来分的,一个partition只能被消费组里的一个消费者消费,但是可以多个不同的消费组消费,消费组里的每个消费者是关联到一个partition的;因此有一个说法:对同一个topic,同一个group中不能有多于partitions个数的customer同时消费,否则某些customer将无法得到消息。

  • 同一个消费组的两个customer不能同时消费一个partition

  • partition 中的消息只有一个 consumer 在消费,且不存在消息状态的控制,也没有复杂的消息确认机制,可见katka broker 端是相当轻量级的。当消息被 consumer 接收之后,需要保存 Offset 记录消费到哪,以前保存在ZK中,由于 ZK 的写性能不好,以前的解决方法都是Consumer 每隔一分钟上报一次,在0.10 版本后,Kafka 把这个Offset 的保存,从ZK 中剥离,保存在一个名叫 consumeroffsets topic 的Topic 中,由此可见consumer 客户端也很轻量级

用例

Kafka可以在很多场景中使用,以下列出一些用例:

  • 指标
    Kafka通常用于操作监控数据。这涉及到聚合来自分布式应用程序的统计信息,以产生操作数据的集中馈送。
  • 日志聚合解决方案
    可用于跨组织收集多个服务的日志,且以标准格式提供给多个服务器。
  • 流处理
    流行的框架(如Storm和Spark Streaming)从主题中读取数据,对其进行处理,并将处理后的数据写入新主题,供用户和应用程序使用。 Kafka的强耐久性在流处理的上下文中也非常有用。

相关文章:

消息中间件(二)——kafka

文章目录 Apache Kafka综述什么是消息系统?点对点消息类型发布-订阅消息类型 什么是Kafka?优点关键术语Kafka基本原理用例 Apache Kafka综述 在大数据中,会使用到大量的数据。面对这些海量的数据,我们一是需要做到能够收集这些数据&#xf…...

量化交易全流程(四)

本节目录 数据准备(数据源与数据库) CTA策略 数据源: 在进行量化分析的时候,最基础的工作是数据准备,即收集数据、清理数据、建立数据库。下面先讨论收集数据的来源,数据来源可分为两大类:免…...

idea 如何在命令行快速打开项目

背景 在命令行中从git仓库检出项目,如何在该命令行下快速用idea 打开当前项目,类似vscode 可以通过在项目根目录下执行 code . 快速打开当前项目。 步骤 以macos 为例 vim /usr/local/bin/idea 输入如下内容 #!/bin/sh open -na "IntelliJ IDE…...

YOLOV8-DET转ONNX和RKNN

目录 1. 前言 2.环境配置 (1) RK3588开发板Python环境 (2) PC转onnx和rknn的环境 3.PT模型转onnx 4. ONNX模型转RKNN 6.测试结果 1. 前言 yolov8就不介绍了,详细的请见YOLOV8详细对比,本文章注重实际的使用,从拿到yolov8的pt检测模型&…...

数量关系 --- 方程

目录 一、代入排除法 例题 练习 二、数字特性 例题 练习 整除特性 例题 倍数特性 普通倍数 因子倍数 比例倍数 例题 练习 三、方程法 例题 练习 四、 不定方程(组) 例题 练习 一、代入排除法 例题 素数&#xff1a…...

【C语言 模拟实现strlen函数的三种方法】

C语言程序设计笔记---022 C语言之模拟实现strlen函数1、介绍strlen函数2、模拟strlen函数的三种方法2.1、计数器法模拟实现strlen函数2.2、递归法模拟实现strlen函数2.3、指针减指针法模拟实现strlen函数 3、结语 C语言之模拟实现strlen函数 前言: 通过C语言字符串…...

MySQL数据库与表管理《三国志》为例

在数据库管理中,一个典型的应用场景是游戏数据的存储和管理。以经典游戏《三国志》为例,该游戏具有多个角色、任务、装备等元素,如何有效地存储和管理这些数据就成为了一个问题。 本文将通过《三国志》的实例,详细解释如何在MySQL中进行数据库和表的管理。 文章目录 《三国…...

D. Jellyfish and Mex - DP

题面 分析: 题目最终需要达到MEX位0,也就是从最开始的MEX变成0后m的最小值,可以设 d p i dp_i dpi​表示当前MEX为 i i i时,m的最小值,那么就可以根据前一个状态推出后一个状态,也就是假如当前MEX是 i i …...

奥斯卡·王尔德

奥斯卡王尔德 奥斯卡王尔德(Oscar Wilde,1854年10月16日—1900年11月30日),出生于爱尔兰都柏林,19世纪英国(准确来讲是爱尔兰,但是当时由英国统治)最伟大的作家与艺术家之一&#xf…...

IDEA常用快捷键大全

整理了一些IDEA开发常用的快捷键: 快捷键组合实现效果psvm Tab键 / main Tab键public static void main(String[] args)sout Tab键System.out.println()Ctrl X删除当前行Ctrl D复制当前行AltInsert(或右键Generate)生成代码(如get,set方法,构造函数等)CtrlAltT…...

Java之多线程的综合练习二

练习六:多线程统计并求最大值 需求: 在上一题基础上继续完成如下需求: 每次抽的过程中,不打印,抽完时一次性打印(随机) 在此次抽奖过程中,抽奖箱1总共产生了6个奖项。 分别为:10,20,100,50…...

selenium下载安装 -- 使用谷歌驱动碰到的问题

安装教程参考: http://c.biancheng.net/python_spider/selenium.html 1. 谷歌浏览器和谷歌驱动版本要对应(但是最新版本谷歌对应的驱动是没有的,因此要下载谷歌历史其他版本): 谷歌浏览器历史版本下载: https://www.chromedownloads.net/chrome64win/谷歌浏览器驱动下载: http:…...

开放式耳机怎么选择、300之内最好的耳机推荐

开放式耳机凭借不入耳、不伤耳、安全更舒适的佩戴体验,得到了越来越多音乐爱好者和专业人士的青睐。开放式耳机不需要插入耳道,在佩戴时可以更加自然和轻松,减少了长时间佩戴引起的不适感,而且不会完全隔绝外界声音,用…...

git密码提交切换SSH提交

git保存密码 每次登录都要输入密码是显示繁琐,好在git提供了保存密码的功能。 在本地工程文件夹下,.git目录,保存以下配置。 [credential] helper store或者 在git bash命令行,执行命令 git config credential.helper store如…...

数字乡村包括哪些方面?数字乡村应用介绍

数字乡村是指利用物联网、数字化和智能化技术,借助现代数字智能产品、高效信息服务和物联网基础设施,以提高农村居民生活质量,助力拓展经济发展前景。 创建数字村庄有助于缩小城乡社区之间的差距,保障每个人都能平等地享受科技发展…...

弹性资源组件elastic-resource设计(一)-架构

简介 弹性资源组件提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。 本文介绍弹性资源组件的设计,包括架构设计和详细设计,指导开发人员代码开发 关键词 作业管理器/资源管理器/…...

C/C++笔试面试真题

C/C++笔试面试真题 1、堆和栈的区别 1、栈由系统自动分配,而堆是人为申请开辟; 2、栈获得的空间较小,而堆获得的空间较大; 3、栈由系统自动分配,速度较快,而堆一般速度比较慢; 4、栈是连续的空间,而堆是不连续的空间。 2、什么是野指针?产生的的原因? 野指针的指向的…...

【Vue3】兄弟组件传参

1. 借助父组件传参 A 组件派发一个事件&#xff0c;修改 flag 的值&#xff0c;先传递给父组件&#xff0c;然后由父组件传递给 B 组件。 缺点&#xff1a;必须由 App.vue 处理中间逻辑。 A.vue <template><div class"A"><h1>A组件</h1>…...

【CSS 中 link 和@import 的区别】

<link> 和 import 都可以用于引入 CSS 文件&#xff0c;但是两者有以下区别&#xff1a; 加载时间&#xff1a;<link> 标签在页面加载时同时加载&#xff0c;而 import 是在页面加载后才开始加载。 兼容性&#xff1a;<link> 标签可以被所有的浏览器正确解释…...

笔记二:odoo搜索、筛选和分组

一、搜索 1、xml代码 <!--搜索和筛选--><record id"view_search_book_message" model"ir.ui.view"><field name"name">book_message</field><field name"model">book_message</field><field…...

Ubuntu Zookeeper开机自启动服务

1、创建service文件 在/lib/systemd/system目录下创建zookeeper.service文件 [Unit] DescriptionApache Zookeeper server Documentationhttp://zookeeper.apache.org Requiresnetwork.target remote-fs.target Afternetwork.target remote-fs.target[Service] Typesimple Env…...

关于Matlab与Python中日期转时间戳不一致的问题

由于 Matlab 中的日期序列号精确到秒&#xff0c;而 Python 的时间戳精确到秒&#xff0c;因此在进行转换时可能会存在精度损失&#xff0c;导致转换结果不完全相同。 将 Python 中的时间戳转换为 Matlab 中的日期序列号&#xff0c;可以使用下方代码进行转换&#xff1a; de…...

【Django 笔记】第一个demo

1. pip 安装 2. django 指令 D:\software\python3\anconda3\Lib\site-packages\django\bin>django-adminType django-admin help <subcommand> for help on a specific subcommand.Available subcommands:[django]checkcompilemessagescreatecachetabledbshelldiff…...

算法通过村第十一关-位运算|白银笔记|高频题目

文章目录 前言1. 位移的妙用1.1 位1的个数1.2 比特位计算1.3 颠倒无符号整数 2. 位实现加减乘除专题2.1 位运算实现加法2.2 递归乘法 总结 前言 提示&#xff1a;他不是不想多明白些&#xff0c;但是每每在该用脑子的时候&#xff0c;他用了感情。 --老舍《黑白李》 与位运算和…...

04、EL和JSTL核心技术

目录 1 EL表达式&#xff08;熟悉&#xff09; 1.1 基本概念 1.2 主要功能 1.3 访问内置对象的数据 1.3.1访问方式 1.3.2 执行流程 1.4 访问请求参数的数据 1.5 访问Bean对象的属性 1.5.1 访问方式 1.5.2 主要区别 1.6 访问集合中的数据 1.7 常用的内置对象 …...

【LeetCode热题100】--148.排序链表

148.排序链表 对链表进行排序最适合的算法就是归并排序&#xff1a; 对链表自顶向下归并排序的过程&#xff1a; 找到链表的中点&#xff0c;以中点为分界&#xff0c;将链表拆分成两个子链表&#xff0c;寻找链表的中点可以使用快慢指针的做法&#xff0c;快指针每次移动 2步…...

分布式并行训练(DP、DDP、DeepSpeed)

[pytorch distributed] 01 nn.DataParallel 数据并行初步 数据并行 vs. 模型并行 数据并行&#xff1a;模型拷贝&#xff08;per device&#xff09;&#xff0c;数据 split/chunk&#xff08;对batch切分&#xff09; 每个device上都拷贝一份完整模型&#xff0c;每个device分…...

Linux- fg命令 bg命令

fg fg是Unix-like操作系统&#xff08;如Linux和macOS&#xff09;中的一个shell内建命令&#xff0c;用于将后台作业带到前台执行。这个命令常用于与bg&#xff08;后台执行&#xff09;命令和jobs&#xff08;列出当前作业&#xff09;命令一起&#xff0c;进行shell中的作业…...

leetcode第362场周赛

2873. 有序三元组中的最大值 I 核心思想&#xff1a;由于这题数据范围比较小&#xff0c;直接枚举i,j,k即可。 2874. 有序三元组中的最大值 II 核心思想&#xff1a;这题是在2873题目的基础上将数据范围进行了增加&#xff0c;意味着我们需要对上面的代码进行优化。两种优化方…...

图神经网络GNN(一)GraphEmbedding

DeepWalk 使用随机游走采样得到每个结点x的上下文信息&#xff0c;记作Context(x)。 SkipGram优化的目标函数&#xff1a;P(Context(x)|x;θ) θ argmax P(Context(x)|x;θ) DeepWalk这种GraphEmbedding方法是一种无监督方法&#xff0c;个人理解有点类似生成模型的Encoder过程…...

怎么删除wordpress插件/北京seo薪资

Web 的攻击技术 针对 Web 的攻击技术 1.HTTP 不具备必要的安全功能 2.在客户端即可篡改请求 3.对Web应用的攻击模式 主动攻击被动攻击 以服务器为目标的主动攻击 主动攻击&#xff08;active attack&#xff09;是指攻击者通过直接访问 Web 应用&#xff0c;把攻击代码传入的…...

湛江网站建设招聘/温州seo教程

1 总结&#xff1a;当数组名传入到函数作为参数时&#xff0c;被退化为指向首元素的指针 2 vscode c 工程初始化 https://zhuanlan.zhihu.com/p/87864677 https://zhuanlan.zhihu.com/p/348110926 下载seh 环境变量设置 3 总结&#xff1a;当数组名传入到函数作为参数时&…...

模板网站不利于seo吗/网站域名备案查询

1&#xff09; 临时生效&#xff0c;重启后复原开启&#xff1a; service iptables start关闭&#xff1a; service iptables stop2&#xff09; 永久性生效&#xff0c;重启后不会复原开启&#xff1a; chkconfig iptables on关闭&#xff1a; chkconfig iptables off转载于:h…...

珠海网站外包/二级不死域名购买

本文介绍Spring框架如何解析外部资源文件&#xff0c;仅参考官方文档《第7章 Resources》。 ***************************以下是正文的部分*************************** 通过Spring框架提供的对象可以获取诸如Http&#xff0c;Ftp&#xff0c;File&#xff0c;InputStream&…...

最近做国际网站怎么样/seo网站优化专家

用IE 8打开页面时&#xff0c;有时会出现这样的提示&#xff1a; Message: HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)引起该问题的代码&#xff1a; <ul id"header_userinfo"><li…...

建设企业网站需要什么呢/网络推广方法技巧

Expect介绍&#xff1a; 1、什么是Expect Expect是一个用来实现自动化交互功能的软件套件&#xff0c;基于TCL的脚本编程工具语言&#xff0c;方便学习&#xff0c;功能强大。 2、为什么要使用expcet&#xff1a; 当今的企业运维中&#xff0c;自动化运维已经成为运维的主流趋势…...