Mongoengine:document.save() 永远挂起 - 或直到集合被删除

问题描述 投票:0回答:1

我时常看到一个奇怪的问题。 “保存”方法会挂起,直到整个集合被删除。

我正在使用 mongoengine 连接到副本集。 该代码在 FastAPI 应用程序内运行。 我怀疑重新部署后会发生这种情况。

我现在看到的流程是:

  1. 向 FastAPI 发送请求以执行“foo”
  2. “foo”创建一个新的 mongoengine 文档并尝试保存它
  3. 保存永远挂起或直到我删除整个集合

集合是否正在使用某种类型的锁来防止它排除新的“保存”操作?

fastapi mongoengine
1个回答
0
投票

抱歉迟来的答复-

此问题可能与几个因素有关,包括:

  • Locks:MongoEngine 使用锁定机制来保证线程安全。如果锁没有正确释放,可能会导致后续操作挂起。检查代码中是否有任何未释放的锁,或使用 try-finally 块来确保释放锁。

  • 副本集配置:验证您的副本集配置,包括主节点和辅助节点。确保主节点可访问并且副本集已正确配置。

  • 连接池:MongoEngine 使用连接池来管理与数据库的连接。如果池配置不正确或者连接未释放,可能会导致与您遇到的问题类似的问题。

  • FastAPI 和异步行为:FastAPI 是一个异步框架,MongoEngine 默认情况下对异步不友好。确保您使用正确的异步驱动程序和配置以避免阻塞问题。

  • 部署并重启:重新部署后,可能无法正确重新建立MongoDB连接,导致保存操作挂起。

要排除故障,请尝试以下操作:

  • 启用 MongoEngine 日志记录:将日志记录级别设置为 DEBUG,以更深入地了解操作和潜在问题。

  • 检查 MongoDB 日志:验证 MongoDB 日志是否存在与连接、锁定或副本集配置相关的任何错误或问题。

  • 使用 try-except 块:将保存操作包装在 try- except 块中以捕获并记录可能发生的任何异常。

  • 验证连接和副本集状态:保存之前,检查连接和副本集状态以确保它们健康且可访问。

  • 使用更简单的场景进行测试:通过在 FastAPI 外部测试保存操作来隔离问题,使用简单的脚本排除任何与框架相关的问题。

© www.soinside.com 2019 - 2024. All rights reserved.