Go 语言 分库分表 实战:从原理到落地
Go 语言 分库分表 实战:从原理到落地 最近公司那个用户订单表,单表已经干到 8000 多万行了,查询慢得像便秘。DBA 说"兄弟你得分库分表了",我说行吧。然后就开始调研,发现 Go 生态里面像样的分库分表库真没几个,要么就是 Java 那边 MyCat、ShardingSphere 那套东西翻译过来的阉割版,要么就是自己从零撸。为什么不能有个开箱即用的东西呢...可能是 Go 社区都觉得这事...
阅读更多Go 语言 分库分表 实战:从原理到落地 最近公司那个用户订单表,单表已经干到 8000 多万行了,查询慢得像便秘。DBA 说"兄弟你得分库分表了",我说行吧。然后就开始调研,发现 Go 生态里面像样的分库分表库真没几个,要么就是 Java 那边 MyCat、ShardingSphere 那套东西翻译过来的阉割版,要么就是自己从零撸。为什么不能有个开箱即用的东西呢...可能是 Go 社区都觉得这事...
阅读更多正则表达式进阶:分布式锁 匹配技巧 最近线上有个 Redis 分布式锁老是误释放,想先把日志里的 lockacquire、lockrelease、lockfailed 这些事件抓出来,顺便把 key、owner、ttl 和 reentrant 提取出来做告警。结果一上手就发现日志格式从 0.16 开始多了一个 namespace 前缀,原来那条 lock. 的破正则全废了。然后就开始翻文档和旧脚本...
阅读更多用 Docker 搭建蓝绿部署的完整流程 先把蓝绿部署说成人话 之前我一直觉得“蓝绿部署”听起来挺玄学,好像非得有 Kubernetes、服务网格、流量染色那一大套东西才能搞。结果真动手以后发现,在 Docker 这种单机或者小规模部署里,它其实就是两个版本的应用容器同时活着,一个接流量,一个空跑或者准备接流量。等新版稳定了,再把 Nginx 这类反向代理的 upstream 一换,流量就过去了。...
阅读更多Nginx 反向代理 分布式锁 配置详解 之前项目上遇到一个挺头疼的事儿,Nginx 反向代理后面挂了三个 Spring Boot 实例,处理用户下单的时候偶发超卖。一开始我寻思这不是应用层该管的事儿吗,锁加在代码里不就完了。结果线上跑了一周,还是有漏网的,查了半天发现是用户同一笔请求因为网关重试打到了两个不同后端实例上,各实例的本地锁压根不互通。 行吧,那就老老实实上分布式锁。但问题是我不想每个...
阅读更多Git 工作流中的 灰度发布 最佳实践 我一开始以为灰度发布就是部署平台里点一下“10% 流量”,跟 Git 工作流没啥关系。结果后来发现真不是这么回事,代码要是从 Git 阶段就没把“哪些能发、哪些先别动、出问题怎么关”说清楚,灰度就容易变成线上抽奖。尤其是几个功能同时上,A 功能 5% 开着没事,B 功能合并后一跑,A 也跟着崩了,最后只能半夜回滚。 下面这套是我实际用下来比较顺的做法,不一定...
阅读更多日志采集 的十种打开方式:工程实践笔记 1. stdout 重定向:最简单也最容易翻车 我一开始以为日志采集嘛,最朴素:程序往 stdout/stderr 打,然后重定向到文件。 结果生产上跑了两天,磁盘就报警了。问题出在文件描述符一直指着同一个 inode,logrotate 如果配置得不好,要么旧日志删不掉,要么进程还往已经 rotate 掉的文件里写。这个方式适合本地调试、临时验证,真到长期...
阅读更多用 Docker 搭建限流的完整流程 最近被限流坑了一下 最近有个小接口想加限流,一开始以为就是“同一时间别让人随便刷”这种五分钟需求,真动手才发现,限流这东西特别容易从一个 demo 变成一堆配置:Redis 要不要持久化、容器网络怎么打通、用户身份怎么取、超时怎么处理、网关和应用到底谁负责。 后来发现用 Docker 其实更省事,需要借助 docker,不然你就慢慢配置环境吧。下面这套是我实测...
阅读更多WebSocket 实时通信与 消息队列 应用 前几天给一个小项目加实时通知,最开始想得很简单,前端连 WebSocket,后端有消息直接 websocket.sendjson(...) 就完事。结果本地跑得好好的,一放到两台实例上就露馅了:用户连在 A 实例,消息从 B 实例生成,A 根本不知道有消息来了。然后我去翻了一下官方文档,发现很多示例都默认你是单进程,针对多实例 WebSocket 广...
阅读更多任务调度 的十种打开方式:工程实践笔记 1. crontab:最土,也最容易背锅 之前一个清理过期临时文件的小需求,我第一反应就是 cron,因为太简单了。结果上线后发现它压根没跑,查了半天,脚本里用了相对路径,cron 默认环境变量也不全。后来老老实实写成这样: 这种写法不算优雅,但很能活。cd /srv/app 是为了让脚本里的相对路径别再发疯,>> ... 2>&1 是为了下次出问题还能从日...
阅读更多数据脱敏 的十种打开方式:工程实践笔记 最近给一个数据导出工具改需求,原本只是把 MySQL 导 CSV 给运营看,后来安全来了一句“手机号身份证不能明文”,测试又说“日志里别打出 token”,产品再说“字段长度、格式不能变,不然我 Excel 一列全废”。结果改到最后,我发现数据脱敏根本不是写个 replace("") 就能交差。 下面是十种我在工程里实际碰到或者用过的打开方式。有些做法很糙,...
阅读更多