分布式消息队列kafka详解

分布式消息队列kafka详解

引言

Apache Kafka是一个开源的分布式事件流平台,最初由LinkedIn开发,现已成为处理高吞吐量、实时数据流的行业标准。Kafka不仅仅是一个消息队列,更是一个完整的分布式流处理平台,能够发布、订阅、存储和处理海量数据流。

核心概念

基础架构

Kafka采用分布式架构,主要组件包括:

  • Broker: Kafka服务器,负责接收、存储和转发消息
  • ZooKeeper: 管理集群元数据和协调集群成员(较新版本开始逐步淘汰依赖)
  • Producer: 生产者,发布消息到Kafka
  • Consumer: 消费者,从Kafka读取消息
  • Connector: 连接器,实现与外部系统的数据交换
  • Stream Processor: 流处理器,处理数据流

重要概念

  • Topic: 消息的逻辑分类,可以理解为一个消息管道
  • Partition: Topic的分区,实现并行处理和水平扩展
  • Offset: 分区内消息的唯一标识,顺序递增
  • Consumer Group: 消费者组,同一组内的消费者共同消费Topic
  • Replication: 分区复制,提供高可用性

Kafka架构图

Producers                          Consumers|                                 ^v                                 |+----------------------------------+ ||              Broker              | || +------------------------------+ | || | Topic A                      | | || | +-----------+ +-----------+ | | || | |Partition 0| |Partition 1| | | || | |0|1|2|3|...|0|1|2|3|...  | | | || | +-----------+ +-----------+ | | || +------------------------------+ | |+----------------------------------+ ||                      |v                      |+---------------+             ||  ZooKeeper    |             |+---------------+             |||

Kafka的主要特性

高吞吐量

Kafka能够处理每秒数百万条消息,这归功于:

  • 基于磁盘的顺序读写
  • 零拷贝技术优化
  • 批量处理和压缩传输
  • 分区并行处理

持久性和可靠性

  • 消息持久化到磁盘
  • 可配置的复制因子
  • 容错和自动恢复机制
  • 精确一次语义(Exactly-Once Semantics)

可扩展性

  • 无主设计,任何broker可作为分区leader
  • 动态集群扩展
  • 分区动态再平衡

实时性

  • 低延迟消息传递(毫秒级)
  • 流处理能力

消息存储机制

Kafka采用独特的存储设计:

  • 基于追加写入的日志结构
  • 分段文件存储
  • 稀疏索引加速查找
  • 消息压缩
  • 日志清理和压缩策略
Topic Partition
+-------------------------------------------+
| Segment 0 | Segment 1 | ... | Segment N  |
+-------------------------------------------+|v
+-----------------------+
| Index File | Log File |
+-----------------------+

消费模型

拉取模式

Kafka采用消费者主动拉取消息的模式:

  • 消费者自行控制消费速率
  • 消费位置(offset)由消费者维护
  • 支持消费者再平衡

消费者组

  • 同一组内的消费者共同消费Topic的消息
  • 每个分区在同一时间只能被组内一个消费者消费
  • 实现负载均衡和水平扩展
Topic (4 partitions)
+----+----+----+----+
| P0 | P1 | P2 | P3 |
+----+----+----+----+|    |    |    |v    v    v    v
+----+----+----+----+
| C1 | C2 | C1 | C2 |
+----+----+----+----+
Consumer Group (2 consumers)

实际应用场景

消息系统

  • 替代传统消息队列,实现系统解耦
  • 缓冲峰值流量,平滑处理压力

日志收集

  • 收集分布式系统的日志数据
  • 集中处理和分析

流处理

  • 实时数据分析
  • 事件驱动应用

数据集成

  • 与各种数据系统集成
  • CDC(变更数据捕获)

基本使用示例

创建Topic

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 \--replication-factor 3 --partitions 5 --topic my-topic

生产消息

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");Producer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key1", "value1");
producer.send(record);
producer.close();

消费消息

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("my-topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());}
}

高级特性

事务支持

Kafka支持跨分区的原子事务,确保多条消息要么全部成功,要么全部失败。

props.put("transactional.id", "my-transactional-id");
producer.initTransactions();
try {producer.beginTransaction();// 发送多条消息producer.send(record1);producer.send(record2);producer.commitTransaction();
} catch (Exception e) {producer.abortTransaction();
}

消息压缩

支持多种压缩算法:

props.put("compression.type", "snappy"); // gzip, lz4, zstd也可选

安全特性

  • SASL认证
  • SSL/TLS加密
  • ACL权限控制
props.put("security.protocol", "SASL_SSL");
props.put("sasl.mechanism", "PLAIN");

监控与管理

  • JMX指标
  • Prometheus集成
  • Kafka Manager等管理工具

Kafka Streams

