Kafka 认识到使用(大白话通俗易懂)

一、kafka介绍

1. 什么是kafka?

        Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了。

2. 消息队列的好处是什么?

        三大特性:解耦、异步、削峰

解耦合:

        由A直接调用B,改成为A发送消息到消息队列中,B从消息队列中确认消费消息,此时的A也称为生产者,B称为消费者

        

异步处理:

        消息存入消息队列后,就可以返回结果,无需等待消费者,消费者该如何选择处理模式就如何选择

 流量削峰:

        高流量的时候,使用消息队列作为中间件,可以将流量的高峰保存在消息队列中,从而防止了系统的高请求,减轻服务器的请求处理压力

 3. 消息队列的两种消费模式是什么?

        两种消费模式分别是:点对点模型和发布/订阅模型

点对点模型:

        生产则A发送消息到Queue队列中,消费者B消费队列中的消息,消费后的消息会被删除掉

 发布/订阅模型:

        可以理解为一对多,利用Topic存储消息,消费者可以订阅topic,处理所需要对应的数据,被处理的数据不会立即删除,默认会保留一段时间

 二、Kafka 系统架构

 Broker:一台 kafka 服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。

Producer :消息生产者,就是向 Kafka broker 发消息的客户端。

Consumer :消息消费者,向 Kafka broker 拉取消息来消费。可以根据 Consumer 的消费能力以适当的速率消费消息。

Topic :可以理解为一个队列,生产者和消费者面向的都是一个topic。

Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个broker上,一个 topic 可以分为多个partition,每个 partition 是一个有序的队列,有点平衡分摊生产者机制。

Replication:为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干个follower。

leader:一个分区有一个Leader,生产者发送数据的对象,以及消费者消费数据的对象都是leader。

follower:一个分区有一个Follower,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的 follower。注意Kafka中 副本数不能超过Broker数!

Consumer Group :消费者组由多个 consumer 组成。组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。

offset:消费者在具体消费某个 topic 中的消息时,可以指定起始偏移量

三、使用kafka

1.如何安装kafka?

环境准备:

        jdk 8+、zookeeper 、kafka

下载Kafka:

        确保本地环境为JDK8+,通过官网下载kafka的.tgz安装包,并使用以下命令解压

$ tar -xzf kafka_2.13-3.4.0.tgz
$ cd kafka_2.13-3.4.0

启动kafka环境:

        Apache Kafka可以使用ZooKeeper或KRaft启动。这里介绍ZooKeeper启动

# 启动ZooKeeper服务
$ bin/zookeeper-server-start.sh config/zookeeper.properties

        启动ZooKeeper服务之后,再打开另一个终端会话,并启动Kafka服务

#启动Kafka代理服务
$ bin/kafka-server-start.sh config/server.properties

        成功启动所有服务后,您将拥有一个基本的 Kafka 环境运行并可供使用了

配置kafka:

        进入解压的kafka目录,修改/config/kafka-server的配置文件

vi config/server.properties

-- 重点配置节点说明
listeners=PLAINTEXT://localhost:9092   -- 将localhost修改为主机ip
log.dirs=/bigdata/kafka/logs-1  -- 默认不修改也可

 2. 如何在客户端连接kafka?

        这里是通过Offset Explorer连接kafka的,所以我们要通过官网下载客户端,客户端的安装使用说明可以参考使用手册

下载:

安装:

        根据不同的系统下载对应的版本,我这里kafka版本是1.1.0,下载kafka tool 2.0.1。

        双击下载完成的exe图标,傻瓜式完成安装。

使用:

        kafka环境搭建请参考:CentOS7.5搭建Kafka2.11-1.1.0集群

1)连接kafka

        打开kafka tool安装目录,点击exe文件

        提示设置kafka集群连接

         点击确定,设置

        设置完了,点击Test测试是否能连接,连接通了,然后点击Add,添加完成设置。出现如下界面

2)简单使用

        配置以字符串的形式显示kafka消息体

        或者通过如下界面配置

        注释:更改完Content Types,要点击Update和Refresh按钮

再次查看kafka的数据:

 3. 简单案例参考

新建.Net Core控制台项目,代码如下:

static void Main(string[] args)
        {
            // 发送消息
            var producerConfig = new ProducerConfig
            {
                BootstrapServers = "192.168.140.131:9092",
                MessageTimeoutMs = 50000
            };
            var builder = new ProducerBuilder<string, string>(producerConfig);
            using (var producer = builder.Build())
            {
                var data = new { key = "1", value = "001" };
                var json = JsonConvert.SerializeObject(data);
                var dr = producer.ProduceAsync("order", new Message<string, string> { Key = "order", Value = json }).GetAwaiter().GetResult();
                Console.WriteLine($"发送事件{dr.Value}到{dr.TopicPartitionOffset}成功");
            }

            // 消费消息
            var consumerConfig = new ConsumerConfig {
                BootstrapServers = "192.168.140.131:9092",
                AutoOffsetReset=AutoOffsetReset.Earliest,
                GroupId="1111", // 自定义
                EnableAutoCommit=true
            };
            var consumerBuilder = new ConsumerBuilder<string, string>(consumerConfig);


            using (var consumer = consumerBuilder.Build())
            {
                // 1、订阅
                consumer.Subscribe("order");
                while (true)
                {
                    try
                    {
                        // 2、消费(自动确认)
                        var result = consumer.Consume();

                        // 3、业务逻辑
                        string key = result.Key;
                        string value = result.Value;

                        Console.WriteLine($"创建商品:Key:{key}");
                        Console.WriteLine($"创建商品:Order:{value}");
                        consumer.Commit(result);

                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($"异常:Order:{e}");
                    }
                }
            }
        }

 使用kafka客户端查看消息投递:

         注:学习笔记,如有不足支持,欢迎补充学习

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10JQK炸

如果对您有所帮助,请给点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值