烧瓶post-fork连接到cassandra
问题描述:
我正在开发烧瓶微服务以暴露cassandra数据库中的一些数据。从命令行调用gunicorn。问题在于,我对于在何处以及如何连接数据库感到困惑,尤其是在进行单元测试时考虑如何模拟或绕过数据库的需求。烧瓶post-fork连接到cassandra
我第一次尝试是在创建应用程序时连接如下
def create_app():
app = Flask(__name__)
app.debug = True
cluster = Cluster([os.environ['CASSANDRA_HOST']])
app.cassandra = cluster.connect(os.environ['CASSANDRA_KEYSPACE'])
return app
认为它会让每个单独的请求一个“全球性”连接减少开销。这显然不能通过单元测试,因为它会尝试连接,这不是CI管道隔离环境中单元测试的要点。
然后,从卡桑德拉人检查一些slides它说烧瓶使用@app.before_first_request
,并作为连接“后叉”的一般规则。我不确定在这种情况下后叉的含义。
总之,做
@app.before_first_request
def before_request():
app.cluster = Cluster([os.environ['CASSANDRA_HOST']])
app.cassandra = app.cluster.connect(os.environ['CASSANDRA_KEYSPACE'])
也可以,但是仍然有孤立的单元测试同样的问题。
通过阅读这个post,我想我没有连接本身的问题,因为我正在创建一个由gunicorn(post-fork)产生的每个瓶子实例的cassandra会话。
然后,我的问题将减少能够单元测试端点而不必明确达到数据库的策略。
答
总的想法是每个进程都有一个集群/会话,在叉上创建并保存为进程生命周期。大多数服务器提供了一个post-fork'hook'来设置像这样的资源。
的Gunicorn钩记录here
uWSGI类似物是在driver FAQ参考。