我的Django应用程序(由Apache托管)的大多数请求都需要连接到Cassandra密钥空间并获取/处理数据。目前,我为每个请求打开一个新连接,即使是最简单的请求也会增加2.5秒的开销!
解决方案是使用连接池,但我不清楚如何在Django中完成此操作?这是我到目前为止所发现的:
我可以使用像CQL-Engine或Django Cassandra Engine这样的对象映射器,它们可以跨多个请求保持连接。我不需要对象映射器,所以我宁愿跳过使用我不需要的库。当然,我已经在使用Datastax Python驱动程序了,这意味着我可以使用CQL-Engine,但它不是很清楚它是如何帮助的!
我可以修改我的WSGI并在进程fork之后连接到Cassandra,并与该进程处理的每个请求共享(更多详细信息here)。我目前正在使用mod_wsgi
,但我在gunicorn
上找到了更多结果(我不介意转换)。对于gunicorn
,我可以使用回调post_fork
(如this example所示)。我可以连接,但我不确定如何与应用程序共享连接!并且有0个例子。
wsgi.py
中连接到我的数据库,我可以与我的应用程序共享它(它也适用于mod_wsgi
)。我所要做的就是这样:import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../")))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
from myapp import keyspace_manager
from django.conf import settings
cluster, session = keyspace_manager.initCassandraConnection()
settings.CLUSTER = cluster
settings.SESSION = session
然后我可以在我的请求中访问集群/会话对象,而不是每次都初始化它。
现在我的问题是:这种方法(#3,wsgi.py
中的初始连接),对吗?可能出现什么问题?
如果没有,我怎么能在Django中进行Cassandra连接池?
非常感谢,