Django
我们使用& mongoDB
(PyMongo
驱动程序)开发了一个 REST API 。问题是,在对 API 端点的某些请求中,PyMongo
游标返回的部分响应包含的文档比它应该包含的要少(但它是一个完全有效的 JSON 文档)。
让我用一个我们的观点的例子来解释它:
def get_data(key):
return collection.find({'key': key}, limit=24)
def my_view(request):
key = request.POST.get('key')
query = get_data(key)
res = [app for app in query]
return JsonResponse({'list': res})
我们确信有超过 8000 个文档与查询匹配,但在某些调用中,我们得到的结果少于 24 个(甚至为零)。我们调查的第一个问题是我们的代码中有多个MongoClient
定义。通过解决这个问题,问题的发生次数减少了,但我们仍然在很多电话中遇到了这个问题。
在所有这些调查之后,我们设计了一个测试,我们同时向服务器发出 16 个异步请求。通过这种方法,我们可以重现问题。在这 16 个请求中,有 6-8 个请求有部分结果。运行此测试后,我们将uWsgi
进程数减少到 6 个并重新启动服务器。所有结果都很好,但在服务器上再次施加重负载后,问题又开始了。此时,我们重新启动了 uwsgi 服务,一切正常。通过最后一个实验,我们现在有了一个线索,当 uwsgi 服务开始运行时,一切正常,但经过一段时间和高负载后,服务器又开始返回部分或空的结果。我们最近的调查是使用python manage.py
with运行 APIDEBUG=False
,在这种情况下一段时间后我们又遇到了问题。
我们无法弄清楚问题是什么以及如何解决它。我们能想到的一个原因是 Django 在完成之前关闭了 pymongo 的连接。因为返回的结果是一个有效的 JSON。
我们的堆栈是:
- nginx(未启用缓存)
- uWsgi
- MemCached(在调试过程中禁用)
- Django(python 3 上的 v1.8)
- PyMongo (v3.0.3)
非常感谢您的帮助。
更新:
蒙哥版本:
db version v3.0.7
git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd
- 我们正在运行单个
mongod
实例。没有分片/复制。 我们正在使用此代码段创建连接:
con = MongoClient('localhost', 27017)