一、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客户端查看消息投递:
注:学习笔记,如有不足支持,欢迎补充学习