开始学习 Kafka,一文掌握基本概念|Kafka 系列 一

news/2024/10/22 16:27:29/

如果你还不了解 Kafka,或者也打算深入探索、系统学习,那么欢迎有同样目标的小伙伴可以加群交流,让学习之路不再孤独。

一个人可能走的很快,但是一群人会走的更远。(后台回复:加群

点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达

为什么学习 Kafka

Kafka 在当下求职市场中可以说是应聘的必备条件之一,想要应聘高薪岗位,就需要熟练掌握这款优秀的消息引擎。

对于当下环境来说,各个公司尤其是互联网公司的数据量越来越大,需要存储和处理大量的数据,但是计算机的瞬时处理能力是有限的,这就需要一款消息引擎来帮助我们缓解流量激增的问题,平滑将数据传导到下游系统中。

消息引擎系统是一组规范:企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。

ec39e4fde907614b8e63b9f279dc885e.png

作为一款消息引擎,它主要有以下使用场景。

  • 异步处理:同步调用转换成异步消息通知,在消费者种实现对应的业务处理。比如在一个交易场景中,系统的调用链路很长,订单创建完成后需要检查商品的库存、扣库存、发短信、App 通知等功能,如果都放在一个接口同步调用,接口响应时间会变得很长。但是如果把这些逻辑都利用消息引擎做异步处理逻辑将变得很轻量级。

  • 应用解耦:减少应用直接的强依赖,利用消息队列通信,从而变成一种松耦合的结构。比如如果用户注册系统和红包系统利用接口同步通信,红包系统挂掉用户将无法注册,造成巨大损失。但是如果用户注册后发出一条注册消息,红包系统恢复后慢慢去消费,则可以解耦,提高系统的可用性。

  • 削峰填谷:利用消息中间件缓冲上游生产者大量流量,从而使消费者消费流量整体平滑。对于消息生产能力很强的上游系统,如果没有消息中间件的保护,下游系统可能会直接被压垮导致全链路服务雪崩。比如秒杀业务场景,上游业务发起下单请求,下游业务执行秒杀业务(库存检查,库存冻结,余额冻结,生成订单等等),下游业务处理的逻辑是相当复杂的,并发能力有限,如果上游服务不做限流策略,瞬时可能把下游服务压垮。针对此场景,我们可以利用 MQ 来做削峰填谷,让高峰流量填充低谷空闲资源,达到系统资源的合理利用。

综合以上场景,这就要求一款消息引擎需要具备高可靠、高性能的特点,Kafka 就满足这样的要求。

设计消息系统应该注意什么?

消息系统的不同成员之间需要利用消息进行信息的传递,这就涉及到两个重要的内容:

  1. 消息传递的格式是什么?

  2. 消息是如何传递的,协议是什么?

aaf20838b749307465c277d89f7d13ef.png

消息传递的格式选择有很多,比如 JSON、XML、Protobuf 等,对于 Kafka 来说,他使用的是纯二进制的字节序列,当然消息还是结构化的,只是在使用之前都要将其转换成二进制的字节序列。

消息系统中,有两种常用的传输协议,点对点模型和发布订阅模型。这两种协议,Kafka 都支持。

  1. 点对点模型:也叫消息队列模型。一个系统发送方发送的消息只能被指定接收方接收,其他任何系统都不能再读取 发送的消息。

5be501d7505f341c72bbad039f6bd82b.png
  1. 发布 / 订阅模型:有一个主题(Topic)的概念,发送方也称为发布者(Publisher),接收方称为订阅者(Subscriber)。和点对点模型不同的是,这个模型可能存在多个发布者向相同的主题发送消息,而订阅者也可能存在多个,它们都能接收到相同主题的消息。举个例子,杂志订阅就是一种典型的发布 / 订阅模型,不同的居民可以订阅相同的杂志。

4748646e1abca207952e865ef5806829.png

Kafka 的基本概念和结构

生产者和消费者

学习 kafka 首先要明白其涉及的概念和术语,这是进入 Kafka 世界的门票。

作为一款消息系统,Kafka 提供了完整的消息发布和订阅解决方案。与其他消息系统一样,在这个系统中会有生产者和消费者以及 Topic 的角色。

  • 消息(Record):信息传递的载体。

  • 生产者(Producer):向一个或多个 Topic 发布消息的应用程序。

  • 消费者(Consumer):订阅一个或多个 Topic 接收消息的应用程序。

  • 主题(Topic):发布订阅的主题,同类型消息存储在同样的主题中,是一个逻辑上的划分,区分不同的业务。

消费者和生产者都是客户端(Clients),既然有客户端就有服务端。

Broker 服务端

服务实例(Broker):Kafka 的服务器端由被称为 Broker 的服务进程构成,一个 Kafka 集群由多个 Broker 组成。

Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。Broker 通常分散运行在不同的机器上,这样如果集群中某一台机器宕机,其他机器上的 Broker 也可以对外提供服务。这种多个 Broker 部署方式的方式保证了 Kafka 的高可用。44477980b4547311d354018547b9c243.png

分片和副本

分区or 分片(Partition):。kafka 将 一个Topic 中的消息分成多份,分别存储在不同的 Broker 里,这每一段消息被 kafka 称为 Partition。每个 Partition 都一个有序不变的消息序列,每个 Topic 下可以有多个 Partition。多个分片满足可扩展性和负载均衡。

fba48423ec41ab9700afce30dcc30225.png

为什么要有 Partition?因为一个 Topic 中的消息可能非常多,多到一台Broker存不下,因此需要拆分成多段存储在不同的机器里,并且这样做还能提高读写性能。

  • 副本(Replica):Kafka 中同一条消息能够被拷贝多份冗余存储,也就是副本。副本分为领导者副本(Leader Replica)和追随者副本(Follower Replica)。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。(默认分区副本数不得超过kafka节点数),多个副本满足高可用,副本数量越多,可靠性越高。

    • 领导者副本(Leader Replica):只有Leader能对客户端提供服务。生产者总是向领导者副本写消息,消费者总是从领导者副本读消息。

    • 追随者副本(Follower Replica):Follower 只能向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步,不对客户端提供服务。

位移

由于 Kafka 中的消息都是增量存储的,所以读取和消费消息都有一个位移的概念。

6efc02902036af021d1b96dceab98a79.png
  • 消息位移(Offset):表示 每个Partition中每条消息的位置信息,是一个单调递增且不会改变的值。

  • 消费者位移(Consumer Offset):表示消费者消费的进度,每个消费者都有自己的消费者位移。

  • 消费者组(Consumer Group):多个消费者实例共同组成的一个消费者组,同时消费多个分区以实现高吞吐量。

最后,欢迎大家提问和交流。

加入讨论群是升职加薪第一步!

回复:加群

d9bcc29f26cccc0dc365b89fd1e1200f.jpeg

点赞是一种美德,如对您有帮助,欢迎评论和分享,感谢阅读!

面试没有分库分表经验,那这篇不能错过!|金三银四系列

2023-06-26

6b9bc91594a60be32b34922dc07d8df8.jpeg

从二叉查找树到B*树,一文搞懂搜索树的演进!|原创

2023-05-23

fdebd04f7d0c6f10e7d5f0f2ad500688.jpeg

程序员,停止焦虑吧!|原创

2023-04-24

5115d091802039b7b210d0c4f2dea918.jpeg

http://www.ppmy.cn/news/1000584.html

相关文章

双端冒泡排序

双端冒泡排序是对传统冒泡排序的改进,其主要改进在于同时从两端开始排序,相对于传统冒泡排序每次只从一端开始排序,这样可以减少排序的遍历次数。 传统冒泡排序从一端开始,每次将最大(或最小)的元素冒泡到…

spring-cache框架使用笔记

spring-cache框架使用笔记 什么是spring-cache框架 spring-cache是spring框架中的一个缓存抽象层, 它提供了一种简便的方式来集成不同的底层缓存实现, 如内存缓存(concurrentMap/ehcache/caffeine)/分布式缓存(redis/couchbase)等 它简化了在app中使用…

免费的ssl证书

免费的SSL证书对于保证网站的安全性和信任度来说是非常重要的。虽然有些人可能会认为,免费的SSL证书可能不如付费的证书有效,但事实并非如此。 首先,免费的SSL证书同样能够为网站提供加密与解密的功能。这意味着所有的数据将会在传输过程中被…

JavaScript 面向对象

一、对象 1.新建一个对象 // An object literal with two key-value pairs let spaceship {Fuel Type: diesel,color: silver }; We separate each key-value pair in an object literal with a comma (,) Keys are strings, but when we have a key that does not have any…

【云原生】Kubernetes中deployment是什么?

目录 Deployments 更新 Deployment 回滚 Deployment 缩放 Deployment Deployment 状态 清理策略 金丝雀部署 编写 Deployment 规约 Deployments 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态,而 De…

C# 文件读写 程序

//读写文件 public class ReadWriteFile { public static List<string> ReadFile(string path) { try { using (FileStream fileStream new FileStream(path, FileMode.Open, FileAccess.Read)) { Lis…

【Java多线程学习5】什么是悲观锁,什么是乐观锁?如何实现乐观锁、乐观锁存在哪些问题

【Java多线程学习5】什么是悲观锁&#xff0c;什么是乐观锁&#xff1f;如何实现乐观锁、乐观锁存在哪些问题 一、什么是悲观锁 概述 悲观锁总是假设最坏的情况&#xff0c;认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改)&#xff0c;所以每次在获取资源操作…

docker: Error response from daemon: No command specified.

执行 docker run -it -d -v /home/dell/workspace/workspace/test_192.168.1.202_pipeline:/home/workspace1 --name test_192.168.1.202_pipeline_10 qnx:7.1报错 问题定位&#xff1a;export导入的镜像需要带上command&#xff0c;以下命令查看command信息 docker ps --no…