-1

一般来说,我对 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; }
    }
}

}

4

1 回答 1

1

不知道为什么我以前没有想到它,但我突然意识到客户端有异步方法,我尝试了这些方法。在等待文档创建时,我可以保持请求一致。这是编辑过的部分,如果有人偶然发现这个问题,尽管我非常怀疑......

private async Task<bool> WriteTest(int delay)
{


    bool run = true;
    while (run)
    {
            //Write to DB
            await db.ravenDB.CreateDocument();
            await Task.Delay(delay);
    }

    return true;
}

public async Task CreateDocument()
{
    using (var session = Store.OpenAsyncSession())
    {

        await session.StoreAsync(new TestObject
        {
            Name = "TestObjectName",
            RandomNumber = 123
        });

        await session.SaveChangesAsync();
    }

}
于 2018-05-06T20:16:02.140 回答