我正在尝试重用Cassandra集群会话以用于后续的AWS Lambda函数调用。我已经在Java中成功地实现了它,但是在python中重用会话会导致lambda调用超时(实际执行初始化的第一个调用是可以的)。在
从CloudWatch日志中我可以看到一个Heartbeat failed for connection
。在我看来,会话在空闲时无法通信,并且处于无法恢复连接的不一致状态。尝试比函数超时更长或更短的idle_heartbeat_interval
实际上对结果没有任何影响。在
以下是lambda函数的结构(为简洁起见,省略了一些代码):
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'
为了完整起见,我就是这样创建与集群的连接的:
^{pr2}$是否有一些驱动程序配置的细节,python lambda行为,我不知道,以防止会话被重用?在
我确实认为awslambda是一个非常好的工具,但是对执行没有太多的控制可能会在某些方面造成混乱。任何建议都非常感谢,谢谢。在
在
cassandra-driver
常见问题解答中也有类似的问题,其中WSGI应用程序不能与全局连接池一起工作:这至少让我正确地检查了可用的连接类:结果发现,
cassandra.io.twistedreactor.TwistedConnection
在awslambda上工作得很好。在总的来说,代码是这样的:
不过,您需要在venv中安装
twisted
。在我在一分钟的crontab上运行了一夜,只看到一些连接错误(一小时内最多2个),所以总体上对这个解决方案很满意。在
另外,我还没有测试基于
eventlet
和gevent
的连接,因为我不能让它们猴子修补我的应用程序,而且我也不想编译libev
来在lambda上使用。也许有人想试试。在别忘了 http://datastax.github.io/python-driver/faq.html#why-do-connections-or-io-operations-timeout-in-my-wsgi-application
我想我可以声明,这个问题是由于使用Python执行环境w.r.t.Java时lambda的不同行为引起的。在
我有时间设置了一个简单的lambda函数,它都是用javaadpython实现的。该函数只生成一个线程,该线程在while循环中打印当前时间。问题是:Java实现中的线程是否会在lambda函数返回后继续打印,相反,Python线程是否会停止?在这两种情况下,答案都是肯定的:java线程将继续打印直到配置的超时,而python将在lambda函数返回时立即停止。在
Java版本的CloudWatch日志确认:
在Python版本中:
^{pr2}$以下是两个函数的代码:
Python
Java
相关问题 更多 >
编程相关推荐