golang中使用kafka客户端sarama消费时需要注意的一个点
- kafka消费者的Consume()方法会阻塞;
- 当Consume()方法返回err时,不确定继续消费有没有问题;保险起见,退出进程,然后重新初始化。
- 当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消费时需要注意的一个点的更多相关文章
- 【解决了一个小问题】golang samara的kafka客户端中使用错误版本号导致初始化失败
发现在如下代码中存储kafka生产者初始化失败: config.Version = sarama.V0_10_2_1 //V2_2_0_0 producer, err := sarama.NewSyn ...
- Golang中使用kafka
golang中比较好用的kafka client有 sarama confluent-kafka-go go_kafka_client optiopay-kafka siesta 其中 sarama的 ...
- Effective C++ 条款11,12 在operator= 中处理“自我赋值” || 复制对象时不要忘记每一个成分
1.潜在的自我赋值 a[i] = a[j]; *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象, ...
- 从0开始搭建kafka客户端
上一节,我们实现了搭建kafka集群.本节我们将从0开始,使用Java,搭建kafka客户端生产消费模型. 1.创建maven项目2.kafka producer3.kafka consumer4.结 ...
- 说说不知道的Golang中参数传递
本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为.在golang中存在着m ...
- Golang中如何正确的使用sarama包操作Kafka?
Golang中如何正确的使用sarama包操作Kafka? 一.背景 在一些业务系统中,模块之间通过引入Kafka解藕,拿IM举例(图来源): 用户A给B发送消息,msg_gateway收到消息后,投 ...
- 关于Java客户端连接虚拟机中的Kafka时,无法发送、接收消息的问题
kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案? 1.问题排查 (1)首先通过在服务器上使用命令行来模拟生产.消费数据,发现 ...
- 【Azure Developer】在Azure VM (Windows) 中搭建 kafka服务,并且通过本地以及远程验证 发送+消费 消息
问题描述 查看了 "How to Install and Run Apache Kafka on Windows? " 一文后,成功安装了Kafka服务,但是如何使用呢?如何在其他 ...
- kafka客户端代码解析
转载:http://backend.blog.163.com/blog/static/202294126201431724652597/ 可以使用服务器端下载的kafka二进制包及依赖,也可以通过ma ...
随机推荐
- Base64编码原来是这么回事儿
鸣谢CSDN文章:https://blog.csdn.net/believesoul/article/details/84100616 一.言简意赅理解Base64编码 就是将以"字节&qu ...
- python获取命令行传参的两种种常用方法argparse解析getopt 模块解析
方法一:argparse解析 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 2020/5/20 10:38 # @Author:zhan ...
- React-Router(二)
URL参数部分 import React from "react"; import { BrowserRouter as Router, Switch, Route, Link, ...
- JAVAWEB统一返回格式Result类
Result.java public class Result<T> { private Integer code; private String msg; private String ...
- qt creator设置默认输出目录
note creator version : 4.13.1 敲黑板,一定要先配置好 Qt creator的default build directory , 再创建项目,最后再编译 敲黑板,一定要先配 ...
- c++之记一次常见数据类型在fedora和wind10下所占的长度
包括: char , int , float, double, long ,long long , unsigned long long , long double 1.源码 #include < ...
- 【LeetCode】1433. 检查一个字符串是否可以打破另一个字符串 Max Difference You Can Get From Changing an Integer
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcode ...
- 【九度OJ】题目1015:还是A+B 解题报告
[九度OJ]题目1015:还是A+B 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1015 题目描述: 读入两个小于10000的正整 ...
- 【LeetCode】677. Map Sum Pairs 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 前缀树 日期 题目地址:https://lee ...
- 【剑指Offer】树的子结构 解题报告(Python)
[剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...