менеджер состояния параллельных транзакций в runasync - PullRequest
0 голосов
/ 10 октября 2018

В сервисах с сохранением состояния сервисной структуры есть RunAsync (cancellationToken) с использованием () для транзакции диспетчера состояний.

Устаревший код, который я хочу реорганизовать, содержит две очереди с попытками удаления из очереди внутри while (true) с1 секунда задержкиЯ хотел бы избавиться от этой ненужной задержки и вместо этого использовать две отдельные реактивные очереди (семафоры с надежными очередями).

Проблема в том, что теперь два отдельных рабочих процесса, зависящих от этих двух очередей, необходимо разделить на двеотдельные потоки, потому что если эти две очереди выполняются в одном потоке, одна wait () заблокирует выполнение другого кода.(Я знаю, что, вероятно, лучшая практика разделит эти две задачи на два микросервиса, следующий проект.)

В качестве решения я придумал следующий код:

    protected override async Task RunAsync(CancellationToken cancellationToken)
    {
        await Task.WhenAll(AsyncTask1(cancellationToken), AsyncTask2(cancellationToken)).ConfigureAwait(false);
    }

И каждая задача содержит что-то вроде:

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();

        using (var tx = this.StateManager.CreateTransaction())
        {
            var maybeMessage = await messageQueue.TryDequeueAsync(tx, cancellationToken).ConfigureAwait(false);

            if (maybeMessage.HasValue)
            {
                DoWork();
            }

            await tx.CommitAsync().ConfigureAwait(false);
        }
    }

Кажется, работает, но я просто хочу убедиться, что использование (statemanger.createTansaction ()) нормально для использования таким параллельным способом ..

1 Ответ

0 голосов
/ 11 октября 2018

Согласно документации

В зависимости от роли реплики для однократной операции (например, TryDequeueAsync) ITransaction использует уровень изоляции Repeatable Read (когда основной ) или Снимок уровень изоляции (когда ** вторичный).


Повторяемое чтение

Любая операция повторного чтения по умолчанию принимает общие блокировки.

Снимок

Любая операция чтения, выполненная с использованием изоляции моментального снимка, не блокируется.


Таким образом, если DoWork не изменяет надежную коллекцию, то несколько транзакций могут быть выполнены параллельно без проблем.

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

...