我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kafka的使用与特性怎么理解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kafka的使用与特性怎么理解

这篇文章主要讲解了“Kafka的使用与特性怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kafka的使用与特性怎么理解”吧!

1、面试官:可以简述下Kafka架构中比较重要的关键字吗?

比如Partition,Broker,你都是怎么理解的?

问题分析:Kafka基础知识考察,因为Kafka出色的性能,在集群结构上也有所不同,一些新的概念设计名字初学者可能搞不懂,构建一个 Kafka cluster 首先需要理解 topics, producers, consumers, and brokers 的概念。

答:关于Kafka我做了一些深入了解,它的设计思路还是很值得借鉴的,这其中有6个比较关键的名字概念,弄懂这几个概念才能更好地了解Kafka的工作机制。

Producer
消息的生产方,如支付系统确认用户已经支付,支付系统要通知订单系统和物流系统,支付系统就是生产者。

Consumer
消费的接收方,Producer 的案例中,物流系统就是消费方,前两个都比较简单,我就不多说了。

Topic
每条发布到MQ集群的消息都有一个类别,这个类别被称为topic,可以理解成一类消息的名字。所有的消息都已topic作为单位进行归类。

Partition
Kafka 物理上分区的概念,每个 Topic 会分散在一个或多个 Partition。一个 Topic 的数据太大了,就分成小片,Kafka 为分区引入多副本模型,副本之间采用“一个leader多follower”的设计,通过多副本实现故障自动转移,保证可用性。

Broker:
可以理解成一个服务器的节点,集群包含一个或多个服务器,这种服务器被称为 broker。对应用来说,生产者把消费发出去了,就不管了。消费者慢条斯理地按照自己的速率来消费。这段时间可能有大量消息产生,消费者压力还是在一定范围内。做生产者和消费者之间解耦的就是一个缓存服务broker。

Kafka Cluster

集群就是 Broker 的集合,多个 Broker 组成一个高可用集群。

Producer 与 Consumer的关系

Kafka的使用与特性怎么理解

 topic 和 Partition 的关系

一个 topic 可以分别存储到多个 Partition,每个 Partition 有序的。

Kafka的使用与特性怎么理解

到这里面试官并没有打断我… 我就继续了。

那我们为什么要选择 Kafka 呢? 

这里不再列举同类产品都具有的功能,直接总结干货,Kafka 特有的功能:

相比同类中间件 RabbitMQ or ActiveMQ,Kafka 支持批量拉取消息,大大增加了Kafka的消息吞吐量。

支持多种发送场景:

发送并忘记。

同步发送 。

异步发送+回调函数。

3种方式虽然在时间上有所差别,但并不是说时间越快的越好,具体使用哪种方式要看具体的业务场景,比如业务要求消息必须是按顺序发送,可以使用第2种同步发送,并且只能在一个partation上。如果业务只关心消息的吞吐量,容许少量消息发送失败,也不关注消息的发送顺序,那么可以使用发送并忘记的方式。如果业务需要知道消息发送是否成功,并且对消息的顺序不关心,那么可以用异步+回调的方式来发送消息

分布式可高可扩展。Kafka 集群可以透明的扩展,增加新的服务器进集群。

 只说了 Kafka 的优势,那别的同类产品就不好了吗?当然不是,存在即真理,每个产品能生存下来,一定有它自己的优势,比如 RabbitMQ,在吞吐量方面稍逊于 Kafka ,但是他们的出发点不一样,RabbitMQ 支持对消息的可靠的传递,支持事务,不支持批量的操作,技术选型中,选择最适合你的,你最了解熟悉的。

分布式高性能持久性和扩展性
支持多分区高吞吐量数据可持久化
支持多副本低延迟容错性高
支持多订阅者高并发支持水平在线扩展
基于ZooKeeper调度时间复杂度为O(1)消息分发自动平衡

言多必失,说了一堆 Kafka 相比其他产品有多好多快,终于成功给自己挖了一个坑。(?),顺着我的思路展开了问

