定义
Kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理
特性
- 高吞吐量,低延迟
- 可扩展性
- 持久性,可靠性
- 容错性
- 高并发
使用场景
- 日志收集
- 消息系统
- 用户活动跟踪:记录用户的各种活动,如浏览网页,搜索,点击等活动
- 运营指标:记录运营监控数据
- 流式处理:如spark streaming
Windows搭建Kafka运行环境
Kafka运行依赖于Zookeeper,这里不再介绍.
点击下载Kafka压缩包
安装Kafka
- 将从官网下载的压缩包解压到自定义的路径(F:\S\Kafka\kafka_2.13-2.5.0)
- 打开F:\S\Kafka\kafka_2.13-2.5.0\config的server.properties文件,把
log.dirs修改为:
- 在文件目录F:\S\Kafka\kafka_2.13-2.5.0执行命令开启kafka通讯的服务器broker
.\bin\windows\kafka-server-start.bat .\config\server.properties
- 在文件目录F:\S\Kafka\kafka_2.13-2.5.0\bin\windows,创建名称为testKafka的消息topics
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testKafka
- 打开两个cmd窗口创建Consumer,Producer (F:\S\Kafka\kafka_2.13-2.5.0\bin\windows)
- Producer 指令:
kafka-console-producer.bat --broker-list localhost:9092 --topic testKafka
2. Consumer 指令:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic testKafka
SpringBoot整合Kafka
- 导入项目所需依赖
<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
这里注意,对版本有要求,我使用的SpringBoot Version为2.2.2
- application.yml配置
spring:
kafka:
# 以逗号分隔的地址列表,用于建立与Kafka集群的初始连接(kafka 默认的端口号为9092)
bootstrap-servers: localhost:9092
producer:
# 发生错误后,消息重发的次数。
retries: 0
#当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
batch-size: 16384
# 设置生产者内存缓冲区的大小。
buffer-memory: 33554432
# 键的序列化方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
# 值的序列化方式
value-serializer: org.apache.kafka.common.serialization.StringSerializer
acks: 1
consumer:
group-id: test-app
# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
auto-commit-interval: 1S
# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
# latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
# earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
auto-offset-reset: earliest
# 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
enable-auto-commit: false
# 键的反序列化方式
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# 值的反序列化方式
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
# 在侦听器容器中运行的线程数。
concurrency: 5
ack-mode: manual_immediate
server:
port: 8081
- Topic名称,此处定义了一个常量类
public class TopicConst {
public static final String TOPIC_CONSTANT_NAME="testTopic";
}
- 发送Topic到kafka
@Component
public class SendMessage {
@Resource
private KafkaTemplate kafkaTemplate;
/**
* 发送消息到kafka
*@param topic 主题
*@param message 内容体
*/
public void sendMsg(String topic,String message){
kafkaTemplate.send(topic ,message);
}
}
- 先启动服务提供,创建Topic及message
@RestController
@RequestMapping("/con")
public class Consumer {
@Resource
private SendMessage sendMessage;
/**
* 当Topic及消息创建完成后,重新启动项目,开始此方法对topic进行监听,如果有消息就消费消息
*/
// @KafkaListener(topics = TopicConst.TOPIC_CONSTANT_NAME)
// public void consumerMessage(String message) {
// System.out.println(message);
// }
@GetMapping("/send")
public String pruducerMessage() {
sendMessage.sendMsg(TopicConst.TOPIC_CONSTANT_NAME,"服务提供");
return "Success";
}
}