【问题标题】:Cassandra Connection Pool for FlaskFlask 的 Cassandra 连接池
【发布时间】:2015-04-28 03:53:06
【问题描述】:

我正在开发一个使用 Flask 构建的 REST Web 服务,该服务需要查询 Cassandra 数据库。逻辑中最昂贵的部分是创建与 Cassandra 集群的连接。

我需要对 Flask 做什么,这样我就不必在每次请求时都创建与集群的连接?

【问题讨论】:

  • 试试这个:datastax.github.io/python-driver/api/cassandra/pool.html Flask 在等式中没有太大变化 :)
  • 谢谢。是否有说明如何正确使用此功能的教程或示例?我一直在四处寻找,除了您链接到的页面之外找不到任何其他内容。
  • 如果您共享 session = cluster.connect() 对象,您应该会很好。它会自动为您池化。
  • @Wolph 我试过这个,它可以工作很短的时间,但是 Cassandra 驱动程序将失去它与集群的连接并在每次请求时抛出一个错误。集群仍在运行,如果我重新启动 uWSGI,Web 服务将再次开始正常运行。
  • 我不能说我曾经为 Cassandra 手动编写过客户端,但是查看cqlengine 源,他们似乎有一种重新连接方法来解决这个问题:github.com/cqlengine/cqlengine/blob/master/cqlengine/… 不是最漂亮的解决方案但它确实有效

标签: python flask cassandra


【解决方案1】:

您不应该对每个请求都创建新连接,而应该为每个进程创建一个连接对象。

如果您使用 uwsgi 运行烧瓶应用程序,我建议使用 @postfork 装饰器。 说-您正在使用 uwsgi 生成 4 个进程,然后 进程生成后为每个进程创建一个会话。

from uwsgidecorators import postfork
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.query import dict_factory
from cassandra.policies import RoundRobinPolicy

session = None
hosts=["127.0.0.1","127.0.0.2"]
keyspace="mykeyspace"

def get_new_session():
    global cluster
    cluster = Cluster(hosts, protocol_version=4, auth_provider=auth_provider, control_connection_timeout=None,
                  max_schema_agreement_wait=10, port=9042, load_balancing_policy=RoundRobinPolicy())
    s = cluster.connect(keyspace)
    s.row_factory = dict_factory
    return s

#initializing session in every process spawned by uwsgi
@postfork
def connect():
     global session
     session = get_new_session() 
     session.row_factory = dict_factory

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2013-10-22
    • 1970-01-01
    • 2018-06-27
    • 2013-04-03
    • 1970-01-01
    • 2018-03-22
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多