我们都只是在寻找联系

主要观点:

  • 一直致力于将 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 的工作,还提到了公司的职业生涯页面
阅读 15
0 条评论