read tcp :49560->:9092: i/o timeout under sarama kafka golang panic

我们经常出现这个问题,除了上次修复完后,正常跑也总有这种问题。因为我们的场景是文件扫描,文件扫描的处理方式是很重的,消费时间长。所以经常触发重平衡。

那么又回到了原始问题。第一性原理,运维和架构,就是要做工程上的最佳实践,而不是什么技术新旧。最佳实践就是最佳适配。

kafka的consumer重平衡机制,注定了它不适合做长逻辑耗时业务的处理。(它的背景本身是无逻辑处理,只是传输日志)

 -----------------------------------------------------------------

20220419复现:

参数

config.Consumer.Group.Session.Timeout = time.Second * 120

config.Consumer.Group.Heartbeat.Interval = time.Second * 20

调整成
config.Consumer.Group.Session.Timeout = time.Second * 30  config.Consumer.Group.Heartbeat.Interval = time.Second * 5
就复现:
{"Level":"panic","Time":"2022-04-19T20:01:14.874530508+08:00","LoggerName":"","Message":
"Error from consumer: read tcp :33178-\u003e:9093: i/o timeout",
"Caller":{"Defined":true,"PC":8910019,"File":"/data/share//golang/cloudscan/pubsub/groupconsumer.go","Line":147,
"Function":"cloudscan/pubsub.(*GroupConsumer).StartConsume.func1"},"Stack":"cloudscan/pubsub.(*GroupConsumer).StartConsume.func1\n\t
/data/share//golang/cloudscan/pubsub/groupconsumer.go:147"


----------------------------------------------------------------

为了应对这种情况,我们调大了Sarama 的参数config.Consumer.Group.Session.Timeout = time.Second * 120,也就是心跳超时时间,但我们的网络超时时间很小,默认30秒,30秒我们的场景,文件扫描消费时间长,30秒是可能处理不完数据的。最终配置:

config
### 正确配置 `bitnami/zookeeper` 和 `bitnami/kafka` 的 Docker 容器 为了实现 ZooKeeper 和 Kafka 集群的正确配置,可以按照以下方式设置容器及其参数。 #### 1. **ZooKeeper 配置** 对于 `bitnami/zookeeper` 容器,需要定义每个节点的身份 (`ZOO_SERVER_ID`) 及其连接地址列表。以下是具体的环境变量和端口映射: - 环境变量: - `ZOO_SERVER_ID=1`: 表示第一个 ZooKeeper 节点的 ID[^1]。 - `ZOO_SERVERS=localhost:2888:3888;localhost:2889:3889;localhost:2890:3890`: 列出了所有 ZooKeeper 节点的地址和端口。 - 端口映射: - `-p 2181:2181`: 对应客户端通信端口。 - `-p 2888:2888`: 同步端口用于内部集群同步。 - `-p 3888:3888`: Leader选举端口。 ```yaml version: '3' services: zookeeper1: image: 'bitnami/zookeeper:latest' environment: - ALLOW_ANONYMOUS_LOGIN=yes - ZOO_SERVER_ID=1 - ZOO_SERVERS=zookeeper1:2888:3888;zookeeper2:2888:3888;zookeeper3:2888:3888 ports: - '2181:2181' - '2888:2888' - '3888:3888' ``` #### 2. **Kafka 配置** 针对 `bitnami/kafka` 容器,需指定 ZooKeeper 连接字符串及其他必要参数: - 环境变量: - `KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181`: 指定 ZooKeeper 集群的连接地址。 - `ALLOW_PLAINTEXT_LISTENER=yes`: 允许明文监听器(仅适用于测试环境)[^3]。 - 端口映射: - `-p 9092:9092`: 外部访问 Kafka 的默认端口。 ```yaml kafka1: image: 'bitnami/kafka:latest' depends_on: - zookeeper1 - zookeeper2 - zookeeper3 environment: - KAFKA_BROKER_ID=1 - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 - ALLOW_PLAINTEXT_LISTENER=yes ports: - '9092:9092' ``` #### 3. **Network Mode** 推荐为所有服务创建一个自定义网络以便于管理和服务发现: ```yaml networks: app-tier: driver: bridge ``` 并将该网络应用到所有服务中: ```yaml services: zookeeper1: networks: - app-tier kafka1: networks: - app-tier ``` #### 4. **集成 Kafka Manager** 要监控 Kafka 集群的状态,可以通过部署 `Yahoo/kafka-manager` 来完成。具体配置如下: - 环境变量: - `ZK_HOSTS=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181`: 指向 ZooKeeper 集群的地址[^4]。 ```yaml kafka-manager: image: 'yahoo/kafka-manager:latest' environment: - ZK_HOSTS=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 ports: - '9000:9000' networks: - app-tier ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值