その後のAWSラムダ関数呼び出しでCassandraクラスタセッションを再利用しようとしています。私は正常にJavaで実装しましたが、Pythonでセッションを再利用すると、ラムダ呼び出しがタイムアウトになります(実際に初期化を実行する最初の呼び出しはOKです)。AWS LambdaでのCassandraデータベースセッションの再利用
CloudWatchログからは、Heartbeat failed for connection
が表示されます。セッションがアイドル状態では通信できず、接続を再開できない矛盾した状態になることがわかります。関数のタイムアウトより長いか短いかを試してみても、結果には何の影響もありません。ここで
は、私のラムダ関数(簡潔にするためにいくつかのコードを省略)の構造である:
import logging
from cassandra_client import CassandraClient
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# State of the initialization phase
flag = False
# Cassandra instance
cassandra = None
def handle_request(event, context):
global flag, logger, cassandra
logger.info('Function started. Flag: %s' % (str(flag),))
if not flag:
logger.info('Initialization...')
try:
cassandra = CassandraClient()
# ...
flag = True
except Exception as e:
logger.error('Cannot perform initialization: '+e.message)
exit(-1)
# Process the request ...
return 'OK'
ただ、完全を期すために、それは私がクラスタとの接続を作成する方法は次のとおりです。
def _connect(self, seed_nodes=default_seed_nodes, port=default_port):
self.cluster = Cluster(seed_nodes, port=port)
self.metadata = self.cluster.metadata
self.session = self.cluster.connect()
# ...
がありますいくつかのドライバの設定の詳細、私はそれが再利用されるセッションを防ぐことができないのpythonのラムダの動作?
私はAWS Lambdaは本当に素晴らしいツールだと思いますが、実行を制御していないと、何らかの形で混乱することがあります。どんな提案もありがとうございます。
することを忘れないでください。それを制御するために '' flag''を使う必要はありません。しかし、それは単なるスタイルのポイントです、私はそれが問題を引き起こしているとは思わない。あなたのログは何を言いますか? – garnaat
チップをありがとう、それは確かにもっと明らかになるでしょう。私はCloudWatchのログを調べ、各要求は「300.00秒後にタスクがタイムアウトしました」と終了します。私が試したクライアントの設定にもよりますが、私は 'Client request timeout 'も持っています。 Session.execute [_async](タイムアウト) 'と前述の' Heartbeat failed for connection'を参照してください。結果が常に一貫しているとは限りません。 – riccamini
VPCでラムダ機能ですか?もしそうなら、カッサンドラクラスターは同じVPCに入っていますか? – garnaat