Golang操作Kafka的实现示例

 更新时间:2023年02月19日 09:00:04   作者:YUHAOHAO  
本文主要介绍了Golang操作Kafka的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一.使用库说明

Golang中连接kafka可以使用第三方库:github.com/Shopify/sarama

二.Kafka Producer发送消息

package main 

import (
    "fmt"
    "github.com/Shopify/sarama"
)

func main() {
    config := sarama.NewConfig()
    config.Producer.RequiredAcks = sarama.WaitForAll // 发送完数据需要leader和follower都确认
    config.Producer.Partitioner = sarama.NewRandomPartitioner  //写到随机分区中,我们默认设置32个分区
    config.Producer.Return.Successes = true // 成功交付的消息将在success channel返回

    // 构造一个消息
    msg := &sarama.ProducerMessage{}
    msg.Topic = "task"
    msg.Value = sarama.StringEncoder("producer kafka messages...")

    // 连接kafka
    client, err := sarama.NewSyncProducer([]string{"192.20.216.8:9092"}, config)
    if err != nil {
        fmt.Println("Producer closed, err:", err)
        return
    }
    defer client.Close()

    // 发送消息
    pid, offset, err := client.SendMessage(msg)
    if err != nil {
        fmt.Println("send msg failed, err:", err)
        return
    }
    fmt.Printf("pid:%v offset:%v\n", pid, offset)
}

三.Kafka Consumer消费消息

package main

import (
    "fmt"
    "github.com/Shopify/sarama"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    consumer, err := sarama.NewConsumer([]string{"192.20.216.8:9092"}, nil)
    if err != nil {
        fmt.Println("Failed to start consumer: %s", err)
        return
    }
    partitionList, err := consumer.Partitions("task-status-data") // 通过topic获取到所有的分区
    if err != nil {
        fmt.Println("Failed to get the list of partition: ", err)
        return
    }
    fmt.Println(partitionList)

    for partition := range partitionList{ // 遍历所有的分区
        pc, err := consumer.ConsumePartition("task", int32(partition), sarama.OffsetNewest) // 针对每个分区创建一个分区消费者
        if err != nil {
            fmt.Println("Failed to start consumer for partition %d: %s\n", partition, err)
        }
        wg.Add(1)
        go func(sarama.PartitionConsumer) { // 为每个分区开一个go协程取值
            for msg := range pc.Messages() { // 阻塞直到有值发送过来,然后再继续等待
                fmt.Printf("Partition:%d, Offset:%d, key:%s, value:%s\n", msg.Partition, msg.Offset, string(msg.Key), string(msg.Value))
            }
            defer pc.AsyncClose()
            wg.Done()
        }(pc)
    }
    wg.Wait()
    consumer.Close()
}

到此这篇关于Golang操作Kafka的实现示例的文章就介绍到这了,更多相关Golang操作Kafka内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go-zero熔断机制组件Breaker接口定义使用解析

    go-zero熔断机制组件Breaker接口定义使用解析

    这篇文章主要为大家介绍了go-zero熔断机制组件Breaker接口定义使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • golang time包下定时器的实现方法

    golang time包下定时器的实现方法

    定时器的实现大家应该都遇到过,最近在学习golang,所以下面这篇文章主要给大家介绍了关于golang time包下定时器的实现方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • 深入理解Go设计模式之代理模式

    深入理解Go设计模式之代理模式

    代理模式是一种结构型设计模式, 其中代理控制着对于原对象的访问, 并允许在将请求提交给原对象的前后进行一些处理,从而增强原对象的逻辑处理,这篇文章主要来学习一下代理模式的构成和用法,需要的朋友可以参考下
    2023-05-05
  • 详解go-admin在线开发平台学习(安装、配置、启动)

    详解go-admin在线开发平台学习(安装、配置、启动)

    这篇文章主要介绍了go-admin在线开发平台学习(安装、配置、启动),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 详解Go语言变量作用域

    详解Go语言变量作用域

    这篇文章主要介绍了Go 语言变量作用域的相关资料,帮助大家更好的理解和学习使用go语言,感兴趣的朋友可以了解下
    2021-03-03
  • GO中Json解析的几种方式

    GO中Json解析的几种方式

    本文主要介绍了GO中Json解析的几种方式,详细的介绍了几种方法, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 基于Go+OpenCV实现人脸识别功能的详细示例

    基于Go+OpenCV实现人脸识别功能的详细示例

    OpenCV是一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,本文将向你介绍在Mac上安装OpenCV的步骤,并演示如何使用Go的OpenCV绑定库进行人脸识别,需要的朋友可以参考下
    2023-07-07
  • go编程中go-sql-driver的离奇bug解决记录分析

    go编程中go-sql-driver的离奇bug解决记录分析

    这篇文章主要为大家介绍了go编程中go-sql-driver的离奇bug解决记录分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go语言基础学习教程

    Go语言基础学习教程

    这篇文章主要介绍了Go语言基础知识,包括基本语法、语句、数组等的定义与用法,需要的朋友可以参考下
    2016-07-07
  • GoLang jwt无感刷新与SSO单点登录限制解除方法详解

    GoLang jwt无感刷新与SSO单点登录限制解除方法详解

    这篇文章主要介绍了GoLang jwt无感刷新与SSO单点登录限制解除方法,JWT是一个签名的JSON对象,通常用作Oauth2的Bearer token,JWT包括三个用.分割的部分。本文将利用JWT进行认证和加密,感兴趣的可以了解一下
    2023-03-03

最新评论