Kafka Streams是Kafka原生的流处理库:

StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> source = builder.stream("input-topic");
KStream<String, String> transformed = source.map((key, value) -> new KeyValue<>(key, value.toUpperCase()));
transformed.to("output-topic");

实际部署考量

硬件配置

  • 高速磁盘(建议SSD)
  • 足够的内存(用于页缓存)
  • 高速网络(10Gbps+)

集群规模

  • 小型集群:3-5个broker
  • 中型集群:5-10个broker
  • 大型集群:10+个broker

关键配置参数

  • num.partitions: 默认分区数
  • default.replication.factor: 默认复制因子
  • min.insync.replicas: 最小同步副本数
  • log.retention.hours: 日志保留时间
  • log.segment.bytes: 日志段大小

与其他消息队列对比

特性KafkaRabbitMQActiveMQRocketMQ
吞吐量极高中等中等
延迟毫秒级微秒级毫秒级毫秒级
消息持久化可选可选
消息模型发布/订阅多种多种发布/订阅
集群扩展性极佳一般一般良好
部署复杂度中等中等

总结

Kafka作为一个分布式流处理平台,其高吞吐量、可靠性和可扩展性使其成为处理大规模数据流的理想选择。无论是构建实时数据管道、流处理应用还是作为企业消息总线,Kafka都能提供出色的性能和可靠性。随着数据驱动决策的日益重要,Kafka在构建实时数据架构中的角色将越来越关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/906684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app(3):互相引用

1 绝对路径和相对路径 在日常开发中&#xff0c;经常会遇到使用绝对路径还是相对路径的问题&#xff0c;下面我们介绍下这两种路径。 1.1 绝对路径 绝对路径&#xff1a;是指从项目根目录开始的完整路径。它用于指定文件或目录的确切位置。绝对路径通常以斜杠&#xff08;/&am…

python与flask框架

一、理论 Flask是一个轻量级的web框架&#xff0c;灵活易用。提供构建web应用所需的核心工具。 Flask依赖python的两个库 Werkzeug&#xff1a;flask的底层库&#xff0c;提供了WSGI接口、HTTP请求和响应处理、路由等核心功能。 Jinja2&#xff1a;模板引擎&#xff0…

esp32-idf框架学习笔记/教程

esp32型号: 环境搭建 安装:就按这个来,别的试了好多次都不行,这个一次成功!!!! vscode下ESP32开发环境配置&#xff08;100%成功&#xff09;_哔哩哔哩_bilibili esp芯片的两种模式: ESP32 固件烧录教程_哔哩哔哩_bilibili 1.运行模式 2.下载模式 esp32s3程序下载 1.数据…

VKontakte(VK)注册教程

VKontakte&#xff08;简称VK&#xff09;是俄罗斯最大的社交网络平台&#xff0c;类似于Facebook&#xff0c;用户可以通过它进行社交、分享图片、视频、音乐等内容&#xff0c;并参与各类社群讨论&#xff0c;是与俄罗斯及其他东欧地区的朋友建立联系的便捷平台。对于做俄罗斯…

STM32+ESP8266+ONENET+微信小程序上传数据下发指令避坑指南

之前只做过类似的但是以为这种烂大街的功能应该不难结果还是踩了不少坑&#xff0c;记录几个需要注意的点 首先贴一个非常有用的视频&#xff0c;里面讲的很详细&#xff0c;给的资料也很全【【新版OneNet云平台】STM32ESP8266上传数据&#xff0c;简单易上手&#xff01;】 h…

【知识点】关于vue3中markRow、shallowRef、shallowReactive的了解

首先我们先了解一下这三个函数的定义以及区别 markRow 定义&#xff1a; 一个用于标记对象为非响应式的工具函数 shallowRef 定义&#xff1a; 一个用于创建浅层响应式引用的函数&#xff0c;只对 .value 本身进行响应式处理&#xff0c;不会递归地将 .value 指向的对象或…

后端开发实习生-抖音生活服务

职位描述 ByteIntern&#xff1a;面向2026届毕业生&#xff08;2025年9月-2026年8月期间毕业&#xff09;&#xff0c;为符合岗位要求的同学提供转正机会。 团队介绍&#xff1a;生活服务业务依托于抖音、抖音极速版等平台&#xff0c;致力于促进用户与本地服务的连接。过去一…

OceanBase 共享存储:云原生数据库的存储

目录 探会——第三届 OceanBase 开发者大会 重磅发布&#xff1a;OceanBase 4.3 开发者生态全面升级 实战演讲&#xff1a;用户案例与行业落地 OceanBase 共享存储架构解析 什么是共享存储架构&#xff1f; 云原生数据库的架构 性能、弹性与多云的统一 为何OceanBase能…

