我在windows 11上的默认安装docker上有默认配置cassandra。表数据包含19行。
python驱动程序非常慢,大约20%的情况下会崩溃。(连接超时)
我最初认为这与docker或容器配置有关,但我注意到RazorSQL没有问题,因此我通过比较官方datastax python驱动程序和官方datastax .NET驱动程序进行了一些性能测试。
结果是毁灭性的:
- Python:22.908秒(!)
- .NET:0.168秒
这是python驱动程序的正常行为吗?
我的python代码:
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
import time
start = time.time()
for i in range(10):
auth_provider = PlainTextAuthProvider(username="cassandra", password="cassandra")
cluster=Cluster(["localhost"], auth_provider=auth_provider,connect_timeout=30)
session=cluster.connect("rds")
session.execute("SELECT COUNT(*) FROM data").one()
end = time.time()
print((end - start)/10)
我的C#代码:
using Cassandra;
using System;
using System.Diagnostics;
public void TestReliability()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 100; i++){Test();}
stopwatch.Stop();
Console.WriteLine("Average connect + one query in ms: " + (stopwatch.ElapsedMilliseconds / 100));
}
public void Test()
{
Cluster cluster = Cluster.Builder().AddContactPoint("localhost").WithAuthProvider(new PlainTextAuthProvider("cassandra", "cassandra")).Build();
ISession session = cluster.Connect("rds");
var result=session.Execute("SELECT COUNT(*) FROM data");
session.Dispose();
cluster.Dispose();
}
编辑:当timeout设置得足够高(35秒(!))时,python驱动程序不会崩溃
2条答案
按热度按时间2fjabf4q1#
在Cassandra应用程序中,
Cluster
和Session
应该是单例的,因为它们是有状态的(处理负载平衡,故障转移),并且打开连接的成本很高。在这里你在一个循环中一遍又一遍地打开连接。把这三条线移到循环之外,应该会重新站起来。
ryevplcw2#
你的测试在我看来是无效的(稍后会详细介绍)。你违反了使用指南,主要是(1)使用单个集群对象,(2)在应用程序的生命周期中使用单个会话对象,因为(3)维护多个示例的成本很高。
但是,特别是在你发布的示例代码中,你并没有进行苹果对苹果的比较。
在你的C#代码中,你对
dispose()
进行了显式调用:关闭所有连接并执行资源清理。但是,您在Python代码中没有做同样的事情,这意味着旧的连接(和相关资源)仍然由应用程序在后台维护。
为了使这两个示例代码更具有可比性,您应该调用
Session.shutdown()
和Cluster.shutdown()
。有关更多信息,请参见thecassandra.cluster
API Doc for the Python driver。在任何情况下,您的测试都是无效的,因为它不是应用程序在真实的生活中的行为方式。如果您告诉我们您试图解决什么问题或您试图实现什么目标,我们将能够提供更好的答案。
如果你有兴趣,我建议你看看Best practices for Cassandra drivers.干杯!