当前位置: 首页 > article >正文

Go语言使用 kafka-go 消费 Kafka 消息教程

Go语言使用 kafka-go 消费 Kafka 消息教程

在这篇教程中,我们将介绍如何使用 kafka-go 库来消费 Kafka 消息,并重点讲解 FetchMessageReadMessage 的区别,以及它们各自适用的场景。通过这篇教程,你将了解如何有效地使用 kafka-go 库来处理消息和管理偏移量。

安装 kafka-go

首先,你需要在项目中安装 kafka-go 库。可以使用以下命令:

go get github.com/segmentio/kafka-go
初始化 Kafka Reader

为了从 Kafka 消费消息,我们首先需要配置和初始化 Kafka Reader。以下是一个简单的 Kafka Reader 初始化示例:

package main

import (
    "context"
    "log"
    "github.com/segmentio/kafka-go"
)

func main() {
    // 创建 Kafka Reader
    kafkaReader := kafka.NewReader(kafka.ReaderConfig{
        Brokers:   []string{"localhost:9092"}, // Kafka broker 地址
        Topic:     "example-topic",            // 订阅的 Kafka topic
        GroupID:   "example-group",            // 消费者组 ID
        Partition: 0,                          // 分区号 (可选)
        MinBytes:  10e3,                       // 10KB
        MaxBytes:  10e6,                       // 10MB
    })

    defer kafkaReader.Close()
}
使用 FetchMessage 消费消息

FetchMessage 允许你从 Kafka 消费消息并手动提交偏移量,这给你对消息处理的更精确控制。以下是如何使用 FetchMessage 的示例:

func consumeWithFetchMessage() {
    ctx := context.Background()
    
    for {
        // 从 Kafka 中获取下一条消息
        m, err := kafkaReader.FetchMessage(ctx)
        if err != nil {
            log.Printf("获取消息时出错: %v", err)
            break
        }

        // 打印消息内容
        log.Printf("消息: %s, 偏移量: %d", string(m.Value), m.Offset)

        // 处理消息 (在这里可以进行你的业务逻辑)

        // 手动提交偏移量
        if err := kafkaReader.CommitMessages(ctx, m); err != nil {
            log.Printf("提交偏移量时出错: %v", err)
        }
    }
}
优点
  • 精确控制偏移量:在处理消息后,你可以手动选择是否提交偏移量,这样可以确保只有在消息处理成功后才提交。
  • 重试机制:可以灵活地处理失败消息,例如在处理失败时,不提交偏移量,从而实现消息的重新消费。
缺点
  • 代码复杂度增加:需要手动处理偏移量提交,会增加一些额外的代码量。
使用 ReadMessage 消费消息

ReadMessage 是一种更简单的方式,从 Kafka 中获取消息并自动提交偏移量。适用于对消费逻辑不太敏感的场景。以下是使用 ReadMessage 的示例:

func consumeWithReadMessage() {
    ctx := context.Background()
    
    for {
        // 从 Kafka 中读取下一条消息并自动提交偏移量
        dataInfo, err := kafkaReader.ReadMessage(ctx)
        if err != nil {
            log.Printf("读取消息时出错: %v", err)
            break
        }

        // 打印消息内容
        log.Printf("消息: %s, 偏移量: %d", string(dataInfo.Value), dataInfo.Offset)

        // 处理消息 (在这里可以进行你的业务逻辑)
    }
}
优点
  • 简单易用ReadMessage 自动提交偏移量,代码简洁,易于维护。
  • 快速开发:适合简单的消息处理逻辑和对消息可靠性要求不高的场景。
缺点
  • 缺乏灵活性:无法在处理失败时重新消费消息,因为偏移量已经自动提交。
总结选择
方法优点缺点适用场景
FetchMessage需要手动提交偏移量,精确控制消息处理和提交逻辑代码复杂度较高需要精确控制消息处理的场景,例如处理失败重试
ReadMessage简单易用,自动提交偏移量,代码更简洁无法重新消费已处理失败的消息简单的消息处理,对消息处理成功率要求不高的场景
完整示例

以下是一个完整的 Kafka 消费者示例,包括 FetchMessageReadMessage 两种方法。可以根据你的需求选择合适的方法:

package main

import (
    "context"
    "log"
    "github.com/segmentio/kafka-go"
)

func main() {
    // 创建 Kafka Reader
    kafkaReader := kafka.NewReader(kafka.ReaderConfig{
        Brokers:   []string{"localhost:9092"},
        Topic:     "example-topic",
        GroupID:   "example-group",
        MinBytes:  10e3, // 10KB
        MaxBytes:  10e6, // 10MB
    })

    defer kafkaReader.Close()

    // 使用 FetchMessage 消费消息
    log.Println("开始使用 FetchMessage 消费 Kafka 消息...")
    consumeWithFetchMessage(kafkaReader)

    // 使用 ReadMessage 消费消息
    log.Println("开始使用 ReadMessage 消费 Kafka 消息...")
    consumeWithReadMessage(kafkaReader)
}

func consumeWithFetchMessage(kafkaReader *kafka.Reader) {
    ctx := context.Background()

    for {
        m, err := kafkaReader.FetchMessage(ctx)
        if err != nil {
            log.Printf("FetchMessage 获取消息时出错: %v", err)
            break
        }

        log.Printf("FetchMessage 消息: %s, 偏移量: %d", string(m.Value), m.Offset)

        // 手动提交偏移量
        if err := kafkaReader.CommitMessages(ctx, m); err != nil {
            log.Printf("FetchMessage 提交偏移量时出错: %v", err)
        }
    }
}

func consumeWithReadMessage(kafkaReader *kafka.Reader) {
    ctx := context.Background()

    for {
        dataInfo, err := kafkaReader.ReadMessage(ctx)
        if err != nil {
            log.Printf("ReadMessage 读取消息时出错: %v", err)
            break
        }

        log.Printf("ReadMessage 消息: %s, 偏移量: %d", string(dataInfo.Value), dataInfo.Offset)
    }
}
结语

通过本教程,你学会了如何使用 kafka-goFetchMessageReadMessage 方法消费 Kafka 消息。根据项目需求选择合适的消费方式,合理管理偏移量以确保消息处理的可靠性和效率。


http://www.kler.cn/a/405700.html

相关文章:

  • useEffect、useCallback、useMemo和memo的区别
  • 【1.4 Getting Started--->Support Matrix】
  • JavaWeb之综合案例
  • 滑动窗口篇——如行云流水般的高效解法与智能之道(1)
  • 如何使用Jmeter做性能测试?
  • 7天掌握SQL - 第一天:数据库基础与SQL入门
  • QA|使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R)
  • Paper -- 洪水深度估计 -- 基于计算机视觉, 根据被淹车辆图像进行洪水深度估计
  • nginx 配置lua执行shell脚本
  • Linux ASLR
  • 【数据结构】—— 树
  • 从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程
  • HTML 元素详解
  • 标贝科技:自动驾驶中的数据标注类别分享
  • 物联网研究实训室建设方案
  • Nuxt3:拉取项目模板失败问题解决方法
  • 【自动驾驶】数据集合集!
  • Spark SQL 之 QueryStage
  • C++基础:vector的底层实现
  • Linux 查看端口和进程的常用命令
  • 【优选算法】二分查找
  • 软件测试——自动化测试常见函数
  • 【shell编程】shell基础之for与while循环
  • ElementUI之给el-table实现搜索功能
  • 线性回归学习笔记
  • 【prism】遇到一个坑,分享!