主要观点:
- 一直致力于将 Quip 技术组件引入 Slack 的canvas功能,同时维护独立的 Quip 产品,Quip 后端用 Python 编写,讲述去年 7 月遇到的棘手 bug 及从中吸取的关于小心 TCP 状态的教训。
关键信息: - 出现
EOFError
错误,堆栈跟踪显示asyncio.IncompleteReadError
,相关代码中is_connected()
和closed()
函数有误。 - 数据库代理在事件发生时关闭了大量连接,怀疑是
if not self.conn.is_connected():
这行代码有问题,还发现其他 6 个相关 bug。 - 最终明白是代理关闭数据库连接且未及时重新连接导致
EOFError
,部署修复后错误大幅减少,也解决了 Python 运行时迁移的阻塞问题。
重要细节: - 错误分布在多个服务和数据库主机,代码中连接访问受内存锁保护,代理关闭连接的度量指标等。
- 对
AsyncioConnection
的实现进行了单元测试,证明closed()
和is_connected()
函数的问题。 - 修复后 SQL 查询中的
EOFError
近乎完全减少,客户端发起连接的错误也消失,异步迁移项目恢复并完成。 - 强调要深入挖掘底层代码,不能仅依赖
StreamWriter.is_closing()
,TCP 连接的半关闭状态等细节。 - 特别感谢 Ross Cohen 的工作,还提到了公司的职业生涯页面。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。