Открыть список
Как стать автором
Обновить
19
Карма
0
Рейтинг

Пользователь

День, когда Dodo IS остановилась. Асинхронный сценарий

Да, совершенно верно, синхронные приложения так же имеют ряд проблем.
Пул потоков с точки зрения Concurrency играет еще одну злую шутку с приложением.
Поначалу он ограничивает конкурентность, но при накоплении запросов на обработку, начинает расти по «умному» алгоритму, там даже применяется примитивный Machine Learning.

Это значит, что пул сначала защищает приложение, отчасти выполняя роль Bulkhead, но через некоторое время эта защита снимается, и это никак нельзя проконтролировать, пул разрастается непомерно. Например, за 10 минут он может вырасти до 1200 threads. Кроме проблемы Concurrency, это приводит к проблеме см. предыдущую статью День, когда Dodo IS остановилась. Синхронный сценарий

День, когда Dodo IS остановилась. Асинхронный сценарий

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

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

День, когда Dodo IS остановилась. Синхронный сценарий

один и тот же объект меню ресторана, хранящийся в той же базе данных, что и заказы клиентов

День, когда Dodo IS остановилась. Синхронный сценарий

Это зависит от партнеров франчайзи, а не от разработчиков :) Попробуйте найти информацию на странице vk.com/dodofranchise

День, когда Dodo IS остановилась. Синхронный сценарий

это тестовый конфиг, для бенчмарка. конечно вы правы — не нужно одновременно в оба логгера писать. либо в синхронный, либо в асинхронный

День, когда Dodo IS остановилась. Синхронный сценарий

Асинхронный таргет NLog не означает одновременной попытки записывать что-либо в файл, да это и невозможно, файл здесь — последовательное устройство. То, что в NLog назывется асинхронной записью, на самом деле просто очередь, которая сбрасывается в файл через временные интервалы. Поэтому порядок сохраняется. Сами логи не нужно ускорять, и keepFileOpen ничего не прибавляет, потому что логи сбрасываются раз в несколько секунд. Скорость асинхронного лога становится в десятки раз больше, потому что на скорость в основном влияет не скорость записи на диск, а latency доступа к диску, то есть все упирается в количество обращений к диску.

День, когда Dodo IS остановилась. Синхронный сценарий

Конечно мы ждем улучшений когда привносим async, но конечный результат нужно тестировать, чтобы ответить на вопрос об «ускорении». Первый же, и самый очевидный результат, который можно предсказать без всякого тестирования, это то, что TPL привносит свой overhead, и не стоит его игнорировать.

День, когда Dodo IS остановилась. Синхронный сценарий

В случае с NLog — у него синхронный интерфейс, поэтому thread, выполняющий логирование будет ждать завершения метода, например Logger.Info, и проблема будет общей как для блокирующего кода, так и async/await. Конфигурация асинхронного логгера будет означать, что метод не будет ожидать записи в файл, а просто поставит сообщение в очередь. Это решает проблему и для блокирующего кода, и async/await. Пропускная способность логгера с такой конфигурацией возрастает в десятки раз.

Информация

В рейтинге
6,111-й
Работает в
Зарегистрирован
Активность