问题现象

ETCD作为我们管理面(基于Java)的异步任务同步媒介,在管理面压力测试时,发现任务状态不更新了。

问题定位流程

而业务线程日志正常(INFO级别),数据库没有死锁,并且top -c命令和sar命令等查看CPU,内存,硬盘IO都正常。
于是,利用jstack定时十秒打印线程方法调用栈,打印六次。
发现定时线程方法栈很奇怪:

发现这个线程池里面的所有线程都处于WAITING状态,并且调用栈一直在加深,和死循环似的,在EtcdResponsePromise.get()这个方法纠结(看上去是个异步get请求)。
将日志级别设为Debug级别,复现场景。

从日志中看出,这个通过 HTTP PUT到ETCD的请求一直失败,并且一直重试,查阅资料得知,我去,ETCD4J的默认配置是无限重试(参考资料: https://github.com/jurmous/etcd4j/issues/31)
那么,为何会PUT失败呢?

PUT会失败,推测三个原因:

  1. ETCD挂了
  2. 这个路径在PUT过程中被删掉了
  3. ETCD4J请求限制(ETCD4J基于Netty,Netty的Client默认有超时时间和请求大小限制),包括超时时间限制和大小限制

排除了1,2,我推测原因是3

查看ETCD4J官网:
https://github.com/jurmous/etcd4j#custom-parameters-on-etcdnettyclient

的确有限制(默认100K),再看我们的路径目前存储的数据大小推测我们的请求大小,嗯,的确快大于了100K

解决方案

  1. 调整ETCD4J配置,参考业界配置和我们的应用场景,配置超时时间为1S,大小为1MB,参考:https://coreos.com/etcd/docs/latest/dev-guide/limit.html
  2. 调整重试次数,不能无限重试,无限重试的结果就是一个错误导致线程池任务队列满了无法响应处理其他正常的状态业务,雪崩。而且这个重试最好不要立刻重试n次,而是以幂函数的时间间隔重试(1S后重试一次,2S后重试一次,4S后重试一次。。。),减轻组件错误带来的某一个压力尖峰时刻

一次关于ETCD客户端(ETCD4J)问题的定位相关推荐

  1. etcd 笔记(03)— etcd 客户端使用(键值的增、删、改、查)、watch监测键、lease使用(创建租约、撤销租约、刷新租期、查询租期)

    1. etcd 客户端 etcdctl 是一个命令行客户端,便于我们进行服务测试或手动修改数据库内容,etcdctl 在两个不同的 etcd 版本(v2 和 v3)下的功能和使用方式也完全不同. 一般 ...

  2. Go 学习笔记(58)— Go 第三方库之 etcd/clientv3(连接客户端、PUT、GET、Lease、Op、Txn、Watch 基础概念说明)

    1. 安装 Golang 的 Etcd 包 我们使用 v3 版本的 etcd client , 首先通过 go get 下载并编译安装 etcd clinet v3. go get -v github ...

  3. java etcd api_在java中如何使用etcd的v2 和v3 api获取配置,并且对配置的变化进行监控和监听...

    etcd 和zookeeper 很像,都可以用来做配置管理.并且etcd可以在目前流行的Kubernetes中使用. 但是etcd 提供了v2版本合v3的版本的两种api.我们现在分别来介绍一下这两个 ...

  4. go 调用etcd实现分布式锁

    package workerimport ("context""fmt""go.etcd.io/etcd/clientv3""ti ...

  5. etcd代理组件的开发思想

    最近在一个项目中,需要使用到etcd集群来实现服务发现的功能,目的是统一管理相应的服务资源,同时也可对资源做一定的负载均衡策略.然而,项目中使用的技术栈是C++语言,github上没有合适的C++开源 ...

  6. 课时 16 深入理解 etcd:基于原理解析(曾凡松)

    本文将主要分享以下三方面的内容: 第一部分,会为大家介绍 etcd 项目发展的整个历程,从诞生至今 etcd 经历的那些重要的时刻: 第二部分,会为大家介绍 etcd 的技术架构以及其内部的实现机制, ...

  7. go使用grpc实现异步_(python、go)基于ETCD的gRPC分布式服务器实现详解

    作者:Zarten知乎专栏:框架工具篇详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 1-概述 gRPC框架是一个 ...

  8. kubernetes (k8s)的二进制部署单节点(etcd和flannel网络)

    文章目录 1 常见的k8s部署方式 2 环境准备 2.1 拓扑 2.2 所有主机关闭防火墙,selinux,swap 2.3 所有主机配置主机名,并再maser上做主机映射 2.4 所有主机将桥接的I ...

  9. 蚂蚁集团万级规模 k8s 集群 etcd 高可用建设之路

    蚂蚁集团运维着可能是全球最大的 k8s 集群:k8s 官方以 5k node 作为 k8s 规模化的顶峰,而蚂蚁集团事实上运维着规模达到 10k node 规模的 k8s 集群.一个形象的比喻就是,如 ...

最新文章

  1. 04-JDBC学习手册:JDBC中使用transaction(事务)编程和Javabean定义
  2. 【springboot】静态资源设置缓存时间
  3. Java黑皮书课后题第5章:*5.48(处理字符串)编写一个程序,提示用户输入一个字符串,显示奇数位置的字符
  4. arm学习笔记五(c/c++与arm汇编混合编程)
  5. IPM: 使用代码删除Acquisition contract上的IP Product
  6. mysql生成app接口_Java实现app接口和Socket消息传递(10)java连接MySQL实现App登录接口...
  7. H5 使用微信开放标签跳转小程序
  8. Magento 获取有效属性 Display available options for attributes of Configurable
  9. 魔力转圈圈(快速幂)
  10. HTML5 CSS3编程入门经典 ((美)Rob Larsen) pdf扫描版
  11. http请求头获取 -python
  12. 采用什么样的辅助工具能够有效地帮助孩子提高英语及数学的成绩?
  13. openpythonxl_常用模块之openpyxl (python3入门)
  14. Spring Boot中Bean管理
  15. 软件测试常见面试题目(1)pareto法则,帕累托法则,28杀虫剂怪事,木桶原理,Good-enough原则群集效应,测试与调试的区别,QA以及职责,测试工程师和软件质量保证的,测试提交的缺陷开发人员
  16. 小米 Redmi 安装GooglePlay服务
  17. 美狐美颜SDK动态贴纸代码浅析
  18. 3DM:phase wrapping
  19. js 遍历数组及对象属性
  20. 网站403错误解决方案

热门文章

  1. 微信全功能HOOK接口源码
  2. MySql实现联合查询
  3. 一文详解编程中的随机数
  4. 如何在Mac的word里插入svg图像
  5. 第零章 线性代数的学习准备
  6. 【算法笔记】二叉树遍历模板递归+非递归
  7. cad批量打印_CAD如何批量打印
  8. Unity Shaders and Effects Cookbook (4-5)Cubemap与菲涅尔反射
  9. promise 格式
  10. 深扒互联网大佬高考往事,状元辈出,马云数学1分被DISS