How to manage connections efficiently in any database
本文讨论了如何高效管理数据库连接。下图是 Postgres 的 forking 进程模型,瓶颈在共享内存那块。
优化方法:
- connection pools: 在每个节点都保存一个内存池,workers 从内存池拿连接,而内存池只需要向 master 维持一个连接。缺点是一旦遇上使用 unicorn/puma 这类 forking servers,程序就不是单进程了,内存池就没那么有效。
- minimum viable checkouts: workers 只在必要的时候占用连接池,像 decoding,validating, rate limiting 这些事情就别占用连接时间了。
- PgBouncer & inter-node pooling: 如果连接还是太多了,可以考虑在数据库前面再放一层 proxy,让 proxy 处理这些连接,给后端数据库减负担。
结论:连接即是资源(connection as …
read moreSubversion Delta Editor - Beautiful Code Chapter 2
本文论述的核心是讨论 svn delta editor 接口的美。
背景:通过两文件的仓库 /A/fish/tuna/FILE, /B/ 的图表描述版本控制,树的变型。 过渡:tree diff 该如何表达呢?开始讨论挑战在哪里。 正篇:概念介绍,贴出源码,就上面的例子给出源码实际执行的序列,带来的好处。 结论:好处的综述:简化开发,快速适配新功能。
svn_delta_editor_t
这个 struct 中定义了关于表达 tree diff 的核心操作接口,主要在于把树的深度优先遍历和apply_textdelta
分拆出来。- 有趣的是,文中提到了一个废弃的老接口,它视图解决 X 问题,后来的开发者们尝试用它来解决 Y 问题但是并不太顺利,所以就变成了一个废弃的接口。尽管如此,原来的设计依然很漂亮 …
Kubernetes for small projects
本文是 这篇文章 的驳文,前文认为 k8s 适合小项目,本文作者则认为不合适。软件工程很讲究 trade-off 的艺术.
- rsync 到服务器怎么了,不好吗,它能用啊。
- 软件依赖很多怎么了,ansible playbook 运行的很好啊
- systemd 怎么了,蛮好用的呀。
- nginx virtual host 设计也不难啊,比起 k8s daemon set。
- zero-downtime 其实是个伪需求吧,至少对于很多项目来说。
- 回滚?部署一遍老版本就好了啦。
- 那些 redis 七七八八的服务怎么配?就用上游 distro 的安装包外加配置文件,在适当的时间点可以挪进 ansible。
作者认为一个月付 5 刀的小项目,去考虑 infra 为时尚早了(除非你更想鼓捣那些东西另说 …
read moreArtifact Introduction
Artifact 是一个设计的文档工具,虽然适用于设计,但是也可以窥见很多软件工程的思路。
- 设计是结果导向的,一般先设计出样子,再慢慢推进。
- 领域模型是一种叫做
artifacts
的对象,有 name,text,可以连接到其他 artifacts 和源代码。 - 有三种 artifacts: REQ(需求),SPC(规约), TST(测试)。例如,下面的示例文档:
# REQ-name
partof:
- REQ-other
- REQ-foo
done: This artifact is "defined as done".
###
The description of the artifact goes here.
You can …
Goroutines vs Java Threads
本文谈论了为何在一台机器上可以有百万个 Goroutines 而只能有千量级的 Threads.
- Threads 的运行需要两个东西:指令 pc 用来表示运行到了代码的哪里,以及 stack 用来维护局部变量和到堆上的指针变量。所有 Threasd 共享一个 Heap。
- 几乎所有的 JVM 实现都依赖 OS threads 来实现语言的 Thread。所以操作系统能搞出的上限,Java 只会少不会多。
- 假设 JVM per thread 能用 1MB stack,那 1GB 内存只能产生 1k Threads。
- Go 使用 Dynamically Sized Stacks。每个 stack 只消耗 4kb,所以 1GB …
k8s 配置最佳实践
本文是 kubernetes Configuration Best Practices。
- 总之指定最近的 stable api version
- 用 yaml
- 把相关的对象放到单一的一个文件。
- 没事不需要指定默认值,越多代码越容易引发错误。
- 把描述放进 annotations 方便后面追查。
- 不用 Naked Pods,尽可能用 ReplicaSet 或者 Deployment。
- 创建 service 最早在 deployments/replicaset 之前操作。
- 用 dns name of service 替代环境变量。
- debug 的时候用 kubectl port-forward 或者 apiserver proxy
- 用好标签,例如 app 是什么,tier 是哪层 …
GitHub - Natural Language Semantic Code Search
本文介绍了 GitHub 工程团队的一个脑洞 - 使用自然语言搜索代码:https://experiments.github.com/semantic-code-search
目前它还只能搜索一些简单的 Python 相关的函数和方法。底层原理是
- 搜索的词经过 Text Encoder 算出一个向量, 基于 fast.ai 库封装。
- 仓库里的代码经过 Code Encoder 也算出一个向量, 使用了 sequence-to-sequence model / tree-based LSTMs / gated-graph networks 等算法。
- 比较向量的相关性,给出列表。