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 more

Subversion 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 问题但是并不太顺利,所以就变成了一个废弃的接口。尽管如此,原来的设计依然很漂亮 …
read more

How to create an OS from scratch

查看原文

这个小仓库介绍了如何从头写一个 OS,很适合想通过 get hands dirty 的人深入学习 OS。

  • Mac 用户需要准备 qemu, nasm (brew install)
  • 可以通过 nasm 编译汇编代码
  • 可以通过 qemu 启动镜像
read more

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 more

Artifact 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 …
read more

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 …
read more

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 是哪层 …
read more

使用 audio 数据产生 true entropy

查看原文

本文介绍了一个脑洞,使用电脑的话筒录声音,可能附近空调或者键盘打字的背景噪音会被录进去,用算法规整化+shuffle后可以得到 true random data(不是伪随机数,是真的随机数)。让我们希望这个软件不要运行在敲木鱼的和尚旁边。

read more

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 等算法。
  • 比较向量的相关性,给出列表。
read more

Rocky River Pattern

查看原文

本文提出了一个编程范式:Rocky River。形同小河布满石头,软件也有上游下游,数据流经中间各个模块。

Rocky River 要求:

  • 模块要小,容易被整合成一个大程序。
  • 程序变大后可以搞成二级的,三级的结构。
  • 使用分层架构,只有上层可以调用下层,不能有循环依赖。
read more

« Page 5 / 54 »