一般来说,我对 RavenDB 和 NOSQL 很陌生。为了测试性能,我用 RavenDB.Client 编写了一些非常粗略的代码。我只是启动 500 个并发任务,每个任务都将简单地创建一个测试文档,为每个请求使用一个新会话,随机间隔(1s-10s)。
出于某种奇怪的原因,请求以“突发”的方式发送,在不到一分钟的时间内达到大约 150 次写入/秒。流量爆棚?
每次爆发之间都有几分钟。
调试应用程序时,我可以在 session.SaveChanges() 处设置断点,它会立即被命中,所以我不确定这是否是 ravenDB.Client 库的连接限制(我想是 httpclient?)或者这是否是限制请求的实际数据库。
任何关于为什么会这样的猜测或提示,将不胜感激!
编辑:奇怪的是,在请求之间没有延迟的情况下只运行一项任务时,它会持续执行大约 400-500 个请求/秒。
private Database db = new Database();
public MainWindow()
{
InitializeComponent();
}
public async Task StartTests()
{
Random rnd = new Random();
//Start write threads
for(int i = 0; i < 500; i++)
{
Task.Run(() => WriteTest(rnd.Next(1000,10000)));
await Task.Delay(200);
}
return;
}
private async Task<bool> WriteTest(int delay)
{
Raven ravenDB = new Raven(db.Store);
int o = 0;
while (o == 0)
{
//Write to DB
ravenDB.CreateDocument();
await Task.Delay(delay);
}
return true;
}
private void start_Click(object sender, RoutedEventArgs e)
{
StartTests();
}
public class Database
{
public IDocumentStore Store;
public Database()
{
var store = new Lazy<IDocumentStore>(CreateStore);
Store = store.Value;
}
private static IDocumentStore CreateStore()
{
IDocumentStore store = new DocumentStore()
{
Urls = new[] { "http://localhost:3113" },
Database = "IADB"
}.Initialize();
return store;
}
}
public class Raven
{
IDocumentStore Store;
public Raven(IDocumentStore store)
{
Store = store;
}
public void CreateDocument()
{
using (var session = Store.OpenSession())
{
session.Store(new TestObject
{
Name = "TestObjectName",
RandomNumber = 123
});
session.SaveChanges();
}
}
private class TestObject
{
public string Name { get; set; }
public int RandomNumber { get; set; }
}
}
}