Rust 流和超时陷阱

主要观点:

  • 有 R2 上 Parquet 文件路径列表,需获取每个文件的 Parquet 页脚,避免获取多余内容。
  • Rust 的流抽象类似迭代器且可进行异步操作,代码示例展示如何实现获取所需页脚且代码较清晰。
  • 工作中部署后在日志中出现 R2 随机超时,同事发现微妙错误,因多个异步任务运行及执行顺序问题导致。
  • 有两种解决办法,一是在映射函数中使用tokio::spawn,二是在tokio::select!中单独 spawn 任务获取页脚。
  • 即使有上述两种解决方案,仍存在原始阻塞任务的问题,更好的办法是使用spawn_blocking()将阻塞工作转移。

关键信息:

  • 使用futures::stream::StreamExt实现获取 Parquet 页脚。
  • 异步任务运行顺序可能导致 R2 超时。
  • 两种解决超时问题的方法及更好的用spawn_blocking()的建议。

重要细节:

  • 在获取页脚的代码中通过stream::itermap进行异步操作。
  • 异步任务tokio::select!中任务执行时间差异可能引发超时。
  • 提到 Tokio 使用工作窃取执行器但不一定能转移阻塞任务。
阅读 14
0 条评论