Elm Architecture
Elm 的架构源自开发团队早期对他们各自项目研究找到的一个共有 pattern:定义 Model,编写 Update,编写 View - 基本上他们的任何需求都可以用这套写法来写。这套 Pattern 影响了诸如 Redux 之类的框架,它的思路可以用如下代码说明:
import Html exposing (..)
-- MODEL
type alias Model = { ... }
-- UPDATE
type Msg = Reset | ...
update : Msg -> Model -> Model
update msg model =
case msg of
Reset -> ...
...
-- VIEW
view : Model -> Html Msg
view model =
...
分布式系统的健康检查
本文对分布式系统的健康检查列出了很多个观点。有人认为 ping/cpu_load/error_rates 这些都不够,要发出真正的端对端测试才行;有人则认为健康检查要简单才行,ping 就很好。本文作者认为:
- 健康检查是一条光谱,不是非黑即白。
- 健康检查通过 = 服务也许没问题, 看你怎么做的检查。
- 健康检查没通过 = 有些地方可能出了问题。
- Ping 能够检查出 up/down, e2e 能够检查出系统能否执行某些特定的功能。
- 在分布式系统中, 就算 ping 没挂,也有可能因为别的原因没能执行一些计算,那跟服务挂了也没差了。
- 服务彻底挂了很好判出来,但是服务到底有多健康这个见仁见智。
- 健康检查是手段,我们要关注 quality-of-service, 即任务多久能执行完,以及能否执行出正确的结果。
- 完全健康的服务根本就不存在,我们要承认的事实是:服务有个健康度,有可能这部分好的那部分是坏的。
- Orchestration 层可以只关心服务 up/down, 但是 Load Balancing 层需要更细的粒度并相应触发 …
Docopt - CLI description language
Docopt 是一款用来编写命令行工具的库,与其写一堆 parse("--option")
代码,不如直接写出漂漂亮亮的文档来,然后根据这个文档来自动生成解析命令行参数的代码。这个库可以让你用写代码文档的方式定义接口,可读性提高了很多。
"""Naval Fate.
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate.py (-h | --help)
naval_fate.py --version …
Green Threads 100L 代码实现
Green Thread 是在语言运行时调度,而非由操作系统调度的线程。这意味着,有如下优缺点:
- 优点
- 几乎不能更快的新建 gthread 速度,比起 thread, process
- gthread 切换开销特别小,可能就只有几个字节
- 内存花的更小
- 缺点
- 你只能写异步代码
- 差不多只能运行在单核上,即便你有多处理器(有办法突破)
- 你只能写异步代码, again. 调试代码挺麻烦
GThread 一般要求你显示提供 yield 方法做上下文切换,调用 gthread 方法也必须套在一个 context 下面
关于简介,查看 https://c9x.me/articles/gthreads/intro.html
从代码上看,这份实现比较简单,能算是比较好的概念实现,离实用有不少距离。核心数据结构:gt …
Trello 从 RabbitMQ 转投 Kafka
本文是 Trello 的工程博客,讲述为什么他们停止使用用了三年的 RabbitMQ, 而改用 Kafka。
Trello 线上使用 15 个 RabbitMQ 示例承接 WebSockets 的推送更新。后端服务把数据推到 RabbitMQ,然后 WebSockets 的服务端应用处理连接,从队列中拉数据下来,给出响应推给浏览器端。
后端服务推数据时,通过一个 3 实例的 rabbitmq-inbound cluster 把数据 shard 到 16 个队列中。WebSockets 服务端程序订阅所有队列拉取所需的数据。
问题主要出在 Sharding 的时候,当 Cluster 坏掉或者出现脑裂,复制的数据可能会不一致,从而导致奇怪的客户端行为。额外的问题是,Rabbit 新建和删除 Queue Bindings 比较慢 …
read more使用 Python Annotation 编写宏代码
这位同学通过滥用 python annotation 语法来完成动态编程。其基本原理是,Python annotations 的数据存储在实例的 __annotation__
这个 dict 中,而它其实并不限制类型数据一定要是类型,也可以是任何合法的 Python 表达式。例如
@inrange
class MyClass:
var: "0 < var < 1"
这个 var
通常会需要写成一种类似 var: ZeroToOneIntegerClass
这样的语法,但是通过 @inrange
解析这个字符串动态生成了如下代码:
class MyClass:
var: "0 < var < 1"
def __init__(self):
self._var = None
@property
def var(self …