为什么我的Python应用连接到Cassandra比C#慢?

hwamh0ep  于 2023-04-11  发布在  Cassandra
关注(0)|答案(2)|浏览(304)

我在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驱动程序不会崩溃

2fjabf4q

2fjabf4q1#

在Cassandra应用程序中,ClusterSession应该是单例的,因为它们是有状态的(处理负载平衡,故障转移),并且打开连接的成本很高。
在这里你在一个循环中一遍又一遍地打开连接。把这三条线移到循环之外,应该会重新站起来。

auth_provider = PlainTextAuthProvider(username="cassandra", password="cassandra")
cluster=Cluster(["localhost"], auth_provider=auth_provider,connect_timeout=30)
session=cluster.connect("rds")
ryevplcw

ryevplcw2#

你的测试在我看来是无效的(稍后会详细介绍)。你违反了使用指南,主要是(1)使用单个集群对象,(2)在应用程序的生命周期中使用单个会话对象,因为(3)维护多个示例的成本很高。
但是,特别是在你发布的示例代码中,你并没有进行苹果对苹果的比较。
在你的C#代码中,你对dispose()进行了显式调用:

session.Dispose();
    cluster.Dispose();

关闭所有连接并执行资源清理。但是,您在Python代码中没有做同样的事情,这意味着旧的连接(和相关资源)仍然由应用程序在后台维护。
为了使这两个示例代码更具有可比性,您应该调用Session.shutdown()Cluster.shutdown()。有关更多信息,请参见the cassandra.cluster API Doc for the Python driver
在任何情况下,您的测试都是无效的,因为它不是应用程序在真实的生活中的行为方式。如果您告诉我们您试图解决什么问题或您试图实现什么目标,我们将能够提供更好的答案。
如果你有兴趣,我建议你看看Best practices for Cassandra drivers.干杯!

相关问题