问题描述
我有一个 API,是一个在 AWS EC2 上部署了 python 的烧瓶应用程序。某些终端节点需要连接到 AWS Keyspace 以进行查询。但是方法cluster.connect()
太慢了,需要5秒连接然后运行查询。
我为解决它所做的是在应用程序启动时启动连接(当在主分支上完成提交时,我使用的是 CodePipeline),然后连接一直打开。
我在 python cassandra 驱动程序文档中没有找到任何与此相关的内容,我发现的这个解决方案是否有任何潜在问题?
解决方法
这是一种推荐的方式 - 在开始时打开连接并保持它(每个应用程序有一个连接)。打开与 Cassandra 集群的连接是一项昂贵的操作,因为除了连接本身之外,驱动程序还会发现集群的拓扑结构、计算令牌范围以及许多其他事情。通常,对于“正常”的 Cassandra,这应该不会很长(但仍然很昂贵),而且 AWS 的模拟可能会在此基础上增加额外的延迟。
,能否提供当前的连接配置?
Amazon Keyspaces 默认使用传输层安全 (TLS) 通信。如果您没有提供连接证书,添加它可以帮助加快速度。有关完整示例,请查看 Keyspaces Python Sample
您也可以尝试禁用以下选项,这些选项应该会为初始连接提供更快的时间。
schema_metadata_enabled = False
token_metadata_enabled = False
from cassandra.cluster import Cluster
from ssl import SSLContext,PROTOCOL_TLSv1_2,CERT_REQUIRED
from cassandra.auth import PlainTextAuthProvider
import boto3
from cassandra_sigv4.auth import SigV4AuthProvider
ssl_context = SSLContext(PROTOCOL_TLSv1_2)
ssl_context.load_verify_locations('path_to_file/sf-class2-root.crt')
ssl_context.verify_mode = CERT_REQUIRED
boto_session = boto3.Session()
auth_provider = SigV4AuthProvider(boto_session)
cluster = Cluster(['cassandra.us-east-2.amazonaws.com'],ssl_context=ssl_context,auth_provider=auth_provider,port=9142)
cluster.schema_metadata_enabled = False
cluster.token_metadata_enabled = False
session = cluster.connect()
r = session.execute('select * from system_schema.keyspaces')
print(r.current_rows)