微服务架构下 服务发现 的设计与权衡
微服务架构下 服务发现 的设计与权衡 之前给一个老项目做单体拆微服务,一开始真没把“服务发现”当回事。不就是服务启动以后去注册中心登记一下,调用方查一下地址,然后发 HTTP / RPC 吗?结果线上第一次灰度就给了我一巴掌:某个服务刚启动,JVM 还没预热,依赖的缓存连接池也没建立,注册中心那边已经显示实例健康了,网关啪就把流量打过去,成功率一度难看得要命。 后来慢慢才明白,服务发现这件事,难点...
阅读更多微服务架构下 服务发现 的设计与权衡 之前给一个老项目做单体拆微服务,一开始真没把“服务发现”当回事。不就是服务启动以后去注册中心登记一下,调用方查一下地址,然后发 HTTP / RPC 吗?结果线上第一次灰度就给了我一巴掌:某个服务刚启动,JVM 还没预热,依赖的缓存连接池也没建立,注册中心那边已经显示实例健康了,网关啪就把流量打过去,成功率一度难看得要命。 后来慢慢才明白,服务发现这件事,难点...
阅读更多从零实现一个简易的限流 先吐槽一下为什么又要自己写 前几天线上服务被一个不知道哪里来的脚本疯狂刷接口,一开始想着简单点,直接 Nginx 上 limitreq 就完事了。结果配置一贴上去,发现它对单 IP 突发流量的控制还是有点粗暴,而且我们业务里真正想限的其实是 userid,不是 IP。IP 这东西吧,前面套了 CDN、代理、网关之后,很容易一锅端,误伤自己人。 那就只能自己搞个简易的限流了。...
阅读更多机器学习入门:蓝绿部署 数据预处理 最近想把一个 notebook 里的小分类模型搬到线上,结果本地验证集 AUC 都挺正常,服务一跑起来,准确率直接掉到个位数。第一眼还以为是模型文件有问题,后来抓了几条线上请求,发现是数据预处理这玩意儿根本没法和训练时保持一致。再后来服务越来越多,改一版预处理就得停一次服务,所以顺手把蓝绿部署也加上了。下面是我踩完坑之后比较顺的一套做法,可能不算标准答案,但至少...
阅读更多正则表达式进阶:优雅停机 匹配技巧 最近在给一个 Python 服务补优雅停机逻辑,发现 SIGTERM 收进来以后,旧 worker 还在处理任务,日志里一堆 state=RUNNING,关起来特别不干净。先想用 if "RUNNING" in line 凑合一下,结果误杀了几条历史日志,然后就开始用正则匹配任务状态,发现这玩意儿是真的难搞啊,随便一个 task.RUNNING 就能匹配一大片,...
阅读更多深入理解 Linux 分库分表 的工作机制 最近在 Linux 服务器上折腾订单表,单表快 8000 万行,查询开始变得有点肉,就顺着“分库分表”去查资料。查完之后发现一个挺尴尬的事实:Linux 本身根本不知道什么是库、什么是表。它只认识进程、文件描述符、TCP 连接、磁盘块、CPU 调度和网络栈。所谓 Linux 分库分表,其实是你在 Linux 上跑 MySQL、跑 Proxy、写应用代码,...
阅读更多服务发现 的十种打开方式:工程实践笔记 上周线上调用 502,排查到最后发现实例早就被缩掉了,调用方本地缓存还拿着旧地址往死胡同里打。看了一眼我们那个所谓的“服务注册中心”,其实就是一张 Redis 表,心跳超时之后也没有真正踢掉死实例。这玩意儿是真的坑,一开始都觉得有注册中心就万事大吉,结果网络分区、容器重启、发布缩容、健康检查误判,全都能把它打回原形。 下面这些是我实际用过、或者在故障里被迫读...
阅读更多一次线上 蓝绿部署 故障的复盘记录 故障现场:明明健康检查全绿,切流量后订单直接开始翻车 那天是周三下午,线上订单服务 v2.3.7 要发 v2.3.8。我们用的是 ingress-nginx + K8s Service 切 selector 的蓝绿方式,蓝组叫 order-service-blue,绿组叫 order-service-green。部署文档写得很漂亮:先起 green,等 /act...
阅读更多一次线上 熔断 故障的复盘记录 先说结论 这次线上 熔断 故障,表面看是“下游价格服务慢”,实际看更像是“我们把保护开关当保险丝用了,结果保险丝自己把自己熔断器焊死了”。 真正出问题的是一个遗留配置: 这个 forceOpen: true 是上周压测前为了让所有请求直接走 fallback 配的,本来想测“价格服务完全不可用时前端怎么展示”。结果压测结束,配置中心里这个值忘了改回来。上线后正常流量...
阅读更多深入理解 Linux 连接池 的工作机制 先说句实话,Linux 里没有“连接池”这个内核组件 很多人搜 Linux 连接池,脑子里可能觉得内核偷偷帮你缓存了一堆 TCP 连接,随用随取,贼方便。结果真去翻 man 7 tcp,翻半天没看到这个概念,挺容易怀疑人生的。 其实通常说的“连接池”,是应用层/中间件在用户态维护的一组已经建立好的 socket。比如数据库驱动、Redis 客户端、HTTP...
阅读更多Kubernetes 缓存一致性 配置避坑指南 一开始我还以为是 Redis 的问题 上周把一个配置服务从单副本扩到三副本,接口一上线就发现一个很玄学的问题:同一个配置项,一会儿返回新值,一会儿又返回旧值。 我第一反应是 Redis 没更新,于是去翻 Redis 日志、连接池、过期策略,甚至怀疑是不是网络抖动导致部分 Pod 连到了别的实例。结果忙了一轮,发现 Redis 里其实一直是正确的。 后...
阅读更多