Повысить производительность параллелизма в ASP. NET Core 3.1 и Entity Framework Core? - PullRequest
0 голосов
/ 25 апреля 2020

Сначала я не знал, связан ли мой вопрос с производительностью параллелизма, но сценарий заключается в том, что я хочу вставить некоторые события, поступающие с УАТС-сервера, и в зависимости от типа каждого события указать значение c столбца .

События происходят слишком быстро непрерывно, и продолжительность между двумя событиями может составлять около 0,017 с, как показано на скриншоте ниже из вставленных событий.

enter image description here

Приложение-слушатель разработано в ASP. NET 3.1, класс которого основан на. NET базовом классе фоновой службы, а DBContext предоставляется Entity Framework Core 3.1.2.

In ExecuteAsync метод прослушивателей событий были предоставлены. Поэтому в обработчике событий для вставки событий в базу данных я использую. NET Базовую область поставщика услуг для добавления необходимого репозитория.

            using (var scope = _service.CreateScope())
            {
                var callStatRepo = scope.ServiceProvider.GetRequiredService<ICallStatRepository>();
                var lastState = await callStatRepo.GetLastStateOfDevice(e.Channel.Name);

                var callTypeSb = new StringBuilder();

                if (lastState != null && String.Equals(lastState, "ANSWER",
                    StringComparison.CurrentCultureIgnoreCase))
                {
                    callTypeSb.Append(CallType.OUTCALL.Value);
                }
                else if (lastState != null && String.Equals(lastState, "InboundStarts",
                    StringComparison.CurrentCultureIgnoreCase))
                {
                    callTypeSb.Append(CallType.INBOUND.Value);
                }

                await callStatRepo.InsertCallStat(new RawCallStatRegisterViewModel
                {
                    HappenedAt = DateTime.Now,
                    Type = callTypeSb.ToString(),
                    Device = e.Channel.Name,
                    Number = e.Channel.Connected.Number,
                    State = e.Channel.State
                });

                callTypeSb.Clear();
            }

public async Task InsertCallStat(RawCallStatRegisterViewModel model)
{
    var rawCall = new DeviceState
    {
        HappenedAt = model.HappenedAt,
        Type = model.Type,
        Device = model.Device,
        Number = model.Number,
        State = model.State
    };

    _context.Entry(rawCall).State = EntityState.Added;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (Exception e)
    {
        throw new Exception("Insert new call stat falis with this error : " + e.Message);
    }
}

Проблема заключается в заполнении столбца «Тип» на основе последнего предыдущего » Государственный'. Условие для заполнения «Тип» проверяет, было ли последнее предыдущее состояние «ОТВЕТ» или «Звон». Но иногда это невозможно выяснить, каким было последнее состояние, и оставляет столбец Тип пустым.

enter image description here

Я думаю, что эта проблема может быть связана с слишком быстрой вставкой записей, и я не знаю, как это можно решить. Могу ли я изменить тип базы данных на любой другой тип базы данных, например MongoDB? И может ли это быть правильным решением? Являются ли базы данных No- SQL быстрее, чем сервер SQL в параллельном режиме?

...