使用 C# 在 AWS 密钥空间中插入多条记录



>你好,我刚开始使用Cassandra不太熟悉,你能告诉我这里的错误吗

我正在尝试使用波纹管代码插入 16000 条记录

public async Task AddSprintsStories(List<SprintStories> sprintStories)
{
var tasks = new List<Task>();
try
{
if (sprintStories.Count > 0)
{
foreach (var item in sprintStories)
{
SprintStories sprintStoryData = new SprintStories();
sprintStoryData.Id = item.Id;
sprintStoryData.ProjectId = item.ProjectId;
sprintStoryData.SprintId = item.SprintId;
tasks.Add(mapper.InsertAsync<SprintStories>(sprintStoryData, new CqlQueryOptions().SetConsistencyLevel(ConsistencyLevel.LocalQuorum)));
}
await Task.WhenAll(tasks);
}
}
catch (Exception e)
{
}
}

但面临错误:C# 服务器在一致性本地仲裁写入查询期间超时(0 个对等方确认写入超过 2 个需要(

任何人都可以在这里帮助我吗

Cassandra 星团在这个星团中看起来如何? CPU 或磁盘 I/O 已用完? 不知道这一点,我的猜测是这 16000 次写入的速度比您的集群处理它们的速度更快,从而产生了回写压力。 最后,它无法再处理,所以他们开始失败。

对于可能的解决方案,请尝试限制活动线程的数量。 这样的事情应该可以做到。

int maxActiveThreads = 20;    
int activeThreads = 0;
foreach (var item in sprintStories)
{
...
tasks.Add(mapper.InsertAsync<SprintStories>(sprintStoryData, new CqlQueryOptions().SetConsistencyLevel(ConsistencyLevel.LocalQuorum)));
activeThreads++;
if (activeThreads >= maxActiveThreads)
{
await Task.WhenAll(tasks);
activeThreads = 0;
}
}
await Task.WhenAll(tasks);

使用此代码,在任何给定时间,只有 20 次写入会争用 Cassandra 群集资源。 请注意,我只是以 20 为例。 将该数字调整为满足性能和稳定性要求的数字。

Ryan Svihla 写了一篇关于这个主题的很棒的博客文章 - Cassandra:没有 BATCH 的批量加载 - 细致入微的版本

最新更新