谈谈项目的配置管理

众所周知,配置在项目开发中非常重要,一般来说,我们都会根据环境会有不同的配置,比如本地开发会配置本地机器的数据库,测试时还会给数据库设置不同的本地数据库,然后线上线下也会有不同的配置,其中非常值得注意的便是:生产环境的配置,因为这些配置非常敏感,需要加密。 把配置直接放进代码管理 repo 是最低级的做法:历史记录会有永远记录着配置中的敏感信息,看过不少初学...

阅读全文

CI 系统搭建

不知道,你有没有遇到类似的情况: 不重视测试,开发新功能都是手工测试 每次开发新功能,都会懒得去做回归测试,线上经常出问题 新同事来,不熟悉系统,提交的代码会把系统搞坏 测试覆盖率一直非常低 这时候,你需要个 CI,也就是持续集成。 我理想中的团队开发流程中,CI 是最重要的一环,团队成员按照 git flow 开发,然后提交,等待 CI 测试通过,最后...

阅读全文

管理道路

很多同行都会想,当自己做到一定程度了,应该会去做技术专家,或者管理岗位。 只是,现在的很多同行是这样的,我很喜欢钻研技术,并且,我还想往管理岗位上发展,但是遇到一些团队管理的时候,往往不想去处理。 原因?很简单,因为搞定团队内部的琐事,把团队带的井井有条,远远比不上自己去钻研新技术,提高团队的生产力带来的快乐要多。所以,这样的人,不太适合往管理岗位发展。而管...

阅读全文

关于生产环境日志收集

日志收集的重要性不言而喻,总结下在日志方面做的一些尝试: 日志收集的选型目前 nodejs 比较流行的工具有 winston,log4js,还有 bunyan,也是我用过比较多的,总体看来的话,winston 功能丰富,log4js 老牌有保障,bunyan 比较轻量级,我最后选择了 bunyan 是因为看中它的轻量级,怎么说呢,winston 太复杂了以至...

阅读全文

运维大招之重启

没有什么运维问题是一起重启解决不了的,如果有,那就两次。 — 🙈 今天又栽在 mongodb 索引上了,哥们又在我不知情的情况下,加入了新建索引的代码,也怪我,没有 review。两亿多数据啊。。。。天。。。。 于是我们的平均响应时长就跟过山车似的,一波未平,一波又起,甚至一度达到了我入职以来的最高值,6kms。 没办法,先重启,回滚了刚上线的代...

阅读全文

谈重构

最近总能发现,很多东西,我在实践中总结出的的经验,都是别人在书中提到过的,就比如《重构》这本书,我一直认为重构不应该拿出专门的时间,而是应该在开发新功能或者修改 bug 的时候去做,作者也非常强调这种观点: 不用专门时间,随时随地,比如以下三种情况:添加功能时修补错误时复审代码时 比如在一个人员缺少的阶段,如果你跟产品汪或者 CEO 说,我需要几个星期甚...

阅读全文

关于 Redis 缓存

今天尝试了用 redis 的 set 作为缓存用途,恩,好疼。。。 是这样的,看到项目中用到应用缓存的地方很少,为了减轻 MySQL 数据库的压力,特地引入 redis 作为已购买物品的缓存,但是物品不能重复购买,因此这个缓存还得支持重复性检查。 于是很自然想到 redis 里面的 hash 或者 set,然后,有个问题就是,当 hash 或者 set 没有...

阅读全文

MySQL 分库分表实践

这些日子为了解决业务上的挑战,想要解决 MySQL 的性能提升方案。 目前找了主要有: 分库分表 读写分离 读写分离最简单,牺牲一点一致性能减少读的压力,分表也比较简单,但是目前没有特别合适的中间件,结合我们的业务场景,分库是目前最适合下点功夫的。(另外还需要做高可用,可以做双主,但是不需要我过多参与,因此这里不谈。) 背景介绍 MongoDB 用来存储...

阅读全文

npm 的生态系统

nodejs 这些年来的发展迅猛,一个重要的条件就是 npm,npm 这个包管理工具很强大,如果没有这个工具,很难想象没有 npm 的 nodejs 会发展到什么程度,golang 或许可以是个参照:发展到现在,一直没有一个统一并且非常规范的包管理工具。 我一直想很相信,任何东西的发展,离不开好的基础,无论是个人或是国家: 个人,需要多学习,多锻炼,提升自己...

阅读全文

关于 API 文档

先从一次面试经历说起,记得有次面试,我问被面试者一个 API 文档的问题: 『用 gitbook。』 我呆了一下『那如果你们修改了 API 接口,怎么修改文档呢?』『我们文档也用 git 管理,直接修改提交。』『那你们有没有某次代码修改之后,忘记修改文档了?』『……』 我想在实际开发中,这样的做法很容易顾此失彼,忘记更新代码,造成了文档与代码不一致的情况...

阅读全文

记一次 mongodb 索引紧急事件

今天正在家里加班的时候(哎。。。不多说。。。),突然接到电话,mongo 出问题了,同事把某个 collection 的索引给删了,新代码上线之后,mongo 不断在重建索引,经过立马回滚代码之后,还是继续在重建索引,用 db.currentOp 来看,索引一到 99% 就重建,也就是重新开始建立索引。 在 APM 上面看到响应时间慢了 5 倍左右,一直不断...

阅读全文

杨绛先生

今天在朋友圈刷屏了,不想跟风,干脆在这里写点东西,权当念想。 第一次听说杨绛先生,是在高中,有篇语文中学到的,关于她跟钱钟书先生的故事,记不清了,那时候很奇怪,为啥女的也可以叫先生,后来才知晓,先生是一种很少的女士能有的尊称。 她的那句 『你的问题就在于读书太少而想的太多』,足够受用终生,很多人,尤其是我自己,在几年短短的职业生涯中,感受到,很多问题,不能干...

阅读全文

轻量级消息队列 Kue 的一些使用总结

最早接触 kue 是在 0.7 之前的版本,功能很少,很弱,但还是很好用的,那时候找过一些其他的消息队列,如 rabbitmq,kafka 之类的,但是都觉得太重了,跟 nodejs 的融合还是不太合适。 找着找着,就找到了 tj 大神搞的 kue,基于 redis 的 subpub 做的优先级消息队列,适合做一些离线任务,比如统计运算、发邮件消息以及异步业...

阅读全文

数据库分页最佳实践

2016-06-22 更新:MongoID 不能保证连续增长,因此,在这种情况下,不适合此种方案,如果是为了保证速度以及效率的话,可以放缓存,比如 redis 以及 memcached 之类的。 正文说起分页,最容易想起的就是 offset+limit,在 mongodb 里面可以用 skip+limit 实现,应该说这是最容易实现的功能,与前端的交互来说非...

阅读全文

Node.js APP dockerize

今天把做的项目直接做了 docker 化,一个是前端纯静态化的,另一个是后端 Node.js App,对于这两个项目,想用最简单的方式来使用 docker 静态项目最容易,直接用 nginx,将编译好的静态文件直接丢到 volums 里面即可: 123456789version: '2'services: nginx: image...

阅读全文