Poslua Blog

「你是一个出色的程序员」要比「你是一个开发总监」要有意义的多

ln 强制覆盖 symlink 失败问题研究

浅踩 kernel bug

最近公司 CI 升级,将 docker 基镜像由原先的 debian 切换到了 ubuntu,导致应用一旦成功启动之后,再次执行重启将会持续失败。查看日志,发现打印 ln: failed to access '/tmp/access.log/stdout': Not a directory 看来是 ln 执行失败,导致 docker entrypoint 无法执行成功,所以一直 resta...

Gzip 的一个坑

fileDescriptor embed

我们的项目里为了方便部署,swagger 文档是通过 gzip 压缩后,被植入到程序里的。其实这个思路源自于 gRPC ProtoBuf fileDescriptor var fileDescriptor_308767df5ffe18af = []byte{ // 2522 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08,...

Uber Cadence 学习

相反 Netflix Conductor 的 JSON DSL 简直就是噩梦

Cadence “Cadence is a distributed, scalable, durable, and highly available orchestration engine to execute asynchronous long-running business logic in a scalable and resilient way. “ “Fault-Obliv...

Nginx Buffer 机制引发的下载故障

Nginx Buffer 机制研究

前几天,接到研发同事反馈,内网通过 Nginx 代理下载 OSS 的大文件时,老是会断,而在服务器上下载时却很正常,非常奇怪。原本以为可能和 VPN 有关,经确认排除嫌疑。彷徨了许久,最后发现是 Nginx Buffer 的锅。下面就来聊聊这个问题是怎么发生的。 Nginx Buffer 机制 在 Nginx 代理过程中,有两种连接: 客户端到 Nginx 的连接 Nginx...

如何调试 Go mod 的各种异常

调试 go mod 问题总会令人失去耐心

Go mod 自从诞生之日就带来了太多太多的争议,当然不能否认它的设计初衷是好的。然而在调试其各种异常时,却浪费了太多开发者的时间。可以毫不客气的说,从来没有一种语言的版本管理,能让人如此崩溃。 本文记录了一些我的踩坑经验,希望能给还在挣扎中的 Gopher 一些帮助。 go get 先来看看最近我遇到的一个问题: $ go mod tidy go: foo.bar.com/foo/...

Lua table 如何实现最快的 insert?

Fastest Table Inserts

前两天群里有个朋友贴出一段代码: function _M.table_keys(self, tb) if type(tb) ~= "table" then ngx.log(ngx.WARN, type(tb) .. "was given to table_keys") return tb end local t = {} f...

Nginx vs Envoy vs Mosn 平滑升级原理解析

TCP 连接迁移

本文适合对 Nginx 实现原理比较感兴趣的同学阅读,需要具备一定的网络编程知识。 平滑升级的本质就是 listener fd 的迁移,虽然 Nginx、Envoy、Mosn 都提供了平滑升级支持,但是鉴于它们进程模型的差异,反映在实现上还是有些区别的。这里来探讨下它们其中的区别,并着重介绍 Nginx 的实现。 Nginx 相信有很多人认为 Nginx 的 reload 操作就能完成...

关于 etcd 的一些谣言

纸上谈兵

1. 分区脑裂 这是一个被广为流传的误解,众所周知 etcd 使用 Raft 协议来解决数据一致性问题。一个 Raft Group 只能有一个 Leader 存在,如果一旦发生网络分区,Leader 只会在多数派一边被选举出来,而少数派则全部处于 Follower 或 Candidate 状态,所以一个长期运行的集群是不存在脑裂问题的。etcd 官方文档也明确了这一点: The m...

VS Code 快速查看 Golang 接口

工欲善其事,必先利其器

背景 使用 vscode 阅读 Go 项目源码时,有个不太方便的地方,就是跟踪 interface 的实现。vscode 只能追到 interface 定义的地方,而无法定位到其具体的实现。比如,我在追 etcd 关于 revision 的读取的时候只能追到这里: 如果项目比较小,还比较容易对付,因为按照习惯来讲,其实现往往都在对应接口的下方。但是遇到这种像 etcd 的项目就抓瞎了...

聊一聊字符串内部化

String Interning

缘起 字符串作为一种不可变值类型,在多数的语言里,其底层基本都是个只读的字节数组:一旦被创建,则不可被改写。正是因为其只读特性,如果有大量相同的字符串需要处理,那么在内存中就会保存多份,显然是非常浪费内存的。 对于 C 来说字符串本质上就是 const char*;而对于 Lua,虽然字符串并不是以 \0 结尾,但是 TString 的数据本质上也是一个 const char* ...