https://juejin.cn/post/6958997115012186119

消息队列使用场景

队列,在数据结构中是一种先进先出的结构,消息队列可以看成是一个盛放消息的容器,这些消息等待着各种业务来处理。

消息队列是分布式系统中重要的组件,kafka就可以看做是一种消息队列,其大致使用场景:

  • 解耦
  • 异步通信
  • 削峰填谷

来看一个用户注册业务,在传统的单体项目中,假如注册流程是:

如果用户注册相关处理耗费30ms,发送短信又耗时30ms,那么一个完整的注册业务就耗时60ms,这60ms期间,服务器资源是被这一个注册业务独占的。

如果发送短信的业务出现了故障,那么整个注册业务就不成功:

再来看分布式系统中的注册业务,注册和发短信拆分为两个业务,用户填写完注册信息,将“用户注册”的消息发送到消息队列,然后直接响应给客户端:

这样即使发送短信业务出现了故障,用户的注册业务是完成了的,只不过客户端收到成功通知的时间晚了一会而已。

这就是消息队列用到的解耦和异步通信的场景。

还有一种比较典型的场景就是分布式系统中各个业务产生的各种日志:

这里消息队列起到了一个缓冲的作用,辅助数据库,减少流计算给数据库造成的压力。

Kafka作为消息队列的一种,它也有这么多的使用场景。

关联阅读:RocketMQ入坑系列

kafka架构模型

核心构成部分

先来看一下Kafka核心的东西:

  • Broker
  • Topic
  • Partition
  • Record
  • offset
  • Replication

Broker

一个kafka节点就是一个broker。

Kafka集群中的每一个节点都称之为broker,每个broker都有一个不同的brokerId,由配置参数broker.id指定,是一个不小于0的整数。

每个broker的broker.id必须不同,需要扩展kafka集群的时候只需引入新节点,分配一个不同的broker.id即可。

broker参与kafka集群选举leader。

启动kafka集群时,每一个broker都会实例化并启动一个kafkaController,并将该broker的brokerId注册到zooKeeper的相应节点中。

集群各broker会根据选举机制选出其中一个broker作为leader,即leader kafkaController。

leader kafkaController负责topic的创建与删除、partition分区和副本的管理等。当leader kafkaController宕机后,其他broker会再次选举出新的leader kafkaController。

Topic & Partition

一个topic可以认为是一类消息,每个topic将被分成多个partition,每个partition在存储层面是append log文件。

Record

Kafka的Record就是一条消息,其消息格式可以理解为有key、value和timestamp时间戳组成。

当客户端写入一条record时,kafka根据消息的key进行hash运算,然后在将它和分区个数进行取模运算,用以决定这条消息写到哪个分区(partition)中。

这样的话,既保证了相同的key的消息发送到相同的分区,而且消息写入到哪个分区也是足够随机的。

offset

每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。

partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息。

Kafka集群架构

在kafka中,每个主题可以有多个分区,每个分区又可以有多个副本。

这多个副本中,只有一个是leader,而其他的都是follower副本。仅有leader副本可以对外提供服务。

多个follower副本通常存放在和leader副本不同的broker中。

通过这样的机制实现了高可用,当某台机器挂掉后,其他follower副本也能迅速”转正“,开始对外提供服务。

kafka高性能之道

顺序写mmap

因为硬盘是机械结构,每次读写都会寻址,写入,其中寻址是一个“机械动作”,它是最耗时的。

所以随机I/O会让硬盘重复机械动作比较耗时,顺序I/O的寻址速度就比较快了。

为了提高读写硬盘的速度,Kafka就是使用顺序I/O。每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高。

即便是顺序写入硬盘,硬盘的访问速度还是不可能追上内存。所以Kafka的数据并不是实时的写入硬盘,它充分利用了现代操作系统分页存储来利用内存提高I/O效率。

零拷贝

Kafka服务器在响应客户端读取数据的时候,底层使用的是ZeroCopy技术,也就是数据只在内核空间传输,数据不会到达用户空间。

常规的I/O操作一般是这样的:

  1. 文件在磁盘中的数据被拷贝到内核缓冲区
  2. 从内核缓冲区拷贝到用户缓冲区
  3. 用户缓冲区拷贝到内核与Socket相关的缓冲区
  4. 数据从Socket缓冲区拷贝到相关协议引擎发送出去

这样的操作与用户空间有关,效率不高,Kafka底层使用的零拷贝是这样的:

  1. 文件在磁盘中的数据被拷贝到内核缓冲区
  2. 从内核缓冲区拷贝到与Socket相关的缓冲区
  3. 数据从Socket缓冲区拷贝到相关协议引擎发送出去

整个处理过程没有用到用户空间,效率提升了,这种就是零拷贝。

