分布式之全面了解Kafka的使用与特性

不啰嗦,我们直接开始!

引言

2020年,Kafka 依旧炙手可热,一线大公司即使不用Kafka,但是自研产品也都是基于Kafka,或者完全借鉴Kafka设计思想,理论上来说,如果你还没熟练掌握一个MQ框架,Kafka绝对是不错的选择。

关于历史,如果你感兴趣了解一下,至少知道是哪个公司开源的,Kafka最初于2011年在 LinkedIn 开发,自那时起经历了很多改进,后来捐献给Apache基金,如今发展成为一个完整的平台,采用Scala和Java开发的开源流处理软件。

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的关系

 topic 和 Partition 的关系

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

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

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

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

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

支持多种发送场景:

1.发送并忘记。

2.同步发送 。

3.异步发送+回调函数。

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

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

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

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

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

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

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

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

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

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

同一个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 {

    /**
    * 注意:服务端对单ip创建相同主题相同队列的消费者实例数有限制,超过100个拒绝创建.
    * */
    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 团队开发。使用可参考:https://github.com/yahoo/kafka-manager

Kafka Lens:开源项目,允许开发人员在通过代理传递消息时查看消息,也可以按分区过滤消息。

参考:https://github.com/kafka-lens/kafka-lens

图片来源:Kafka Lens

Kafka Monitor :测试和监视Kafka集群,而不需要对应用程序进行任何更改。
使用参考:https://github.com/linkedin/kafka-monitor

总结

Kafka架构关键字:

  1. Producer
  2. Consumer
  3. Topic
  4. Partition
  5. Broker
  6. Kafka Cluster

每一个关键词都值得你深入研究,让面试官看到你的亮点吧。

Kafka的性能为何如此优秀:一句话总结:得益于架构采用分布式并行处理,利用磁盘顺序IO批处理。

参考资料

Kafka官网

Thorough Introduction to Apache Kafka

如果你想系统了解下Kafka,可以推荐一本书《深入理解Kafka:核心设计与实践原理》,微信读书就可以免费阅读。

到此这篇关于分布式之全面了解Kafka的使用与特性的文章就介绍到这了,更多相关Kafka的使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 带你玩转Kafka之初步使用

    目录 前言 1 简单介绍 2 下载安装 3 基本使用 3.1 启动Kafka 3.2 简单测试使用 3.3 搭建多代理集群 3.3.1 开始搭建 3.3.2 使用 3.3.3 验证容错性 4 小总结 总结 前言 官方文档:http://kafka.apache.org/ 中文文档:https://kafka.apachecn.org/ Apache Kafka是分布式发布-订阅消息系统. Apache Kafka与传统消息系统相比,有以下不同: 它被设计为一个分布式系统,易于向外扩展: 它同时为

  • windows下使用 intellij idea 编译 kafka 源码环境

    1. 从 GitHub 网站,git clone kafka 源码 2. 下载安装好 gradle,scala 2.1 从 dependencies.gradle 文件中找到 gradle 的版本,然后下载指定版本,并配置好 GRADLE_HOME 环境变量 3. 进入 kafka 项目目录,依次执行 gradle wrapper,gradle idea,gradle build --exclude-task test 4. 将工程导入到 idea 4.1 启动主类 kafka.Kafka 4.

  • 使用kafka如何选择分区数及kafka性能测试

    kafka选择分区数及kafka性能测试 1.简言 ​ 如何选择合适的分区,这是我们经常面临的问题,不过针对这个问题,在网上并没有搜到固定的答案.因此,今天在这里主要通过性能测试的工具来告诉如何选择相对应的kafka分区. 2.性能测试工具 ​ kafka本身提供了比较的性能测试工具,我们可以使用它来测试适用于我们机器的kafka分区. ① 生产者性能测试 分别创建三个topic,副本数设置为1. bin/kafka-topics.sh --zookeeper zk --create --rep

  • 分布式之全面了解Kafka的使用与特性

    不啰嗦,我们直接开始! 引言 2020年,Kafka 依旧炙手可热,一线大公司即使不用Kafka,但是自研产品也都是基于Kafka,或者完全借鉴Kafka设计思想,理论上来说,如果你还没熟练掌握一个MQ框架,Kafka绝对是不错的选择. 关于历史,如果你感兴趣了解一下,至少知道是哪个公司开源的,Kafka最初于2011年在 LinkedIn 开发,自那时起经历了很多改进,后来捐献给Apache基金,如今发展成为一个完整的平台,采用Scala和Java开发的开源流处理软件. Kafka 是我工作多

  • Kafka使用入门教程第1/2页

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: •Kafka将消息以topic为单位进行归纳. •将向Kafka topic发布消息的程序成为producers. •将预订topics并消费消息的程序成为consumer. •Kafka以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个broker. producers通过网络将消息发送到Kafka集群,集群

  • Springboot集成Kafka实现producer和consumer的示例代码

    本文介绍如何在springboot项目中集成kafka收发message. Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能.高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息.支持通过Kafka服务器和消费机集群来分区消息.支持Hadoop并行数据加载. 安装Kafka 因为安装kafka需要zookeeper的支持,所以Windows安装时需要将zookee

  • RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略

    目录 消息队列常见问题处理 分布式事务 什么是分布式事务 常见的分布式事务解决方案 基于MQ实现的分布式事务 本地消息表-最终一致性 MQ事务-最终一致性 RocketMQ中如何处理事务 Kafka中如何处理事务 RabbitMQ中的事务 消息防丢失 生产阶段防止消息丢失 RabbitMQ中的防丢失措施 Kafka中的防丢失措施 RocketMQ中的防丢失措施使用SYNC的发送消息方式,等待broker处理结果 存储阶段 RabbitMQ中的防丢失措施 Kafka中的防丢失措施 RocketMQ

  • 关于Kafka消息队列原理的总结

    目录 Kafka消息队列原理 Kafka的逻辑数据模型 Kafka的分发策略 Kafka的物理存储模型和查找数据的设计 Kafka的持久化策略设计 Kafka的节点间的数据一致性策略设计 Kafka的备份和负载均衡 Kafka消息队列内部实现原理 Kafka消息队列原理 最近在测试kafka的读写性能,所以借这个机会了解了kafka的一些设计原理,既然作为分布式系统,我们还是按照分布式的套路进行分析. Kafka的逻辑数据模型 生产者发送数据给服务端时,构造的是ProducerRecord<In

  • Go 语言下基于Redis分布式锁的实现方式

    分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁. 项目地址: https://github.com/Spongecaptain/redisLock 1. Go 原生的互斥锁 Go 原生的互斥锁即 sync 包下的 M

  • ZooKeeper分布式协调服务设计核心概念及安装配置

    目录 一.ZooKeeper 简介 1.ZooKeeper 设计目标 2.核心概念 1)Session 会话 2)数据节点 3)Watcher 4)ACL 3.Zab 协议介绍 二.ZooKeeper Cluster 安装 1.安装 ZooKeeper 2.使用 Golang 连接 ZooKeeper 的 API 接口 3.配置 ZooKeeper Cluster 一.ZooKeeper 简介 ZooKeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护.ZooKeeper 可

  • 使用MQ消息队列的优缺点详解

    前言 公司的项目一直都是在使用MQ的,但是由于使用的功能很简单,所以一直都是知其然不知其所以然,作为一个程序猿有必要了解每一个使用的技术,为什么使用它?它的优点是什么?缺点是什么?等等... 使用mq的好处 解耦与复用 系统A要发送一个消息到多个系统,如果此时每增加一个系统,系统A都需要通过修改源码来增加接口,此时耦合非常高,但是如果中间使用消息队列的话,系统只需要发送一次到消息队列,别的系统就能复用该信息,当增加或删除系统调用接口的时候,不需要额外的更新代码. 异步 用户调用一个接口的时候,可

  • Springboot 1.5.7整合Kafka-client代码示例

    在一次项目中,因甲方需要使用kafka消息队列推送数据,所以需要接入kafka,并且kafka的版本是2.11.但是我们项目使用的是Springboot 1.5.7的版本,对应的springboot.kafka.starter有冲突,所以就接入了kafka-client. Kafka 是一个分布式消息引擎与流处理平台,经常用做企业的消息总线.实时数据管道,有的还把它当做存储系统来使用. 早期 Kafka 的定位是一个高吞吐的分布式消息系统,目前则演变成了一个成熟的分布式消息引擎,以及流处理平台.

  • Docker安装部署单机版Rocket及基础讲解

    目录 前言 优缺点 常见名词介绍 单机版安装部署 集群部署 四种集群部署方式 集群部署 前言 目前主流的MQ主要是Rocketmq.kafka.Rabbitmq,Rocketmq相比于Rabbitmq.kafka具有主要优势特性有: 支持事务消息(能够解决分布式事务的问题) 支持顺序消息(底层已经使用内存队列实现) 支持consumer端tag过滤,减少不必要的网络传输 Rocketmq就是对kafka实现的升级版本. 优缺点 RocketMQ 优点 单机吞吐量:十万级 可用性:非常高,分布式架

随机推荐