Разработанный для разработчиков на пересечении любопытства и профессионального роста, этот фундамент направлен на освещение того, как асинхронное программирование может повысить производительность приложений, масштабируемость и восприимчивость.
Это исследование предназначено для разработчиков программного обеспечения, желающих понять эффективность управления современным программным обеспечением без сложности технического жаргона.
Подумайте о том, как обработка запросов с одной нитью похожа на одностороннюю дорогу в оживленном городе: каждое запрос — это автомобиль, и когда есть только одна полоса, автомобили подготавливаются, вызывая задержки. но что, если наш город — наш сервис — мог бы управлять трафиком умнее?
Эта система обеспечивает плавный поток трафика, гарантируя, что ни один автомобиль (или задача) не будет ждать слишком долго, именно так асинхронное время работы поддерживает эффективную работу нашего программного обеспечения.
Давайте рассмотрим пример службы, которая синхронно завершает операции I/O. Для ясности эти операции отображаются вне основного потока исполнения в диаграмме:
Блокирование I/O во время стартовой фазы вашего сервиса может быть приемлемым, но избегать этого подхода при обработке внешних запросов целесообразно.
Эти примеры подчеркивают сценарии, в которых увеличение производительности сервера максимизируется. Тем не менее, преимущество неблокирующих операций сохраняется при любой частоте поступающих запросов.
Общее время, необходимое для обработки запроса (от первоначального запроса клиента до окончательного ответа, как изображено синим числом справа), неизменно уменьшится, при условии, что будет достаточно нитей для обработки всех запросов.
Затем мы сталкиваемся с практикой, которая может показаться противоречивой многим разработчикам.Когда операции I/O составляют значительную часть времени обработки запросов, оптимизация других сегментов кода может привести к незначительному улучшению.
Использование кэширования или базы данных в процессе может сократить время извлечения данных по сравнению с другими видами обработки.
Чтобы эффективно сегментировать код и облегчить выполнение звонков, можно указать время выполнения, чтобы перейти к следующему циклу цепи событий.
// блокирование звонков функции func1_cb(str, cb) { var res = func1(str); cb(res); } function func2_cb(str, cb) { var res = func2(str); cb(res); } // non-blocking callbacks function func1_cb(str, cb) { var res = func1(str); process.nextTick(function () { cb(res); }; } function func2_cb(str, cb) { var res = func2(str); } process.nextick(function () { cb(res); }); } // usage example function1_cb(content, function (str) function {2_cb(str, function (result { // work with result } }); }
// blocking callbacks function func1_cb(str, cb) { var res = func1(str); cb(res); } function func2_cb(str, cb) { var res = func2(str); cb(res); } // non-blocking callbacks function func1_cb(str, cb) { var res = func1(str); process.nextTick(function () { cb(res); }); } function func2_cb(str, cb) { var res = func2(str); process.nextTick(function () { cb(res); }); } // usage example func1_cb(content, function (str) { func2_cb(str, function (result) { // work with result }); });Приняв эту методологию, чтобы разделить две части расчетов, общее время обработки для сценариев с почти одновременными поступлениями запросов остается прежним.
Этот сценарий представляет собой наименее благоприятный результат при использовании стратегии «следующий клик». Как показано в первоначальном примере, метод «следующий клик» оказывается доброкачественным для редких запросов. Если запросы прибывают в умеренном темпе, использование этой техники повышает скорость обработки, позволяя инициировать новые запросы и начало операций, не блокирующих, перемещаться во время перерывов в выполнении.
В заключение, принятие неблокирующего I/O имеет решающее значение для повышения производительности приложений и является полезным в средах с редкими и тяжелыми объемами поступающих запросов.Кроме того, эффективное секвенирование потока исполнения — иллюстрируемое концепциями, похожими на технику «следующего ключа» — значительно улучшает эффективность сервера.