[转帖]Kafka常见使用场景与Kafka高性能之道的更多相关文章

  1. 【转帖】我以为我对Kafka很了解,直到我看了这篇文章

    我以为我对Kafka很了解,直到我看了这篇文章 2019-08-12 18:05 https://www.sohu.com/a/333235171_463994?spm=smpc.author.fd- ...

  2. 硬核测试:Pulsar 与 Kafka 在金融场景下的性能分析

    背景 Apache Pulsar 是下一代分布式消息流平台,采用计算存储分层架构,具备多租户.高一致.高性能.百万 topic.数据平滑迁移等诸多优势.越来越多的企业正在使用 Pulsar 或者尝试将 ...

  3. 【转帖】全网最通俗易懂的Kafka入门

    全网最通俗易懂的Kafka入门 http://www.itpub.net/2019/12/04/4597/ 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://g ...

  4. Kafka 温故(一):Kafka背景及架构介绍

    一.Kafka简介 Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,使用Scala语言编写,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,多订阅者,冗余 ...

  5. Apache Kafka(五)- Safe Kafka Producer

    Kafka Safe Producer 在应用Kafka的场景中,需要考虑到在异常发生时(如网络异常),被发送的消息有可能会出现丢失.乱序.以及重复消息. 对于这些情况,我们可以创建一个“safe p ...

  6. 《Kafka笔记》1、Kafka初识

    目录 一.初识Kafka 1 apache kafka简介 2 消息中间件kafka的使用场景 2.1 订阅与发布队列 2.2 流处理 3 kafka对数据的管理形式 4 kafka基础架构 5 Ka ...

  7. Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构

    Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 目录 Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 一.Zookeeper 1. Zook ...

  8. Kafka深入理解-1:Kafka高效的文件存储设计

    文章摘自:美团点评技术团队  Kafka文件存储机制那些事 Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日 ...

  9. Kafka【第一篇】Kafka集群搭建

    Kafka初识 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户 ...

  10. Kafka学习(一)kafka指南(about云翻译)

    kafka 权威指南中文版 问题导读 1. 为什么数据管道是数据驱动企业的一个关键组成部分? 2. 发布/订阅消息的概念及其重要性是什么? 第一章 初识 kafka 企业是由数据驱动的.我们获取信息, ...

随机推荐

  1. Blazor快速开发框架Known-V2.0.0

    Known2.0 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行. 官网:http://known.pumantech.com Gitee: https ...

  2. MongoDB经典故障系列六:CPU利用率太高怎么办?

    每逢电商大促,全民狂欢,但热闹是属于疯狂剁手的人们.而开发者们有的缺是"高流量.高访问.高并发"三高下带来的种种问题.为了应对大促期间的高I/O情况,企业会选择MongoDB云数据 ...

  3. 知道ThreadLocal吗?一起聊聊到底有啥用

    摘要:ThreadLocal是 java 提供的一个方便对象在本线程内不同方法中传递和获取的类.用它定义的变量,仅在本线程中可见和维护,不受其他线程的影响,与其他线程相互隔离. 本文分享自华为云社区& ...

  4. 梦幻联动!金蝶&华为云面向大企业发布数据库联合解决方案

    摘要:近日,金蝶软件(中国)有限公司(以下简称"金蝶")携手华为云共同发布了金蝶云·星瀚.金蝶云·苍穹和GaussDB(for openGauss)数据库联合解决方案. 本文分享自 ...

  5. 零售品牌如何挑选达人 KOL?火山引擎 VeDI 有妙招!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 国内消费市场正在发生一些新变化. 近日,由中国人民大学国家发展与战略研究院.经济学院等联合主办的第 57 期宏观经 ...

  6. 面试官:分库分表后如何生成全局ID?

    分库分表后就不能使用自增 ID 来作为表的主键了,因为数据库自增 ID 只适用于单机环境,但如果是分布式环境,是将数据库进行分库.分表或数据库分片等操作时,那么数据库自增 ID 就会生成重复 ID,从 ...

  7. #627 DIV3 题解

    A. 每组给一个和个数(),每次操作可以给一个加2,求是否能使n个数相等 4 3 1 1 3 4 1 1 2 1 2 11 11 1 100 YES NO YES YES 直接扫一遍,记录最大值与当前 ...

  8. UVA540 Team Queue(双queue)

    题目大意 有一条长队,每个人均唯一属于一个组(有编号),执行给定操作序列,输出相应结果.操作如下: (假设长队q1) ENQUEUE x:标号为x的人入队,若q1中存在和x属于同一组的人,则将x插入长 ...

  9. POJ 1985.Cow Marathon(DFS求树的直径模板题)

    两次BFS/DFS求树的直径 我们可以先从任意一点开始DFS,记录下当前点所能到达的最远距离,这个点为P. 在从P开始DFS记录下所能达到的最远点的距离,这个点为Q. \(P , Q\)就是直径的端点 ...

  10. Educational Codeforces Round 100 (Rated for Div. 2) 简单记录

    最近在写Web大作业和期末复习,可能还会有一段时间不会更新blog了 1463A. Dungeon 题意:有3个血量为a,b,c的敌人,现在你每7发子弹能进行一次范围AOE攻击(即一次能集中三人),每 ...