2、面试官:那为什么Kafka的吞吐量远高于其他同类中间件?

问题分析:多年经验总结,面试中最吃亏的就是你把你不熟悉的东西写在简历上,还有就是你知道结果,不知其原理,源码没看过,好歹也要知道用了巧妙的设计。

答:Kafka 是一个高吞吐量分布式消息系统,并且提供了持久化。其高性能的有两个重要特点:

利用了磁盘连续读写性能远远高于随机读写的特点,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。

并发,将一个topic拆分多个partition, kafka读写的单位是partition,因此,将一个topic拆分为多个partition可以提高吞吐量。但是,这里有个前提,就是不同partition需要位于不同的磁盘(可以在同一个机器)。如果多个partition位于同一个磁盘,那么意味着有多个进程同时对一个磁盘的多个文件进行读写,使得操作系统会对磁盘读写进行频繁调度,也就是破坏了磁盘读写的连续性。
在linkedlin的测试中,每台机器就加载了6个磁盘,并且不做ra,就是为了充分利用多磁盘并发读写,又保证每个磁盘连续读写的特性。

Kafka的使用与特性怎么理解

同一个topic会被分散到多个分片上,并行处理。 

深入分析

Kafka 消息的生产与消费模型Demo

伪代码:使用KafKa客户端发送一条消息

