Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 卡桑德拉港_C#_Multithreading_Cassandra_Datastax_Datastax Enterprise - Fatal编程技术网

C# 卡桑德拉港

C# 卡桑德拉港,c#,multithreading,cassandra,datastax,datastax-enterprise,C#,Multithreading,Cassandra,Datastax,Datastax Enterprise,该问题与将大量数据写入Cassandra群集有关,并导致运行向Cassandra写入数据的应用程序的主机上的端口耗尽 有关问题的详情如下: 在我们的应用程序中,我们不断地将数据写入由3个节点组成的Cassandra集群。应用程序是用C#编写的,并且是多线程的。假设有100个线程打开,每个线程开始使用datastax C#driver向Cassandra发出写操作。根据这个文档(),会话对象是线程安全的,并且在每个线程中都被重用。运行应用程序后,在几个小时内,我们观察到“端口耗尽”问题发生,运行应

该问题与将大量数据写入Cassandra群集有关,并导致运行向Cassandra写入数据的应用程序的主机上的端口耗尽

有关问题的详情如下:

在我们的应用程序中,我们不断地将数据写入由3个节点组成的Cassandra集群。应用程序是用C#编写的,并且是多线程的。假设有100个线程打开,每个线程开始使用datastax C#driver向Cassandra发出写操作。根据这个文档(),会话对象是线程安全的,并且在每个线程中都被重用。运行应用程序后,在几个小时内,我们观察到“端口耗尽”问题发生,运行应用程序的主机停止创建或接受任何其他连接。在研究了这个问题之后,我们认为每个线程向Cassandra驱动程序发出的写操作创建了到Cassandra集群的单个物理连接(最多20k个连接)

当单个写入操作完成时,连接关闭。但“创建连接”和“关闭连接”的比率并不相似。连接打开得非常快,关闭得相对较慢。当它达到大约20k开放连接时,主机将不会再创建任何连接

我们的问题是,与即将出现的新写指令相比,写指令执行时间更长,导致许多连接保持打开更长时间,这是否是Cassandra驱动程序/系统的预期行为

如果这是Cassandra驾驶员/系统的预期行为,那么可以采取哪些其他替代方案?(例如,在多台机器上运行应用程序,任务分布在节点之间,以避免端口耗尽。)

如果这不是本场景中的预期行为,那么我们将非常感谢您指导我们找到可能的解决方案

运行C#应用程序的服务器的详细信息:-

操作系统:Windows Server 2012 R2

内存:8GB

税务企业数据:4.8.3

卡桑德拉版本:2.1

Cassandra C#驱动程序版本:3.0.5

用于创建集群和会话的代码

string NodeIps = "127.0.0.1,127.0.0.2,127.0.0.3";
List<string> addresses = new List<string>();
        addresses = NodeIps.Split(',').ToList();
        cluster = Cluster.Builder()
            .AddContactPoints(addresses)                                       //node ip
            .WithRetryPolicy(DowngradingConsistencyRetryPolicy.Instance)
            .WithReconnectionPolicy(new FixedReconnectionPolicy(0, 5000, 2 * 60000, 60 * 60000))
            .WithQueryTimeout(600000)     //Timeout specified in milliseconds.  //10 min = 600000
            .Build();
ISession session = cluster.Connect(KeySpace);
string NodeIps=“127.0.0.1127.0.0.2127.0.0.3”;
列表地址=新列表();
addresses=NodeIps.Split(',').ToList();
cluster=cluster.Builder()
.AddContactPoints(地址)//节点ip
.WithRetryPolicy(降级一致性eTryPolicy.Instance)
.使用重新连接策略(新的固定重新连接策略(0,5000,2*60000,60*60000))
.WithQueryTimeout(600000)//以毫秒为单位指定超时//10分钟=600000
.Build();
ISession session=cluster.Connect(键空间);

Cassandra驱动程序支持对多个查询使用相同的连接,但C#驱动程序的默认设置非常低-至少与我过去使用的驱动程序相比

YMMV,但您可以调整连接选项(),以便将连接用于多个请求。您还可以设置创建的最大连接数,以防止应用程序停止


如果收到的请求超过了可以及时处理的数量,这显然会使您的应用程序陷入瓶颈。如果出现问题,您需要优化或使用其他服务器。

Cassandra驱动程序支持对多个查询使用相同的连接,但C#驱动程序上的默认设置非常低-至少与我过去使用的驱动程序相比

YMMV,但您可以调整连接选项(),以便将连接用于多个请求。您还可以设置创建的最大连接数,以防止应用程序停止


如果收到的请求超过了可以及时处理的数量,这显然会使您的应用程序陷入瓶颈。如果这是一个问题,您需要优化或使用其他服务器。

您能在创建集群和会话实例的地方发布代码吗?此外,您应该启用驱动程序跟踪以查看引擎盖下发生了什么:@jorgebg我已经用代码更新了问题。您说“当单个写入操作完成时,连接已关闭。”:您不应该在写入后关闭/关闭会话。会话维护到每个节点的连接池,您应该在应用程序关闭时关闭群集实例。@jorgebg所说的连接,是指操作系统到cassandra群集的出站连接,我们通过在命令提示符中写入
netstat-ano | find/c“:9042”
命令来检查该出站连接,不是会话对象(ISession)。只有当我们的应用程序关闭时,会话对象才会关闭。您可以在创建集群和会话实例的位置发布代码吗?此外,您应该启用驱动程序跟踪以查看引擎盖下发生了什么:@jorgebg我已经用代码更新了问题。您说“当单个写入操作完成时,连接已关闭。”:您不应该在写入后关闭/关闭会话。会话维护到每个节点的连接池,您应该在应用程序关闭时关闭群集实例。@jorgebg所说的连接,是指操作系统到cassandra群集的出站连接,我们通过在命令提示符中写入
netstat-ano | find/c“:9042”
命令来检查该出站连接,不是会话对象(ISession)。只有当我们的应用程序关闭时,会话对象才会关闭。