Клиент RavenDB ограничен? - PullRequest
0 голосов
/ 06 мая 2018

Я новичок в RavenDB и NOSQL в целом. Чтобы проверить производительность, я написал очень грубый код с RavenDB.Client. Я просто запускаю 500 одновременных задач, каждая из которых просто создает тестовый документ, используя новый сеанс для каждого запроса со случайным интервалом (1 с-10 с).

По какой-то странной причине запросы отправляются «пакетами» со скоростью около 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; }
    }
}

}

1 Ответ

0 голосов
/ 06 мая 2018

Не знаю, почему я не думал об этом раньше, но вдруг понял, что у клиента есть асинхронные методы, и я попробовал их. В ожидании создания документа я могу поддерживать согласованность запросов. Вот отредактированные части, если кто-то должен столкнуться с этой проблемой, хотя я очень сомневаюсь в этом ...

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();
    }

}
...