1. kafka消费者的Consume()方法会阻塞;
  2. 当Consume()方法返回err时,不确定继续消费有没有问题;保险起见,退出进程,然后重新初始化。
  3. 当Consume()方法返回nil是,是可以继续消费的,亲测有效。

需要注意的点写在了注释里:

//StartKafkaConsumer 启动kafka消费者
func StartKafkaConsumer(ctx context.Context) {
//defer utils.ForPanic() //当消费者出现问题的时候,通过panic退出进程。然后重新启动初始化
//因此代码里不要加panic处理的机制
config := sarama.NewConfig()
config.Version = sarama.V2_1_0_0 // specify appropriate version
config.Consumer.Return.Errors = true
cfg := ReaderConfig.Config()
group, err := sarama.NewConsumerGroup(
[]string{cfg.GetString("kafka.addr")},
cfg.GetString("kafka.group_id"), config)
if err != nil {
my_logger.Errorf("sarama.NewConsumerGroup error, err=%s", err.Error())
panic(err)
//return
}
defer func() { _ = group.Close() }() // Track errors
go func() {
defer utils.ForPanic()
for err := range group.Errors() {
if err != nil {
my_logger.Errorf("consumer error:%s", err.Error())
}
}
}()
topics := []string{cfg.GetString("kafka.topics")}
queueSize := cfg.GetInt64("kafka.queue_size")
if queueSize <= 0 {
my_logger.Errorf("queueSize <= 0")
panic("queue_size error")
}
log.Printf("queue size:%d\n", queueSize)
handler := ConsumerGroupHandler{
Pipe: make(chan []byte, queueSize),
}
coroutineCount := cfg.GetInt64("kafka.co_count")
if coroutineCount <= 0 {
my_logger.Errorf("coroutineCount <= 0")
panic("coroutineCount error")
}
for i := 0; i < int(coroutineCount); i++ {
go handler.Do()
}
log.Println("start success!")
for {
//关键代码
//正常情况下:Consume()方法会一直阻塞
//我测试发现,约30分钟左右,Consume()会返回,但没有error
//无error的情况下,可以重复调用Consume()方法
//当有error产生的时候,不确定Consume()是否能够继续完善的执行。
//因此保险的办法是抛出panic,让进程重启。
err = group.Consume(context.Background(), topics, &handler)
if err != nil {
my_logger.Errorf("group.Consume error: err=%s", err.Error())
panic(err)
} else {
my_logger.Info("group.Consume exit")
}
}
}

golang中使用kafka客户端sarama消费时需要注意的一个点的更多相关文章

  1. 【解决了一个小问题】golang samara的kafka客户端中使用错误版本号导致初始化失败

    发现在如下代码中存储kafka生产者初始化失败: config.Version = sarama.V0_10_2_1 //V2_2_0_0 producer, err := sarama.NewSyn ...

  2. Golang中使用kafka

    golang中比较好用的kafka client有 sarama confluent-kafka-go go_kafka_client optiopay-kafka siesta 其中 sarama的 ...

  3. Effective C++ 条款11,12 在operator= 中处理“自我赋值” || 复制对象时不要忘记每一个成分

    1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象, ...

  4. 从0开始搭建kafka客户端

    上一节,我们实现了搭建kafka集群.本节我们将从0开始,使用Java,搭建kafka客户端生产消费模型. 1.创建maven项目2.kafka producer3.kafka consumer4.结 ...

  5. 说说不知道的Golang中参数传递

    本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为.在golang中存在着m ...

  6. Golang中如何正确的使用sarama包操作Kafka?

    Golang中如何正确的使用sarama包操作Kafka? 一.背景 在一些业务系统中,模块之间通过引入Kafka解藕,拿IM举例(图来源): 用户A给B发送消息,msg_gateway收到消息后,投 ...

  7. 关于Java客户端连接虚拟机中的Kafka时,无法发送、接收消息的问题

    kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案? 1.问题排查 (1)首先通过在服务器上使用命令行来模拟生产.消费数据,发现 ...

  8. 【Azure Developer】在Azure VM (Windows) 中搭建 kafka服务,并且通过本地以及远程验证 发送+消费 消息

    问题描述 查看了 "How to Install and Run Apache Kafka on Windows? " 一文后,成功安装了Kafka服务,但是如何使用呢?如何在其他 ...

  9. kafka客户端代码解析

    转载:http://backend.blog.163.com/blog/static/202294126201431724652597/ 可以使用服务器端下载的kafka二进制包及依赖,也可以通过ma ...

随机推荐

  1. centos使用shell脚本定时备份docker中的mysql数据库

    shell脚本 #!/bin/bash #容器ID container_id="6b1faea2b4d7" #登录用户名 mysql_user="root" # ...

  2. 输入npm install 报错npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass@4.13.1 postinstall: `node scripts/build.js`

    输入npm install 报以下错误 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass@4.13.1 postinstall: ...

  3. table中tr、td标签设置只读,不能修改(readonly属性)

    在不能修改的位置加上代码:onselectstart="return false" οnselect="document.selection.empty()" ...

  4. JAVA里List集合中的对象根据对象的某个属性值降序或者升序排序

    需要使用JDK1.8及以上 package com.stream; import java.util.Comparator; import java.util.List; public class T ...

  5. JS动态加载JS文件

    有时候我们要根据场景加载不同的js文件,比如PC站加载某个文件,手机站不加载 <script> if ((navigator.userAgent.match(/(iPhone|iPod|A ...

  6. c++之可变参数格式化字符串(c++11可变模板参数)

    本文将使用 泛型 实现可变参数. 涉及到的关见函数:  std::snprintf 1.一个例子 函数声明及定义 1 // 泛型 2 template <typename... Args> ...

  7. 【LeetCode】138. Copy List with Random Pointer 复制带随机指针的链表 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号:负雪明烛 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https:/ ...

  8. 理解HTTP协议中的multipart/form-data

    前提 之前在写一个通用HTTP组件的时候遇到过媒体(Media)类型multipart/form-data的封装问题,这篇文章主要简单介绍一下HTTP协议中媒体类型multipart/form-dat ...

  9. PlatformIO+Jlink进行调试

    PlatformIO自带调试功能具体配置如下 https://docs.platformio.org/en/latest/plus/debug-tools/jlink.html     我是用的是直接 ...

  10. 高效位运算 __builtin_系列函数

    •int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比如7368(1110011001000)返回4. •int __builtin_clz ...