私は RavenDB と NOSQL 全般に非常に慣れていません。パフォーマンスをテストするために、RavenDB.Client を使用して非常に大まかなコードを書きました。ランダムな間隔 (1 秒から 10 秒) ですべての要求に対して新しいセッションを使用して、それぞれが単純にテスト ドキュメントを作成する 500 の同時タスクを開始しています。
なんらかの奇妙な理由で、リクエストは「バースト」で送信され、1 分弱で約 150 回の書き込み/秒に達します。トラフィック バースト?
そして、これらの各バーストの間には数分あります。
アプリケーションをデバッグするときに、session.SaveChanges() にブレークポイントを設定するとすぐにヒットするので、これが ravenDB.Client ライブラリの接続制限なのか (httpclient だと思いますか?)、それともリクエストを制限する実際のデータベース。
これがなぜなのかについての推測やヒントをいただければ幸いです。
編集:奇妙なことに、リクエスト間の遅延なしで 1 つのタスクのみを実行すると、約 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; }
}
}
}