public class MqProducer {    private final Logger LOG = LoggerFactory.getLogger(MqProducer.class);     @Resource    private Producer payProducer;     public void sendPayMsg(String msg) {        try {            LOG.debug("send msg:{}", msg);            payProducer.send(msg);//发送出去一条消息。        } catch (MQException e) {            LOG.error("mq消息异常 message:{}", msg, e);        }    }}

长什么样子?

即payProducer.send(msg)里的msg的值:

{"businessType":1,"cityId":10,"ctime":1567426767077,"dataKey":20190902,"logType":1,"phone":"13212341234","uid":12345678,"userType":1,"uuid":"32EA02C86D78863"}

无论消息长短,都可以看作一个json串,用 key-value的形式传递信息。

伪代码:接收一条消息

public class DemoConsumer {         private static IConsumerProcessor consumer;     public static void main(String[] args) throws Exception {        Properties properties = new Properties();            properties.setProperty(ConsumerConstants.SubscribeGroup, "dache.risk.log.queue.v2");         // 创建topic对应的consumer对象(注意每次build调用会产生一个新的实例)        consumer = KafkaClient.buildConsumerFactory(properties, "topic.xxx.xxx");         // 调用recvMessageWithParallel设置listener        consumer.recvMessageWithParallel(String.class, new IMessageListener() {            @Override            public ConsumeStatus recvMessage(Message message, MessagetContext context) {                //TODO:业务侧的消费逻辑代码                try {                    System.out.println("message=[" + message.getBody() + "]  partition=" + message.getParttion());                } catch (Exception e) {                    e.printStackTrace();                }                              return ConsumeStatus.CONSUME_SUCCESS;            }        });           }}

附录:消息管理工具

如果你们刚刚搭建起Kafka集群,还没有完备的页面管理系统,你不妨了解一下这几款开源工具,给领导展示一下解决问题的能力。

为了简化开发者和服务工程师维护 Kafka 集群的工作,基于页面的管理工具必不可少。

常用 Kafka 开源管理工具:

Kafka Manager :由 yahoo 团队开发。

Kafka的使用与特性怎么理解

感谢各位的阅读,以上就是“Kafka的使用与特性怎么理解”的内容了,经过本文的学习后,相信大家对Kafka的使用与特性怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kafka的使用与特性怎么理解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kafka的使用与特性怎么理解

这篇文章主要讲解了“Kafka的使用与特性怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kafka的使用与特性怎么理解”吧!1、面试官:可以简述下Kafka架构中比较重要的关键字吗?
2023-06-21

C#特性AttributeUsage的理解与使用

AttributeUsage是一个特性类,用于定义自定义特性在代码中的使用方式。 它具有以下属性:- AllowMultiple:指定是否允许在同一个目标上多次使用相同的特性。默认值为false。- Inherited:指定是否允许派生类继
2023-09-01

MQTT与Kafka怎么理解

这篇文章主要介绍“MQTT与Kafka怎么理解”,在日常操作中,相信很多人在MQTT与Kafka怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MQTT与Kafka怎么理解”的疑惑有所帮助!接下来,请跟
2023-06-03

React的特性怎么使用

这篇“React的特性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“React的特性怎么使用”文章吧。多端一致的开发
2023-06-27

spring boot怎么与kafka结合使用

spring boot怎么与kafka结合使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。引入相关依赖 org.springfra
2023-05-31

怎么使用的新Java特性

这篇文章主要讲解了“怎么使用的新Java特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用的新Java特性”吧!1 Try-with-resource 语句使用 try-catch
2023-06-15

怎么理解ADO.NET的应用程序新特性

这篇文章主要介绍“怎么理解ADO.NET的应用程序新特性”,在日常操作中,相信很多人在怎么理解ADO.NET的应用程序新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解ADO.NET的应用程序新特性
2023-06-17

JDK5.0新特性的泛型怎么理解

本篇文章给大家分享的是有关JDK5.0新特性的泛型怎么理解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。没有参数的情况下使用泛型 既然在J2SE 5.0中收集类型已经泛型
2023-06-03

Java8新特性怎么使用

本篇内容介绍了“Java8新特性怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java语言新特性Lambda表达式Lambda表达式
2023-06-02

Vue3.0新特性怎么使用

本篇内容主要讲解“Vue3.0新特性怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3.0新特性怎么使用”吧!1、Vue3带来的新变化性能提升(零成本:从vue2切到vue3就享受到
2023-06-29

java的三大特性怎么使用

这篇文章主要介绍了java的三大特性怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java的三大特性怎么使用文章都会有所收获,下面我们一起来看看吧。java的三大特性是:1、封装,就是将类的某些信息隐藏
2023-07-04

es6新特性怎么使用

这篇“es6新特性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es6新特性怎么使用”文章吧。es6新特性有:1、l
2023-07-04

怎么理解javascript基于对象的特性

JavaScript是一门基于对象的编程语言。它充分利用了面向对象编程(OOP)的思想和原则。通过这种方式,它将代码组织成易于理解和重用的块,进一步提高了开发人员的效率。在这篇文章中,我们将探讨如何理解JavaScript的基于对象的特性。JavaScript中的一切都是对象JavaScript中的所有事物都被视为对象,包括数字,字符串,数组,函数等。这些对象都有其自身的属性和
2023-05-14

vue中怎么使用es6特性

本篇内容主要讲解“vue中怎么使用es6特性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue中怎么使用es6特性”吧!特性:1、let和const关键字,用于声明变量;2、“for…of”循
2023-07-05

Kafka怎么处理数据的顺序性和并发性

Kafka通过分区和副本的机制来处理数据的顺序性和并发性。数据的顺序性:Kafka中的数据被分为多个分区,每个分区内的数据是有序的,即消息在同一个分区内的顺序是有序的。这样可以保证在一个分区内消息的顺序性,但不保证整个主题内的消息的顺序性。
Kafka怎么处理数据的顺序性和并发性
2024-03-14

Golang 语言的设计理念与特性解析

Golang 语言的设计理念与特性解析Go语言(也称为Golang)是由谷歌公司开发的一种静态强类型的编程语言,于2009年首次亮相。自问世以来,Go语言在各个领域逐渐崭露头角,广受程序员的喜爱。在这篇文章中,我们将深入探讨Golang语
Golang 语言的设计理念与特性解析
2024-03-07

理解PHP trait DTO的核心概念与特性

概念与背景在 PHP 编程语言中,Trait 是一种代码复用机制,它允许开发者在不使用多重继承的情况下,将方法的集合组合到一个类中。Trait DTO 则是其中的一种应用场景。DTO(Data Transfer Object)是一种常见的设
2023-10-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录