Kafka-Go学习
文章目录
- 1. **安装 `kafka-go`**
- 2. **基本概念**
- 3. **`kafka-go` 基本用法**
- 3.1 创建 Producer(生产者)
- 3.2 创建 Consumer(消费者)
- 3.3 生产者和消费者配置详解
- 生产者配置 (`kafka.WriterConfig`)
- 消费者配置 (`kafka.ReaderConfig`)
- 4. **高级用法**
- 4.1 消费者偏移量管理
- 4.2 分区管理
- 4.3 使用 SASL 认证
- 5. **Kafka 生产者与消费者优化**
- 5.1 优化生产者
- 5.2 优化消费者
- 6. **错误处理**
- 7. **总结**
- 常用资源
kafka-go 是 Go 语言中一个轻量级、高效的 Kafka 客户端库,提供了简单易用的 API 来与 Apache Kafka 进行交互。
kafka-go 支持 Kafka 的生产者和消费者功能,适用于 Go 应用程序中使用 Kafka 进行消息队列的实现。
1. 安装 kafka-go
首先,需要在 Go 项目中安装 kafka-go 库:
go get github.com/segmentio/kafka-go
2. 基本概念
- Producer (生产者):生产者负责将消息发送到 Kafka 中的某个主题。
- Consumer (消费者):消费者从 Kafka 中读取消息。
- Topic (主题):Kafka 将消息按主题进行分类,每个主题可能有多个分区。
- Partition (分区):每个主题可以被划分为若干个分区,消息在分区之间进行负载均衡。
3. kafka-go 基本用法
3.1 创建 Producer(生产者)
生产者的作用是向 Kafka 的主题中发送消息。kafka-go 提供了一个简单的 API 来实现消息的生产。
package mainimport ("context""fmt""log""time""github.com/segmentio/kafka-go"
)func main() {// 配置 Kafka writer(生产者)writer := kafka.NewWriter(kafka.WriterConfig{Brokers: []string{"localhost:9092"}, // Kafka broker 地址Topic: "example-topic", // 发送到的 Kafka 主题Balancer: &kafka.LeastBytes{}, // 负载均衡策略})// 定义上下文ctx := context.Background()// 发送消息err := writer.WriteMessages(ctx,kafka.Message{Key: []byte("Key-A"),Value: []byte("Hello Kafka!"),},kafka.Message{Key: []byte("Key-B"),Value: []byte("Another Message"),},)if err != nil {log.Fatal("Failed to write messages:", err)}fmt.Println("Messages successfully sent to Kafka")// 关闭 writerif err := writer.Close(); err != nil {log.Fatal("Failed to close writer:", err)}
}
3.2 创建 Consumer(消费者)
消费者从 Kafka 的主题中读取消息。你可以设置不同的消费者组来实现分布式消费。
package mainimport ("context""fmt""log""time""github.com/segmentio/kafka-go"
)func main() {// 配置 Kafka reader(消费者)reader := kafka.NewReader(kafka.ReaderConfig{Brokers: []string{"localhost:9092"}, // Kafka broker 地址Topic: "example-topic", // 读取的 Kafka 主题GroupID: "example-group", // 消费者组 IDMinBytes: 10e3, // 每次 fetch 请求最少读取 10KBMaxBytes: 10e6, // 每次 fetch 请求最多读取 10MB})// 读取消息for {// 设置上下文ctx := context.Background()// 读取消息msg, err := reader.ReadMessage(ctx)if err != nil {log.Fatal("Failed to read message:", err)}// 打印消息fmt.Printf("Message at offset %d: key = %s, value = %s\n", msg.Offset, string(msg.Key), string(msg.Value))// 模拟延迟,避免占用过多 CPU 资源time.Sleep(1 * time.Second)}// 关闭 readerif err := reader.Close(); err != nil {log.Fatal("Failed to close reader:", err)}
}
3.3 生产者和消费者配置详解
生产者配置 (kafka.WriterConfig)
Brokers:Kafka broker 的地址列表。Topic:指定生产者要发送消息的 Kafka 主题。Balancer:消息负载均衡策略,如LeastBytes(最小字节数分配)或Hash(基于消息 key 的哈希分配)。
消费者配置 (kafka.ReaderConfig)
Brokers:Kafka broker 的地址列表。Topic:指定消费者要读取的 Kafka 主题。GroupID:消费者组 ID,Kafka 会将同一个组的消费者平衡分配到不同的分区。MinBytes和MaxBytes:每次从 Kafka 读取的最小和最大字节数,影响消息的拉取频率和性能。
4. 高级用法
4.1 消费者偏移量管理
Kafka 消费者通过偏移量(Offset)来管理读取进度,kafka-go 自动为你处理偏移量提交,但你也可以手动管理。
package mainimport ("context""fmt""log""github.com/segmentio/kafka-go"
)func main() {reader := kafka.NewReader(kafka.ReaderConfig{Brokers: []string{"localhost:9092"},Topic: "example-topic",GroupID: "example-group",})// 读取消息并手动提交偏移量for {msg, err := reader.FetchMessage(context.Background())if err != nil {log.Fatal("Failed to fetch message:", err)}fmt.Printf("Message: %s = %s\n", string(msg.Key), string(msg.Value))// 手动提交消息偏移量if err := reader.CommitMessages(context.Background(), msg); err != nil {log.Fatal("Failed to commit message:", err)}}if err := reader.Close(); err != nil {log.Fatal("Failed to close reader:", err)}
}
4.2 分区管理
Kafka 主题中的消息被分布在多个分区中,kafka-go 允许生产者根据消息的 Key 选择分区,确保相同的 Key 总是发送到同一个分区。
writer := kafka.NewWriter(kafka.WriterConfig{Brokers: []string{"localhost:9092"},Topic: "example-topic",Balancer: &kafka.Hash{}, // 基于 Key 的 Hash 分配到相同分区
})
4.3 使用 SASL 认证
如果 Kafka 使用了 SASL(Simple Authentication and Security Layer)认证机制,你可以通过 kafka-go 提供的 SASL 支持来进行认证。
import "github.com/segmentio/kafka-go/sasl/plain"dialer := &kafka.Dialer{SASLMechanism: plain.Mechanism{Username: "my-username",Password: "my-password",},
}reader := kafka.NewReader(kafka.ReaderConfig{Brokers: []string{"localhost:9092"},Topic: "example-topic",Dialer: dialer, // 配置认证
})
5. Kafka 生产者与消费者优化
5.1 优化生产者
- Batching:批量发送消息能提升效率,
kafka-go允许配置批量发送。 - Compression:使用压缩算法如
gzip或snappy,可以减少网络带宽使用。
writer := kafka.NewWriter(kafka.WriterConfig{Brokers: []string{"localhost:9092"},Topic: "example-topic",BatchSize: 100, // 设置批量大小BatchTimeout: time.Millisecond * 10,Compression: kafka.Gzip,
})
5.2 优化消费者
- 并发消费:可以启动多个消费者来读取不同的分区,提升消息处理的吞吐量。
- 流量控制:通过配置
MinBytes和MaxBytes来控制每次 fetch 的大小,从而优化消费者的性能。
6. 错误处理
Kafka 通常是分布式的,可能会遇到网络故障或 broker 不可用等问题。在生产者和消费者中应该使用适当的错误处理和重试机制。
for {err := writer.WriteMessages(ctx, msg)if err != nil {fmt.Println("Error writing message:", err)time.Sleep(1 * time.Second) // 简单的重试机制}
}
7. 总结
kafka-go 是 Go 语言中用于与 Kafka 进行通信的一个简洁高效的库,提供了生产者、消费者、分区管理、偏移量管理等完整的功能。它的 API 设计简单易用,同时具有较高的性能和扩展性,适合在 Go 应用中集成 Kafka 消息队列。
常用资源
- Kafka 官方文档:https://kafka.apache.org/documentation/
- kafka-go 官方文档:https://github.com/segmentio/kafka-go
相关文章:
Kafka-Go学习
文章目录 1. **安装 kafka-go**2. **基本概念**3. **kafka-go 基本用法**3.1 创建 Producer(生产者)3.2 创建 Consumer(消费者)3.3 生产者和消费者配置详解生产者配置 (kafka.WriterConfig)消费者配置 (kafka.ReaderConfig) 4. **…...
Nginx反向代理出现502 Bad Gateway问题的解决方案
🎉 前言 前一阵子写了一篇“关于解决调用百度翻译API问题”的博客,近日在调用其他API时又遇到一些棘手的问题,于是写下这篇博客作为记录。 🎉 问题描述 在代理的遇到过很多错误码,其中出现频率最高的就是502&#x…...
通信工程学习:什么是VLAN虚拟局域网
VLAN:虚拟局域网 VLAN(Virtual Local Area Network,虚拟局域网)是一种将物理局域网在逻辑上划分成多个广播域的通信技术。以下是关于VLAN的详细解释: 一、VLAN虚拟局域网的定义与概述 VLAN通过逻辑方式将网络中的设备…...
python qt5 常用
QT5中如何设置让窗口根据屏幕比例显示设置? desktop QDesktopWidget().screenGeometry() self.resize(int(desktop.width() * 0.3), int(desktop.height()*0.5)) QT5中关于背景穿透问题的处理方式? 场景如下:我们在开发的时候,…...
漏洞复现_永恒之蓝
1.概述 永恒之蓝(EternalBlue)是一个影响Windows操作系统的远程代码执行漏洞,编号为CVE-2017-0144,最初由美国国家安全局(NSA)开发并利用,后来被黑客组织Shadow Brokers泄露。该漏洞存在于SMBv…...
PyCharm的使用
PyCharm的入门使用教程 下载和安装PyCharm: 首先,访问JetBrains官方网站(https://www.jetbrains.com/pycharm/)下载PyCharm的最新版本。根据您的操作系统选择合适的版本进行下载。 安装完成后,打开PyCharm。 创建新…...
浅谈C#之AutoResetEvent和ManualResetEvent
一、基本介绍 AutoResetEvent和ManualResetEvent都是同步原语,它们用于线程之间的协调和通信。它们都是从EventWaitHandle类派生的,但它们在重置事件状态的行为上有所不同。 二、简单示例 AutoResetEvent AutoResetEvent是一个自动重置的事件。当一个线…...
【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等
文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…...
VuePress搭建文档网站/个人博客(详细配置)主题配置
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
Go语言笔记
目录 一、变量声明 二、流程控制 if(条件判断) for(循环结构) Switch(简化if) goto(跳出循环) 三、运算符 1、算数运算符 2、关系运算符 3、逻辑运算符 4、位运算符 5、…...
java缓存介绍
在Java编程中,缓存技术是一种非常有效的优化手段,用于减少数据访问的延迟和提高应用性能。缓存技术通过存储数据的副本在内存中,使得后续对相同数据的请求能够直接从内存中快速获取,而不需要再次进行耗时的磁盘访问或网络请求。 缓…...
react中diff的选择性子树渲染
在React中,组件的渲染是高效的,这得益于React的虚拟DOM(Virtual DOM)和diff算法。React的diff算法主要用于比较旧虚拟DOM树和新虚拟DOM树之间的差异,并仅更新实际DOM中需要变化的部分,从而提高性能。 关于…...
Git clone远程仓库没有其他分支的问题
在使用Git克隆(Git clone)时,可能遇到分支不全的问题。有以下几种可能的原因和解决方法: 未将所有分支克隆下来:默认情况下,Git只会克隆远程仓库的主分支。如果您想要克隆其他分支,可以使用以下…...
山东潍坊戴尔存储服务器维修 md3800f raid恢复
山东戴尔存储故障维修 存储型号:DELL PowerVault md3800f 故障问题:存储除尘后通电开机,发现有物理硬盘没有插到位,用户带电拔插了多块物理盘,导致关连的磁盘阵列掉线,卷失败; 处理方式…...
Hive企业级调优[6]——HQL语法优化之任务并行度
目录 HQL语法优化之任务并行度 优化说明 Map端并行度 Reduce端并行度 优化案例 HQL语法优化之任务并行度 优化说明 对于分布式计算任务来说,设置一个合理的并行度至关重要。Hive的计算任务依赖于MapReduce框架来完成,因此并行度的调整需要从Map端和…...
Excel 冻结多行多列
背景 版本:office 2021 专业版 无法像下图内某些版本一样,识别选中框选的多行多列。 如下选中后毫无反应,点击【视图】->【冻结窗口】->【冻结窗格】后自动设置为冻结第一列。 操作 如下,要把前两排冻结起来。 选择 C1&a…...
基于微信小程序的智慧物业管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...
【论文笔记】BEVNeXt: Reviving Dense BEV Frameworks for 3D Object Detection
原文链接:https://arxiv.org/pdf/2312.01696 简介:最近,在摄像头3D目标检测任务中,基于查询的Transformer解码器正在超越传统密集BEV方法。但密集BEV框架有着更好的深度估计和目标定位能力,能全面精确地描绘3D场景。本…...
基于open-gpu-kernel-modules的p2p vram映射bar1提高通信效率
背景 bar1 Base Address Register 1 用于内存映射的寄存器,定义了设备的内存映射区域,BAR1专门分配给gpu的一部分内存区域,允许cpu通过pcie总线直接访问显存VRAM中的数据。但bar1的大小是有限的,在常规的4090上,bar1只…...
java之斗地主部分功能的实现
今天我们要实现斗地主中发牌和洗牌这两个功能,该如何去实现呢? 1.创建牌类:52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card):包含大小和花色。 public class Card { //单张牌的大小及类型/…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