C++ 结构体封装模式与 Promise 链式调用:设计思想的异曲同工

C 结构体封装模式与 Promise 链式调用&#xff1a;设计思想的异曲同工 在软件开发中&#xff0c;我们常常追求代码的可维护性、可扩展性和可读性。不同的编程语言和场景下&#xff0c;虽然实现方式各异&#xff0c;但背后的设计思想往往存在着奇妙的相似性。本文将探讨 C 中结…

【Go】1、Go语言基础

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言的特点 Go语言由Google团队设计&#xff0c;以简洁、高效、并发友好为核心目标。 具有以下优点&#xff1a; 语法简单、学习曲线平缓&#xff1a;语法关键字很少&#xff0c;且…

AI时代的新营销范式:生成式引擎优化(GEO)的崛起——品牌如何被大模型收录

在数字化浪潮席卷全球的今天&#xff0c;我们正站在一个前所未有的历史拐点。如果说过去二十年&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;重塑了企业与消费者的连接方式&#xff0c;那么未来二十年&#xff0c;生成式引擎优化&#xff08;GEO&#xff09;将彻底颠覆…

实用蓝牙耳机哪款好?先做好使用场景分析!

市面上的蓝牙耳机款式繁多&#xff0c;618到来之际&#xff0c;消费者如何选择适合自己的蓝牙耳机&#xff1f;实用蓝牙耳机哪款好&#xff1f;关键在于做好使用场景分析&#xff01;今天&#xff0c;就带大家结合不同的使用场景&#xff0c;分享三款倍思音频的精品蓝牙耳机。 …

PTA刷题笔记3(微难,有详解)

7-15 计算圆周率 代码如下&#xff1a; #include <stdio.h>int main() {double threshold;scanf("%lf", &threshold);double pi_over_2 1.0; // π/2的初始值&#xff08;第一项1&#xff09;double term 1.0; // 当前项的值int n 1; …

基于SpringBoot+Vue的社区医院信息平台设计与实现

项目背景与概述 随着医疗健康信息化的发展&#xff0c;社区医院的管理逐渐由传统的手工模式转向信息化管理。为了提高医院的管理效率、减少人工操作、提升服务质量&#xff0c;开发一个高效且实用的社区医院信息平台显得尤为重要。本系统基于Spring Boot框架与MySQL数据库设计…

旧物回收小程序:让闲置焕发光彩,为生活增添价值

你是否常常为家中堆积如山的闲置物品而烦恼&#xff1f;那些曾经心爱的物品&#xff0c;如今却成了占据空间的“鸡肋”&#xff0c;丢弃可惜&#xff0c;留着又无处安放。别担心&#xff0c;一款旧物二手回收小程序将为你解决这一难题&#xff0c;让闲置物品重新焕发光彩&#…

掩码与网关是什么?

1. 子网掩码&#xff08;Subnet Mask&#xff09; 作用&#xff1a;划分“小区”范围 想象你住在一个小区&#xff08;子网&#xff09;里&#xff1a; 小区门牌号 IP地址&#xff08;如 192.168.1.10&#xff09; 小区边界 子网掩码&#xff08;如 255.255.255.0&#xf…

【Bluedroid】蓝牙HID Host disconnect流程源码解析

本文基于 Android 蓝牙 HID&#xff08;Human Interface Device&#xff09;Host 模块的源码&#xff0c;深入解析 HID 设备断开连接的完整流程。重点覆盖从应用层触发断开请求&#xff0c;到 BTIF 层&#xff08;接口适配层&#xff09;状态校验与异步传递、BTA 层&#xff08…

python定时删除指定索引

脚本 import logging from datetime import datetime, timedelta from elasticsearch import Elasticsearch# 配置日志记录 logging.basicConfig(filenamedelete_uat_indices.log,levellogging.INFO,format%(asctime)s - %(levelname)s - %(message)s )# Elasticsearch 集群的…

GESP编程等级认证C++三级7-字符、字符数组与字符串2

2.3 用字符串定义字符数组的好处 使用字符串定义字符数组需要额外考虑其末尾的“\0”&#xff0c;为什么还要使用这种看上去“麻烦”的方法呢&#xff1f;从图5所示的代码就能看出原因。 图5 用字符串定义字符数组好处的代码 从图5中可以看出&#xff0c;a4是用字符串进行初始…

EasyRTC音视频实时通话WebP2P技术赋能的全场景实时通信解决方案

一、技术背景 在数字化浪潮席卷全球的当下&#xff0c;实时通信技术凭借其即时性、高效性的优势&#xff0c;已然成为推动各行业创新发展的核心动能。EasyRTC深度融合WebP2P技术&#xff0c;构建起去中心化的通信架构&#xff0c;实现了低延迟、高可靠的数据传输&#xff0c;为…