這裡是 WWW 第拾捌期,Wow Weihang Weekly 是一個毫無章法的個人週刊,出刊週期極不固定,從一週到五年都有可能。初期內容以軟體工程為主,等財富自由後會有更多雜食篇章。
10 Ways to Shoot Yourself in the Foot with Kubernetes, #9 Will Surprise You - Laurent Bernaille
Datadog 的工程師分享十個在正式環境踩到的 K8s 坑,這邊簡單條列標題,有興趣的請直接看影片:
- 永遠是 DNS 的鍋
- Job 沒開始,Image 又 pull 失敗惹
- 我不能 kubectl 了:apiserver 被 DDOS 而且 OOM killed
- 新 node 不能 schedule pod
- log volume 成長了十倍:都是一堆 audit logs
- 我的 pod 怎麼沒有漲到 replicas 數量
- 120 node 的 Cassandra cluster 爆了
- Deploy 的 heartbeat 越來越慢
- Runtime 壞了(寫壞的 readinessProbe、效能問題)
- 優雅地關閉你的 pod
RedisJSON - a JSON data type for Redis
Redis 可以和 NGINX 一樣支援 load 各種外掛 modules,而且 Redis 官方(RedisLabs)甚至做了可以在 Redis 裡面操作 JSON 的 RedisJSON。
- 整個 object root 的 get/set 比 lua script 的 cjson 和 msgpack 慢,雖然已經不錯了
object.path
的 get/set 完全相反過來,一整個好非常多,,隨著 payload size 上升 ops 還是維持常數
感覺如果有 nested JSON update on Redis 需求可以考慮,而且這個 module 不小心用到 Rust 的 bson
(現由 MongoDB 官方維護)和 Rust 社群最知名最強大的 serde_json
JSON 序列化反序列化這兩個 crate, 哪間公司採用 RedisJSON 後想要 fork 可以找我。
附上範例:
127.0.0.1:6379> JSON.SET foo . '"bar"'
OK
127.0.0.1:6379> JSON.GET foo
"\"bar\""
127.0.0.1:6379> JSON.TYPE foo .
string
127.0.0.1:6379> JSON.SET arr . []
OK
127.0.0.1:6379> JSON.ARRAPPEND arr . 0
(integer) 1
127.0.0.1:6379> JSON.GET arr
"[0]"
127.0.0.1:6379> JSON.ARRINSERT arr . 0 -2 -1
(integer) 3
127.0.0.1:6379> JSON.GET arr
"[-2,-1,0]"
The Chromium Projects: Memory safety
Chromium 團隊檢視了目前 Chromium 軟體漏洞分類,並做出未來的行動規劃:
- 將近七成是 memory unsafety,也就是 C 和 C++ 指標使用錯誤導致,而其中一半是 use-after-free 這種問題
- Chromium 安全機制很大一部分建立在「產生不同 process 來隔離資源作為沙盒」,但 process 不便宜,尤其在手機上
- Network layer 仍是整個 app 共用,違反了 Rule Of 2,但把 network 拆成 per-process 資源消耗會更可怕
魔高一丈,道高一尺,團隊覺得不行動就等死,所以有了以下幾個方向:
- 開啟 std/abseil(類似 boost 的 std extension lib) 檢查 caller 的編譯機制、用更多 GC 機制
- 自己做個 C++ 方言,並限制使用 raw pointer
- 使用更 memory safe 的語言:Java/Kotlin、JavaScript、Rust、Swift
- 最適切的語言選擇要有編譯期的安全檢查,而且效能影響要夠低
- 團隊能預見導入新語言的 bridge 成本存在(軟體面、工程面都有指涉我猜)
- Chromium 已經有個 Rust 實驗性分支