simplicity is prerequisite for reliability

前几天我在开发一个小型的 Java Web App,用 Undertow 做 HTTP 服务器,Jersey 做 RESTful 路由,在 IDE 中开发那是一个顺风顺水,但是到最后打包的时候遇到了一些奇怪的问题,最后也不走寻常路解决了。

Fat Jar 这种 Java 应用分发方式,近几年随着 DevOps 的潮流渐渐在 Java Web 生态里变得流行起来,SpringBoot 和 Dropwizard 等快速开发框架居功至伟。

Read More...

这大约是一年之前的故事了。那时我图样图森破,由于各种各样的原因,用 Vert.x 框架写了一个充斥着反模式的消息队列。那时的我刚来到阿里云,唯一擅长的架构就是无状态的系统,数据全扔数据库里,数据库前面挡一层缓存,应用服务器完全对等水平扩缩容那种。Vert.x 也是我第一次用,完全异步的开发模式把我折腾坏了,即使用了 RxJava 成功规避了回调地狱,但也深深感受到用异步框架开发复杂业务基本是痴心妄想。

Read More...

做分布式系统的人都知道大名鼎鼎的 CAP 定理,这个定理仿佛一个巨大的枷锁,套在了每一个分布式系统的开发者身上。前些日子我实现了一个 AP 的分布式系统,也就是说发生网络分区(P)的时候,系统会自动分裂成两部分各自独立工作,而不是像 ZooKeeper 或者 etcd 这种 CP 系统在网络分区之后少数派降级不工作。

为了验证系统在网络分区时的行为是否符合预期,我需要做个故障模拟,在本地搭建一个 Linux 集群,然后用 iptables 丢弃指定来源的包人工制造出网络分区的效果。

Read More...

很长一段时间里,我一直以为,对于同一个时间格式,我们把一个时间对象序列化成字符串之后,还能反序列化成和原对象表达同一个时间的时间对象,至少在不考虑时区之类的问题时,这个命题应该成立。

$$ \forall F \in DateFormat, F(D)=S \rightarrow F^{-1}(S)=D $$

然而就在这两天,我遇到了一个打破上述认知的奇怪问题,Date 对象格式化之后再解析回来,就完全乱套了。

Read More...

前些日子,我还在西溪园区上班的时候,如果不是忙得不可开交,我都会在午饭的时候尽可能选择一个离所在办公楼远一些的食堂吃饭。因为午餐和晚餐是一天的工作中难得的两个「放风」时间,如果碰到了有趣的话题还能在路上和同事交流一二。

有一次,同事问了我一个问题:「为什么 Spring Boot 应用倾向于打 fat jar 直接启动,而集团的应用倾向于打 war 包从应用容器启动?」当时我从 IT 主流思潮的角度给了一个解释,大意为 Spring Boot 是 DevOps 时代的产物,集团大多数应用是 Dev 和 Ops 分离时代的产物。

Read More...

周日深夜,我把代码分享到了 Github,用的 MIT 协议,详见 JamesPan/pdf-smart-crop。原本还想着把注释文档和单元测试写了再分享代码的,后来实在是懒了。所以说啊,这些东西如果开发的时候不好好写,以后就更没有动力去写了。

前作「Smart Crop,一种切除 PDF 扫描文档白边的新选择(算法篇)」分享了 Smart Crop 的算法设计、基本用法和脑洞,这里分享一下实现过程中遇到的问题和妥协。

Read More...

这是我元旦假期的折腾成果。这里先分享一下思路和实现过程中遇到的有意思的事情,代码稍后整理后分享到 Github

前些日子,同事送了我一个 Kindle,于是我开心地往里面灌了好几本书,开始假装文化人。

Read More...

一年一度的「双 11」又要到了,阿里的码农们进入了一年中最辛苦的时光。各种容量评估、压测、扩容让我们忙得不可开交。洛阳亲友如相问,就说我搞双十一。

如何让系统在汹涌澎湃的流量面前谈笑风生?我们的策略是不要让系统超负荷工作。如果现有的系统扛不住业务目标怎么办?加机器!机器不够怎么办?业务降级,系统限流!

正所谓「他强任他强,清风拂山岗;他横任他横,明月照大江」,降级和限流是大促保障中必不可少的神兵利器,丢卒保车,以暂停边缘业务为代价保障核心业务的资源,以系统不被突发流量压挂为第一要务。

Read More...

作为开发者,应用的性能始终是我们最感兴趣的话题之一。然而,不是所有的开发者都对自己维护的应用的性能有所了解,更别说快速定位性能瓶颈并实施解决方案了。

今年北京 Velocity 的赞助商大多从事 APM 领域,提供性能剖析、可视化甚至优化的解决方案。这些厂商的产品看起来能够很好地帮助中小企业的开发者解决应用性能上的缺陷,但是这些产品几乎都有着一个致命的缺陷:极强的侵入性。

Read More...

这两天有几个同事在部署新应用的时候遇到了阻碍,师兄让我去帮忙看看。

一开始我以为是新应用的工程结构不符合集团的部署规范。一番折腾无果之后我给重新搭建了一套,然后把代码迁移过去。然而并没有什么用处。

因为一开始想错了方向,我们折腾了一天才确认是内存不足,只好联系管理开发环境的同事分配更大内存的机器,然后应用终于部署起来了。

Read More...