Журнал фильтра правок

Фильтры правок (обсуждение) — это автоматизированный механизм проверок правок участников.
(Список | Последние изменения фильтров | Изучение правок | Журнал срабатываний)
Перейти к навигации Перейти к поиску
Подробности записи журнала 3933521

17:05, 4 января 2024: 77 «Статейная категория» Alexraynepe196 (обсуждение | вклад) на странице Участник:Alexraynepe196/Патерн реактора, меры: Предупреждение (просмотреть)

Изменения, сделанные в правке

[[Шаблон проектирования|Шаблон проектирования программного обеспечения]] "'''реактор"''' - стратегия [[Событие (объектно-ориентированное программирование)|обработки событий]], которая может [[Параллелизм (информатика)|одновременно]] реагировать на множество потенциальных запросов на обслуживание. Ключевым компонентом шаблона является [[цикл событий]], работающий в ''одном'' [[Поток выполнения|потоке]] или [[Процесс (информатика)|процессе]], который [[Мультиплексирование|демультиплексирует]] входящие запросы и отправляет их нужному обработчику запросов. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}</ref>
[[Шаблон проектирования|Шаблон проектирования программного обеспечения]] "'''реактор"''' - стратегия [[Событие (объектно-ориентированное программирование)|обработки событий]], которая может [[Параллелизм (информатика)|одновременно]] реагировать на множество потенциальных запросов на обслуживание. Ключевым компонентом шаблона является [[цикл событий]], работающий в ''одном'' [[Поток выполнения|потоке]] или [[Процесс (информатика)|процессе]], который [[Мультиплексирование|демультиплексирует]] входящие запросы и отправляет их нужному обработчику запросов. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}</ref>


Полагаясь на механизмы, основанные на событиях, а не [[Асинхронный ввод-вывод|на блокирующий ввод-вывод]] или многопоточность, реактор может обрабатывать множество конкурентных запросов, граничащих с вводом-выводом, с минимальной задержкой. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref> Реактор также позволяет легко изменять или расширять отдельные процедуры обработки запросов, хотя этот шаблон имеет некоторые недостатки и ограничения. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref>
Полагаясь на механизмы, основанные на событиях, а не [[Асинхронный ввод-вывод|на блокирующий ввод-вывод]] или многопоточность, реактор может обрабатывать множество конкурентных запросов, граничащих с вводом-выводом, с минимальной задержкой. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref> Реактор также позволяет легко изменять или расширять отдельные процедуры обработки запросов, хотя этот шаблон имеет некоторые недостатки и ограничения. <ref name="Schmidt 1995" />


Благодаря балансу простоты и [[Масштабируемость|масштабируемости]] реактор стал центральным архитектурным элементом в нескольких [[Сервер (аппаратное обеспечение)|серверных]] приложениях и [[Фреймворк|фреймворков]] для [[Вычислительная сеть|работы в сети]] . Для особых случаев, когда необходима еще большая пропускная способность, производительность или сложность запроса, существуют производные - '''мультиреактор''' и проактор. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref>
Благодаря балансу простоты и [[Масштабируемость|масштабируемости]] реактор стал центральным архитектурным элементом в нескольких [[Сервер (аппаратное обеспечение)|серверных]] приложениях и [[Фреймворк|фреймворков]] для [[Вычислительная сеть|работы в сети]] . Для особых случаев, когда необходима еще большая пропускная способность, производительность или сложность запроса, существуют производные - '''мультиреактор''' и проактор. <ref name="Schmidt 1995"/><ref name="Devresse 2014" /><ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref>


== Обзор ==
== Обзор ==
Первоначальной мотивацией для шаблона реактора были практические соображения по [[Клиент — сервер|модели клиент-сервер]] в больших сетях, такие как [[C10k|проблема C10k]] для [[Веб-сервер|веб-серверов]].<ref name="Kegel 2014">{{Cite web|url=http://www.kegel.com/c10k.html|title=The C10k problem|author=Kegel|first=Dan|website=Dan Kegel's Web Hostel|date=5 February 2014|archive-url=https://web.archive.org/web/20230906022635/http://www.kegel.com/c10k.html|archive-date=6 September 2023|access-date=10 September 2023|url-status=live}}</ref>
Первоначальной мотивацией для шаблона реактора были практические соображения по [[Клиент — сервер|модели клиент-сервер]] в больших сетях, такие как [[C10k|проблема C10k]] для [[Веб-сервер|веб-серверов]].<ref name="Kegel 2014">{{Cite web|url=http://www.kegel.com/c10k.html|title=The C10k problem|author=Kegel|first=Dan|website=Dan Kegel's Web Hostel|date=5 February 2014|archive-url=https://web.archive.org/web/20230906022635/http://www.kegel.com/c10k.html|archive-date=6 September 2023|access-date=10 September 2023|url-status=live}}</ref>


Наивный подход к обработке запросов на обслуживание от многих потенциальных конечных точек, таких как [[Сокет (программный интерфейс)|сетевые сокеты]] или [[Файловый дескриптор|файловые дескрипторы]], заключается в прослушивании новых запросов из цикла событий, и немедленном чтении самого раннего запроса. Как только весь запрос будет прочитан, его можно обработать и переслать, напрямую вызвав соответствующий обработчик. Подобный полностью «итеративный» сервер, обрабатывающий один запрос от начала до конца за цикл событий, логически правилен. Однако он отстанет, если получит несколько запросов подряд. Итеративный подход не может масштабироваться, поскольку чтение запроса блокирует единственный поток сервера до тех пор, пока не будет получен полный запрос. А операции ввода-вывода обычно выполняются намного медленнее, чем другие вычисления. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref>
Наивный подход к обработке запросов на обслуживание от многих потенциальных конечных точек, таких как [[Сокет (программный интерфейс)|сетевые сокеты]] или [[Файловый дескриптор|файловые дескрипторы]], заключается в прослушивании новых запросов из цикла событий, и немедленном чтении самого раннего запроса. Как только весь запрос будет прочитан, его можно обработать и переслать, напрямую вызвав соответствующий обработчик. Подобный полностью «итеративный» сервер, обрабатывающий один запрос от начала до конца за цикл событий, логически правилен. Однако он отстанет, если получит несколько запросов подряд. Итеративный подход не может масштабироваться, поскольку чтение запроса блокирует единственный поток сервера до тех пор, пока не будет получен полный запрос. А операции ввода-вывода обычно выполняются намного медленнее, чем другие вычисления. <ref name="Devresse 2014" />


Одной из стратегий преодоления этого ограничения является многопоточность: за счет немедленного отделения каждого нового запроса в отдельный рабочий поток, первый запрос больше не будет блокировать цикл событий, который может немедленно завершить итерацию и обработать другой запрос. Такая конструкция «поток на соединение» масштабируется лучше, чем чисто итеративная, но она содержит свои ограничения. С точки зрения базовых системных ресурсов каждый новый поток или процесс требует дополнительных затрат [[Компьютерная память|памяти]] и времени обработки (из-за [[Переключение контекста|переключения контекста]] ). Фундаментальная неэффективность каждого потока, ожидающего завершения ввода-вывода, также не решена. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref>
Одной из стратегий преодоления этого ограничения является многопоточность: за счет немедленного отделения каждого нового запроса в отдельный рабочий поток, первый запрос больше не будет блокировать цикл событий, который может немедленно завершить итерацию и обработать другой запрос. Такая конструкция «поток на соединение» масштабируется лучше, чем чисто итеративная, но она содержит свои ограничения. С точки зрения базовых системных ресурсов каждый новый поток или процесс требует дополнительных затрат [[Компьютерная память|памяти]] и времени обработки (из-за [[Переключение контекста|переключения контекста]] ). Фундаментальная неэффективность каждого потока, ожидающего завершения ввода-вывода, также не решена. <ref name="Schmidt 1995" /><ref name="Devresse 2014"/>


С точки зрения проектирования, оба подхода тесно связывают общий демультиплексор с конкретными обработчиками запросов, что делает серверный код хрупким и утомительным для модификации. Эти соображения подсказывают несколько основных проектных подходов:
С точки зрения проектирования, оба подхода тесно связывают общий демультиплексор с конкретными обработчиками запросов, что делает серверный код хрупким и утомительным для модификации. Эти соображения подсказывают несколько основных проектных подходов:
# Зарегистрировать обработчики запросов как [[Callback (программирование)|обратные вызовы]] с обработчиком событий для лучшего [[Разделение ответственности|разделения задач.]]
# Зарегистрировать обработчики запросов как [[Callback (программирование)|обратные вызовы]] с обработчиком событий для лучшего [[Разделение ответственности|разделения задач.]]


Объединение этих идей ведет шаблону реактора, который сочетает в себе преимущества однопоточной обработки с высокой пропускной способностью и масштабируемостью. <ref name="Schmidt 1995"/> <ref name="Devresse 2014" />
Объединение этих идей ведет шаблону реактора, который сочетает в себе преимущества однопоточной обработки с высокой пропускной способностью и масштабируемостью. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref>

== Применение ==
== Применение ==
Шаблон реактора может стать хорошей отправной точкой для решения любой параллельной проблемы обработки событий. Этот шаблон также не ограничивается сетевыми сокетами; аппаратный ввод-вывод, доступ к [[Файловая система|файловой системе]] или [[База данных|базе данных]], [[Межпроцессное взаимодействие|меж-процессное взаимодействие]] и даже абстрактные системы [[Обмен сообщениями|передачи сообщений]] — все это возможные варианты использования. </link><sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">&#x5B; ''[[Википедия:О пользе ссылок|<span title="Seems straight-forward, but most sources emphasize network applications. (September 2023)">нужна цитата</span>]]'' &#x5D;</sup>
Шаблон реактора может стать хорошей отправной точкой для решения любой параллельной проблемы обработки событий. Этот шаблон также не ограничивается сетевыми сокетами; аппаратный ввод-вывод, доступ к [[Файловая система|файловой системе]] или [[База данных|базе данных]], [[Межпроцессное взаимодействие|меж-процессное взаимодействие]] и даже абстрактные системы [[Обмен сообщениями|передачи сообщений]] — все это возможные варианты использования. </link><sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">&#x5B; ''[[Википедия:О пользе ссылок|<span title="Seems straight-forward, but most sources emphasize network applications. (September 2023)">нужна цитата</span>]]'' &#x5D;</sup>


Однако у шаблона реактора есть ограничения, главным из которых является использование обратных вызовов, которые усложняют анализ и [[Отладка программы|отладку]] программы — проблема, характерная для проектов с [[Инверсия управления|инвертированным управлением]] . <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> Более простые подходы: «поток на соединение» и полностью итеративный подход, позволяют избежать этого и могут быть приемлемыми решениями, если не требуется масштабируемость или высокая пропускная способность. {{Efn|That said, a rule-of-thumb in software design is that if application demands can potentially increase past an assumed limit, one should expect that someday they will.}} </link>
Однако у шаблона реактора есть ограничения, главным из которых является использование обратных вызовов, которые усложняют анализ и [[Отладка программы|отладку]] программы — проблема, характерная для проектов с [[Инверсия управления|инвертированным управлением]] . <ref name="Schmidt 1995" /> Более простые подходы: «поток на соединение» и полностью итеративный подход, позволяют избежать этого и могут быть приемлемыми решениями, если не требуется масштабируемость или высокая пропускная способность. {{Efn| Практическое правило софто-строения говорит что если требования к приложению потенциально могут увеличить существующие и предполагаемые лимиты, можно ожидать что однажды так и будет.}} </link>


Однопоточность может стать недостатком в случаях требующих максимальной пропускной способности или когда запросы требуют значительной обработки. Преодолеть эти ограничения могут различные многопоточные конструкции. И фактически некоторые из них до сих пор используют шаблон реактора в качестве подкомпонента для обработки событий и ввода-вывода. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref>
Однопоточность может стать недостатком в случаях требующих максимальной пропускной способности или когда запросы требуют значительной обработки. Преодолеть эти ограничения могут различные многопоточные конструкции. И фактически некоторые из них до сих пор используют шаблон реактора в качестве подкомпонента для обработки событий и ввода-вывода. <ref name="Schmidt 1995" />


=== Приложения ===
=== Приложения ===


== Состав ==
== Состав ==
==Structure==
Реактивное приложение состоит из нескольких активных частей и опирается на некоторые механизмы поддержки: <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref>{{Глосс}}
<gallery>
Reactor Pattern - UML 2 Component Diagram.svg|alt=A reactor typically consists of 2 subsystems. Sockets (a.k.a. handles) and a demultiplexer (like select or epoll) are typically provided by the system. The reactive application will provide a dispatcher / event-loop that reacts to handle events by invoking handlers, which are registered as callbacks.|UML 2 component diagram of a reactive application.<ref name="Schmidt 1995" />
ReactorPattern - UML 2 Sequence Diagram.svg|alt=Before starting the event loop, a reactive application will typically register handles & handlers for specific requests. The event loop will then respond to request-based events by invoking a handler, passing the handle for processing.|UML 2 sequence diagram of a reactive server.<ref name="Schmidt 1995" />
</gallery>

Реактивное приложение состоит из нескольких активных частей и опирается на некоторые механизмы поддержки: <ref name="Schmidt 1995" /> {{Глосс}}
{{Терм|Handle}}
{{Терм|Handle}}
{{Опр|Идентификатор и интерфейс к экземпляра запроса с IO и данными. Обычно представлен в форме сокета, файлового дескриптора, или похожего механизма предоставляемого большинством современных ОС.}}
{{Опр|Идентификатор и интерфейс к экземпляра запроса с IO и данными. Обычно представлен в форме сокета, файлового дескриптора, или похожего механизма предоставляемого большинством современных ОС.}}
Стандартной модели реактора достаточно для многих приложений, но для особенно требовательных случаев можно обеспечить еще большую мощность за счет дополнительной сложности.
Стандартной модели реактора достаточно для многих приложений, но для особенно требовательных случаев можно обеспечить еще большую мощность за счет дополнительной сложности.


Одна из основных модификаций — вызывать обработчики событий в их собственных потоках для большей параллелизма. Запуск обработчиков в пуле потоков вместо запуска новых потоков по мере необходимости еще больше упростит многопоточность и минимизирует накладные расходы. Т. о. пул потоков - естественное дополнение шаблона реактора во многих случаях использования. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref>
Одна из основных модификаций — вызывать обработчики событий в их собственных потоках для большей параллелизма. Запуск обработчиков в пуле потоков вместо запуска новых потоков по мере необходимости еще больше упростит многопоточность и минимизирует накладные расходы. Т. о. пул потоков - естественное дополнение шаблона реактора во многих случаях использования. <ref name="Devresse 2014"/>


Другой способ максимизировать пропускную способность — частично воспроизвести подход сервера «поток на соединение» с размножаемыми параллельными диспетчерами/циклами событий. Однако вместо количества соединений можно настроить количество диспетчеров, чтобы оно соответствовало доступным [[Многоядерный процессор|ядрам ЦП]] базового оборудования.
Другой способ максимизировать пропускную способность — частично воспроизвести подход сервера «поток на соединение» с размножаемыми параллельными диспетчерами/циклами событий. Однако вместо количества соединений можно настроить количество диспетчеров, чтобы оно соответствовало доступным [[Многоядерный процессор|ядрам ЦП]] базового оборудования.


Этот вариант известен как мультиреактор. Он гарантирует, что выделенный сервер полностью использует вычислительную мощность оборудования. Поскольку отдельные потоки представляют собой долгоживущие циклы событий, накладные расходы на создание и уничтожение потоков ограничиваются запуском и завершением работы сервера. Поскольку запросы распределяются между независимыми диспетчерами, мультиреактор также обеспечивает лучшую доступность и надежность; в случае возникновения ошибки и сбоя одного диспетчера он будет прерывать только запросы, выделенные этому циклу событий. <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFEscoffierFinnegan2021">Escoffier, Clement; Finnegan, Ken (November 2021). <span class="cs1-lock-registration" title="Free registration required">[https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html "Chapter 4. Design Principles of Reactive Systems"]</span>. ''Reactive Systems in Java''. O'Reilly Media. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9781492091721|<bdi>9781492091721</bdi>]].</cite></ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFGarrett2015">Garrett, Owen (10 June 2015). [https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/ "Inside NGINX: How We Designed for Performance & Scale"]. ''NGINX''. F5, Inc. [https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/ Archived] from the original on 20 August 2023<span class="reference-accessdate">. Retrieved <span class="nowrap">10 September</span> 2023</span>.</cite></ref>
Этот вариант известен как мультиреактор. Он гарантирует, что выделенный сервер полностью использует вычислительную мощность оборудования. Поскольку отдельные потоки представляют собой долгоживущие циклы событий, накладные расходы на создание и уничтожение потоков ограничиваются запуском и завершением работы сервера. Поскольку запросы распределяются между независимыми диспетчерами, мультиреактор также обеспечивает лучшую доступность и надежность; в случае возникновения ошибки и сбоя одного диспетчера он будет прерывать только запросы, выделенные этому циклу событий. <ref name="Escoffier 2021"/> <ref name="Garrett 2015"/>


Для особенно сложных сервисов, одновременно требующих синхронности и асинхронности, еще одной альтернативой является шаблон проактора. Этот шаблон более сложен, чем реактор, со своими инженерными деталями, но он по-прежнему использует подкомпонент реактора для решения проблемы блокировки ввода-вывода. <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFEscoffierFinnegan2021">Escoffier, Clement; Finnegan, Ken (November 2021). <span class="cs1-lock-registration" title="Free registration required">[https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html "Chapter 4. Design Principles of Reactive Systems"]</span>. ''Reactive Systems in Java''. O'Reilly Media. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9781492091721|<bdi>9781492091721</bdi>]].</cite></ref>
Для особенно сложных сервисов, одновременно требующих синхронности и асинхронности, еще одной альтернативой является шаблон проактора. Этот шаблон более сложен, чем реактор, со своими инженерными деталями, но он по-прежнему использует подкомпонент реактора для решения проблемы блокировки ввода-вывода. <ref name="Escoffier 2021"/>


== Смотрите также ==
== Смотрите также ==
[[Категория:Шаблоны проектирования]]
[[Категория:Шаблоны проектирования]]
[[Категория:Параллельные вычисления]]
[[Категория:Параллельные вычисления]]
[[Категория:Страницы с непроверенными переводами]]</nowiki>
[[Категория:Страницы с непроверенными переводами]]
[[Category:Concurrent computing]]
[[Category:Software design patterns]]
</nowiki>

Параметры действия

ПеременнаяЗначение
Число правок участника (user_editcount)
42
Имя учётной записи (user_name)
'Alexraynepe196'
Время подтверждения адреса эл. почты (user_emailconfirm)
'20111110183846'
Возраст учётной записи (user_age)
383438999
Группы (включая неявные) в которых состоит участник (user_groups)
[ 0 => 'uploader', 1 => '*', 2 => 'user', 3 => 'autoconfirmed' ]
Права, которые есть у участника (user_rights)
[ 0 => 'upload', 1 => 'reupload-own', 2 => 'reupload', 3 => 'createaccount', 4 => 'read', 5 => 'edit', 6 => 'createpage', 7 => 'createtalk', 8 => 'writeapi', 9 => 'viewmyprivateinfo', 10 => 'editmyprivateinfo', 11 => 'editmyoptions', 12 => 'abusefilter-log-detail', 13 => 'urlshortener-create-url', 14 => 'centralauth-merge', 15 => 'abusefilter-view', 16 => 'abusefilter-log', 17 => 'vipsscaler-test', 18 => 'move-rootuserpages', 19 => 'minoredit', 20 => 'editmyusercss', 21 => 'editmyuserjson', 22 => 'editmyuserjs', 23 => 'sendemail', 24 => 'applychangetags', 25 => 'viewmywatchlist', 26 => 'editmywatchlist', 27 => 'spamblacklistlog', 28 => 'mwoauthmanagemygrants', 29 => 'move', 30 => 'collectionsaveasuserpage', 31 => 'autoconfirmed', 32 => 'editsemiprotected', 33 => 'skipcaptcha', 34 => 'ipinfo', 35 => 'ipinfo-view-basic', 36 => 'transcode-reset', 37 => 'transcode-status', 38 => 'movestable' ]
Редактирует ли пользователь через мобильное приложение (user_app)
false
Редактирует ли участник через мобильный интерфейс (user_mobile)
false
Глобальные группы участника (global_user_groups)
[]
Global edit count of the user (global_user_editcount)
45
ID страницы (page_id)
10475075
Пространство имён страницы (page_namespace)
2
Название страницы (без пространства имён) (page_title)
'Alexraynepe196/Патерн реактора'
Полное название страницы (page_prefixedtitle)
'Участник:Alexraynepe196/Патерн реактора'
Последние десять редакторов страницы (page_recent_contributors)
[ 0 => 'Alexraynepe196' ]
Возраст страницы (в секундах) (page_age)
2266
Действие (action)
'edit'
Описание правки/причина (summary)
''
Старая модель содержимого (old_content_model)
'wikitext'
Новая модель содержимого (new_content_model)
'wikitext'
Вики-текст старой страницы до правки (old_wikitext)
'[[Шаблон проектирования|Шаблон проектирования программного обеспечения]] "'''реактор"''' - стратегия [[Событие (объектно-ориентированное программирование)|обработки событий]], которая может [[Параллелизм (информатика)|одновременно]] реагировать на множество потенциальных запросов на обслуживание. Ключевым компонентом шаблона является [[цикл событий]], работающий в ''одном'' [[Поток выполнения|потоке]] или [[Процесс (информатика)|процессе]], который [[Мультиплексирование|демультиплексирует]] входящие запросы и отправляет их нужному обработчику запросов. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}</ref> Полагаясь на механизмы, основанные на событиях, а не [[Асинхронный ввод-вывод|на блокирующий ввод-вывод]] или многопоточность, реактор может обрабатывать множество конкурентных запросов, граничащих с вводом-выводом, с минимальной задержкой. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref> Реактор также позволяет легко изменять или расширять отдельные процедуры обработки запросов, хотя этот шаблон имеет некоторые недостатки и ограничения. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> Благодаря балансу простоты и [[Масштабируемость|масштабируемости]] реактор стал центральным архитектурным элементом в нескольких [[Сервер (аппаратное обеспечение)|серверных]] приложениях и [[Фреймворк|фреймворков]] для [[Вычислительная сеть|работы в сети]] . Для особых случаев, когда необходима еще большая пропускная способность, производительность или сложность запроса, существуют производные - '''мультиреактор''' и проактор. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref> == Обзор == Первоначальной мотивацией для шаблона реактора были практические соображения по [[Клиент — сервер|модели клиент-сервер]] в больших сетях, такие как [[C10k|проблема C10k]] для [[Веб-сервер|веб-серверов]].<ref name="Kegel 2014">{{Cite web|url=http://www.kegel.com/c10k.html|title=The C10k problem|author=Kegel|first=Dan|website=Dan Kegel's Web Hostel|date=5 February 2014|archive-url=https://web.archive.org/web/20230906022635/http://www.kegel.com/c10k.html|archive-date=6 September 2023|access-date=10 September 2023|url-status=live}}</ref> Наивный подход к обработке запросов на обслуживание от многих потенциальных конечных точек, таких как [[Сокет (программный интерфейс)|сетевые сокеты]] или [[Файловый дескриптор|файловые дескрипторы]], заключается в прослушивании новых запросов из цикла событий, и немедленном чтении самого раннего запроса. Как только весь запрос будет прочитан, его можно обработать и переслать, напрямую вызвав соответствующий обработчик. Подобный полностью «итеративный» сервер, обрабатывающий один запрос от начала до конца за цикл событий, логически правилен. Однако он отстанет, если получит несколько запросов подряд. Итеративный подход не может масштабироваться, поскольку чтение запроса блокирует единственный поток сервера до тех пор, пока не будет получен полный запрос. А операции ввода-вывода обычно выполняются намного медленнее, чем другие вычисления. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> Одной из стратегий преодоления этого ограничения является многопоточность: за счет немедленного отделения каждого нового запроса в отдельный рабочий поток, первый запрос больше не будет блокировать цикл событий, который может немедленно завершить итерацию и обработать другой запрос. Такая конструкция «поток на соединение» масштабируется лучше, чем чисто итеративная, но она содержит свои ограничения. С точки зрения базовых системных ресурсов каждый новый поток или процесс требует дополнительных затрат [[Компьютерная память|памяти]] и времени обработки (из-за [[Переключение контекста|переключения контекста]] ). Фундаментальная неэффективность каждого потока, ожидающего завершения ввода-вывода, также не решена. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> С точки зрения проектирования, оба подхода тесно связывают общий демультиплексор с конкретными обработчиками запросов, что делает серверный код хрупким и утомительным для модификации. Эти соображения подсказывают несколько основных проектных подходов: # Оставить однопоточный обработчик событий; многопоточность приводит к накладным расходам и сложности, не решая реальную проблему блокировки ввода-вывода. # Использовать механизм уведомления о событиях для демультиплексирования запросов только ''после'' завершения ввода-вывода (чтобы ввод-вывод фактически не блокировался). # Зарегистрировать обработчики запросов как [[Callback (программирование)|обратные вызовы]] с обработчиком событий для лучшего [[Разделение ответственности|разделения задач.]] Объединение этих идей ведет шаблону реактора, который сочетает в себе преимущества однопоточной обработки с высокой пропускной способностью и масштабируемостью. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> == Применение == Шаблон реактора может стать хорошей отправной точкой для решения любой параллельной проблемы обработки событий. Этот шаблон также не ограничивается сетевыми сокетами; аппаратный ввод-вывод, доступ к [[Файловая система|файловой системе]] или [[База данных|базе данных]], [[Межпроцессное взаимодействие|меж-процессное взаимодействие]] и даже абстрактные системы [[Обмен сообщениями|передачи сообщений]] — все это возможные варианты использования. </link><sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">&#x5B; ''[[Википедия:О пользе ссылок|<span title="Seems straight-forward, but most sources emphasize network applications. (September 2023)">нужна цитата</span>]]'' &#x5D;</sup> Однако у шаблона реактора есть ограничения, главным из которых является использование обратных вызовов, которые усложняют анализ и [[Отладка программы|отладку]] программы — проблема, характерная для проектов с [[Инверсия управления|инвертированным управлением]] . <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> Более простые подходы: «поток на соединение» и полностью итеративный подход, позволяют избежать этого и могут быть приемлемыми решениями, если не требуется масштабируемость или высокая пропускная способность. {{Efn|That said, a rule-of-thumb in software design is that if application demands can potentially increase past an assumed limit, one should expect that someday they will.}} </link> Однопоточность может стать недостатком в случаях требующих максимальной пропускной способности или когда запросы требуют значительной обработки. Преодолеть эти ограничения могут различные многопоточные конструкции. И фактически некоторые из них до сих пор используют шаблон реактора в качестве подкомпонента для обработки событий и ввода-вывода. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> === Приложения === Шаблон реактора (или его вариант) нашел место во многих веб-серверах, [[Сервер приложений|серверах приложений]] и сетевых платформах: * Adaptive Communication Environment<ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}</ref> * EventMachine  * Netty<ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> * [[Nginx]]<ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref> * [[Node.js]]<ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref><ref name="Bonér 2022">{{Cite web|url=https://www.reactiveprinciples.org/patterns/isolate-mutations.html|title=The Reactive Patterns: 3. Isolate Mutations|author=Bonér|first=Jonas|website=The Reactive Principles|date=15 June 2022|access-date=20 September 2023}}</ref> * Perl Object Environment  * [[POCO (коллекция библиотек классов C++)|POCO C++ Libraries]]<ref name="POCO Network Programming">{{Cite web|url=https://pocoproject.org/slides/200-Network.pdf|title=Network Programming: Writing network and internet applications|website=POCO Project|date=2010|pages=21–22|publisher=Applied Informatics Software Engineering GmbH|access-date=20 September 2023}}</ref> * [[Spring Framework]] (version 5 and later)<ref name="Stoyanchev 2016">{{Cite web|url=https://spring.io/blog/2016/02/09/reactive-spring|title=Reactive Spring|author=Stoyanchev|first=Rossen|website=Spring.io|date=9 February 2016|access-date=20 September 2023}}</ref> * [[Twisted]]  * [[Vert.x]]<ref name="Escoffier 2021" /> == Состав == Реактивное приложение состоит из нескольких активных частей и опирается на некоторые механизмы поддержки: <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref>{{Глосс}} {{Терм|Handle}} {{Опр|Идентификатор и интерфейс к экземпляра запроса с IO и данными. Обычно представлен в форме сокета, файлового дескриптора, или похожего механизма предоставляемого большинством современных ОС.}} {{Терм|Demultiplexer}} {{Опр|Извещатель событий, который может эффективно наблюдать "статус" хендлов, и извещать суб-системы о изменениях "статуса" (типичное - что хендл-IO стал "готов к чтению"). Исторически эта роль заполнялась [[select (Unix)|select() system call]], или более современные примеры включают [[epoll]], [[kqueue]], and [[IOCP]].}} {{Терм|Dispatcher}} {{Опр|Цикл обработки событий реактивного приложения. Этот компонент управляет регистраций обработчиков событий, которые вызываются на появление соответствующего события.}} {{Терм|Event Handler}} {{Опр|Обработчик запросов, реализует логику обработки специфическую для каждого типа запросов. Паттерн реактора полагается на динамическую регистрацию его диспетчере в виде обратных вызовов, для большей гибкости. По умолчанию, реактор не использует мульти-поточность, но вызывает обработчик запроса в нитке диспетчера.}} {{Терм|Event Handler Interface}} {{Опр|Абстрактный класс-интерфейс, предоставляет основные свойства и методы обработчика события. Конкретный обработчик реализует интерфейс, а диспетчер посредством его оперирует обработчиком события.}} {{Конец-глосс}} == Варианты == Стандартной модели реактора достаточно для многих приложений, но для особенно требовательных случаев можно обеспечить еще большую мощность за счет дополнительной сложности. Одна из основных модификаций — вызывать обработчики событий в их собственных потоках для большей параллелизма. Запуск обработчиков в пуле потоков вместо запуска новых потоков по мере необходимости еще больше упростит многопоточность и минимизирует накладные расходы. Т. о. пул потоков - естественное дополнение шаблона реактора во многих случаях использования. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> Другой способ максимизировать пропускную способность — частично воспроизвести подход сервера «поток на соединение» с размножаемыми параллельными диспетчерами/циклами событий. Однако вместо количества соединений можно настроить количество диспетчеров, чтобы оно соответствовало доступным [[Многоядерный процессор|ядрам ЦП]] базового оборудования. Этот вариант известен как мультиреактор. Он гарантирует, что выделенный сервер полностью использует вычислительную мощность оборудования. Поскольку отдельные потоки представляют собой долгоживущие циклы событий, накладные расходы на создание и уничтожение потоков ограничиваются запуском и завершением работы сервера. Поскольку запросы распределяются между независимыми диспетчерами, мультиреактор также обеспечивает лучшую доступность и надежность; в случае возникновения ошибки и сбоя одного диспетчера он будет прерывать только запросы, выделенные этому циклу событий. <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFEscoffierFinnegan2021">Escoffier, Clement; Finnegan, Ken (November 2021). <span class="cs1-lock-registration" title="Free registration required">[https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html "Chapter 4. Design Principles of Reactive Systems"]</span>. ''Reactive Systems in Java''. O'Reilly Media. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9781492091721|<bdi>9781492091721</bdi>]].</cite></ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFGarrett2015">Garrett, Owen (10 June 2015). [https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/ "Inside NGINX: How We Designed for Performance & Scale"]. ''NGINX''. F5, Inc. [https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/ Archived] from the original on 20 August 2023<span class="reference-accessdate">. Retrieved <span class="nowrap">10 September</span> 2023</span>.</cite></ref> Для особенно сложных сервисов, одновременно требующих синхронности и асинхронности, еще одной альтернативой является шаблон проактора. Этот шаблон более сложен, чем реактор, со своими инженерными деталями, но он по-прежнему использует подкомпонент реактора для решения проблемы блокировки ввода-вывода. <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFEscoffierFinnegan2021">Escoffier, Clement; Finnegan, Ken (November 2021). <span class="cs1-lock-registration" title="Free registration required">[https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html "Chapter 4. Design Principles of Reactive Systems"]</span>. ''Reactive Systems in Java''. O'Reilly Media. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9781492091721|<bdi>9781492091721</bdi>]].</cite></ref> == Смотрите также == * [[C10k|Проблема с C10k]] * [[Событийно-ориентированное программирование|Программирование, управляемое событиями]] * [[Ввод-вывод|Ввод, вывод]] * libevent * [[Реактивное программирование]] '''Связанные шаблоны:''' * [[Активный объект (шаблон проектирования)|Активный объект]] * [[Наблюдатель (шаблон проектирования)|Шаблон наблюдателя]] * Шаблон Proactor, который позволяет смешивать синхронную и асинхронную обработку событий. == Примечания == <references group="lower-alpha" responsive="1"></references> == Ссылки == {{Примечания}} == Внешние ссылки == '''Конкретные приложения:''' * {{Cite book|автор=Alexeev|first=Andrew|ответственный=Brown|ответственный2=Wilson|часть=Chapter 14: nginx|ссылка часть=https://aosabook.org/en/v2/nginx.html|заглавие=The Architecture of Open Source Applications|издательство=Lulu.com|date=30 March 2012|volume=2|isbn=9781105571817}} '''Примеры реализации:''' * [http://www.ddj.com/cpp/193101548 Сеть APR и патерн реактора] * [https://web.archive.org/web/20100726184112/http://today.java.net/article/2007/02/08/architecture-highly-scalable-nio-based-server Архитектура высокомасштабируемого сервера на базе NIO] <nowiki> [[Категория:Шаблоны проектирования]] [[Категория:Параллельные вычисления]] [[Категория:Страницы с непроверенными переводами]]</nowiki>'
Вики-текст новой страницы после правки (new_wikitext)
'[[Шаблон проектирования|Шаблон проектирования программного обеспечения]] "'''реактор"''' - стратегия [[Событие (объектно-ориентированное программирование)|обработки событий]], которая может [[Параллелизм (информатика)|одновременно]] реагировать на множество потенциальных запросов на обслуживание. Ключевым компонентом шаблона является [[цикл событий]], работающий в ''одном'' [[Поток выполнения|потоке]] или [[Процесс (информатика)|процессе]], который [[Мультиплексирование|демультиплексирует]] входящие запросы и отправляет их нужному обработчику запросов. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}</ref> Полагаясь на механизмы, основанные на событиях, а не [[Асинхронный ввод-вывод|на блокирующий ввод-вывод]] или многопоточность, реактор может обрабатывать множество конкурентных запросов, граничащих с вводом-выводом, с минимальной задержкой. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref> Реактор также позволяет легко изменять или расширять отдельные процедуры обработки запросов, хотя этот шаблон имеет некоторые недостатки и ограничения. <ref name="Schmidt 1995" /> Благодаря балансу простоты и [[Масштабируемость|масштабируемости]] реактор стал центральным архитектурным элементом в нескольких [[Сервер (аппаратное обеспечение)|серверных]] приложениях и [[Фреймворк|фреймворков]] для [[Вычислительная сеть|работы в сети]] . Для особых случаев, когда необходима еще большая пропускная способность, производительность или сложность запроса, существуют производные - '''мультиреактор''' и проактор. <ref name="Schmidt 1995"/><ref name="Devresse 2014" /><ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref> == Обзор == Первоначальной мотивацией для шаблона реактора были практические соображения по [[Клиент — сервер|модели клиент-сервер]] в больших сетях, такие как [[C10k|проблема C10k]] для [[Веб-сервер|веб-серверов]].<ref name="Kegel 2014">{{Cite web|url=http://www.kegel.com/c10k.html|title=The C10k problem|author=Kegel|first=Dan|website=Dan Kegel's Web Hostel|date=5 February 2014|archive-url=https://web.archive.org/web/20230906022635/http://www.kegel.com/c10k.html|archive-date=6 September 2023|access-date=10 September 2023|url-status=live}}</ref> Наивный подход к обработке запросов на обслуживание от многих потенциальных конечных точек, таких как [[Сокет (программный интерфейс)|сетевые сокеты]] или [[Файловый дескриптор|файловые дескрипторы]], заключается в прослушивании новых запросов из цикла событий, и немедленном чтении самого раннего запроса. Как только весь запрос будет прочитан, его можно обработать и переслать, напрямую вызвав соответствующий обработчик. Подобный полностью «итеративный» сервер, обрабатывающий один запрос от начала до конца за цикл событий, логически правилен. Однако он отстанет, если получит несколько запросов подряд. Итеративный подход не может масштабироваться, поскольку чтение запроса блокирует единственный поток сервера до тех пор, пока не будет получен полный запрос. А операции ввода-вывода обычно выполняются намного медленнее, чем другие вычисления. <ref name="Devresse 2014" /> Одной из стратегий преодоления этого ограничения является многопоточность: за счет немедленного отделения каждого нового запроса в отдельный рабочий поток, первый запрос больше не будет блокировать цикл событий, который может немедленно завершить итерацию и обработать другой запрос. Такая конструкция «поток на соединение» масштабируется лучше, чем чисто итеративная, но она содержит свои ограничения. С точки зрения базовых системных ресурсов каждый новый поток или процесс требует дополнительных затрат [[Компьютерная память|памяти]] и времени обработки (из-за [[Переключение контекста|переключения контекста]] ). Фундаментальная неэффективность каждого потока, ожидающего завершения ввода-вывода, также не решена. <ref name="Schmidt 1995" /><ref name="Devresse 2014"/> С точки зрения проектирования, оба подхода тесно связывают общий демультиплексор с конкретными обработчиками запросов, что делает серверный код хрупким и утомительным для модификации. Эти соображения подсказывают несколько основных проектных подходов: # Оставить однопоточный обработчик событий; многопоточность приводит к накладным расходам и сложности, не решая реальную проблему блокировки ввода-вывода. # Использовать механизм уведомления о событиях для демультиплексирования запросов только ''после'' завершения ввода-вывода (чтобы ввод-вывод фактически не блокировался). # Зарегистрировать обработчики запросов как [[Callback (программирование)|обратные вызовы]] с обработчиком событий для лучшего [[Разделение ответственности|разделения задач.]] Объединение этих идей ведет шаблону реактора, который сочетает в себе преимущества однопоточной обработки с высокой пропускной способностью и масштабируемостью. <ref name="Schmidt 1995"/> <ref name="Devresse 2014" /> == Применение == Шаблон реактора может стать хорошей отправной точкой для решения любой параллельной проблемы обработки событий. Этот шаблон также не ограничивается сетевыми сокетами; аппаратный ввод-вывод, доступ к [[Файловая система|файловой системе]] или [[База данных|базе данных]], [[Межпроцессное взаимодействие|меж-процессное взаимодействие]] и даже абстрактные системы [[Обмен сообщениями|передачи сообщений]] — все это возможные варианты использования. </link><sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">&#x5B; ''[[Википедия:О пользе ссылок|<span title="Seems straight-forward, but most sources emphasize network applications. (September 2023)">нужна цитата</span>]]'' &#x5D;</sup> Однако у шаблона реактора есть ограничения, главным из которых является использование обратных вызовов, которые усложняют анализ и [[Отладка программы|отладку]] программы — проблема, характерная для проектов с [[Инверсия управления|инвертированным управлением]] . <ref name="Schmidt 1995" /> Более простые подходы: «поток на соединение» и полностью итеративный подход, позволяют избежать этого и могут быть приемлемыми решениями, если не требуется масштабируемость или высокая пропускная способность. {{Efn| Практическое правило софто-строения говорит что если требования к приложению потенциально могут увеличить существующие и предполагаемые лимиты, можно ожидать что однажды так и будет.}} </link> Однопоточность может стать недостатком в случаях требующих максимальной пропускной способности или когда запросы требуют значительной обработки. Преодолеть эти ограничения могут различные многопоточные конструкции. И фактически некоторые из них до сих пор используют шаблон реактора в качестве подкомпонента для обработки событий и ввода-вывода. <ref name="Schmidt 1995" /> === Приложения === Шаблон реактора (или его вариант) нашел место во многих веб-серверах, [[Сервер приложений|серверах приложений]] и сетевых платформах: * Adaptive Communication Environment<ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}</ref> * EventMachine  * Netty<ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> * [[Nginx]]<ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref> * [[Node.js]]<ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref><ref name="Bonér 2022">{{Cite web|url=https://www.reactiveprinciples.org/patterns/isolate-mutations.html|title=The Reactive Patterns: 3. Isolate Mutations|author=Bonér|first=Jonas|website=The Reactive Principles|date=15 June 2022|access-date=20 September 2023}}</ref> * Perl Object Environment  * [[POCO (коллекция библиотек классов C++)|POCO C++ Libraries]]<ref name="POCO Network Programming">{{Cite web|url=https://pocoproject.org/slides/200-Network.pdf|title=Network Programming: Writing network and internet applications|website=POCO Project|date=2010|pages=21–22|publisher=Applied Informatics Software Engineering GmbH|access-date=20 September 2023}}</ref> * [[Spring Framework]] (version 5 and later)<ref name="Stoyanchev 2016">{{Cite web|url=https://spring.io/blog/2016/02/09/reactive-spring|title=Reactive Spring|author=Stoyanchev|first=Rossen|website=Spring.io|date=9 February 2016|access-date=20 September 2023}}</ref> * [[Twisted]]  * [[Vert.x]]<ref name="Escoffier 2021" /> == Состав == ==Structure== <gallery> Reactor Pattern - UML 2 Component Diagram.svg|alt=A reactor typically consists of 2 subsystems. Sockets (a.k.a. handles) and a demultiplexer (like select or epoll) are typically provided by the system. The reactive application will provide a dispatcher / event-loop that reacts to handle events by invoking handlers, which are registered as callbacks.|UML 2 component diagram of a reactive application.<ref name="Schmidt 1995" /> ReactorPattern - UML 2 Sequence Diagram.svg|alt=Before starting the event loop, a reactive application will typically register handles & handlers for specific requests. The event loop will then respond to request-based events by invoking a handler, passing the handle for processing.|UML 2 sequence diagram of a reactive server.<ref name="Schmidt 1995" /> </gallery> Реактивное приложение состоит из нескольких активных частей и опирается на некоторые механизмы поддержки: <ref name="Schmidt 1995" /> {{Глосс}} {{Терм|Handle}} {{Опр|Идентификатор и интерфейс к экземпляра запроса с IO и данными. Обычно представлен в форме сокета, файлового дескриптора, или похожего механизма предоставляемого большинством современных ОС.}} {{Терм|Demultiplexer}} {{Опр|Извещатель событий, который может эффективно наблюдать "статус" хендлов, и извещать суб-системы о изменениях "статуса" (типичное - что хендл-IO стал "готов к чтению"). Исторически эта роль заполнялась [[select (Unix)|select() system call]], или более современные примеры включают [[epoll]], [[kqueue]], and [[IOCP]].}} {{Терм|Dispatcher}} {{Опр|Цикл обработки событий реактивного приложения. Этот компонент управляет регистраций обработчиков событий, которые вызываются на появление соответствующего события.}} {{Терм|Event Handler}} {{Опр|Обработчик запросов, реализует логику обработки специфическую для каждого типа запросов. Паттерн реактора полагается на динамическую регистрацию его диспетчере в виде обратных вызовов, для большей гибкости. По умолчанию, реактор не использует мульти-поточность, но вызывает обработчик запроса в нитке диспетчера.}} {{Терм|Event Handler Interface}} {{Опр|Абстрактный класс-интерфейс, предоставляет основные свойства и методы обработчика события. Конкретный обработчик реализует интерфейс, а диспетчер посредством его оперирует обработчиком события.}} {{Конец-глосс}} == Варианты == Стандартной модели реактора достаточно для многих приложений, но для особенно требовательных случаев можно обеспечить еще большую мощность за счет дополнительной сложности. Одна из основных модификаций — вызывать обработчики событий в их собственных потоках для большей параллелизма. Запуск обработчиков в пуле потоков вместо запуска новых потоков по мере необходимости еще больше упростит многопоточность и минимизирует накладные расходы. Т. о. пул потоков - естественное дополнение шаблона реактора во многих случаях использования. <ref name="Devresse 2014"/> Другой способ максимизировать пропускную способность — частично воспроизвести подход сервера «поток на соединение» с размножаемыми параллельными диспетчерами/циклами событий. Однако вместо количества соединений можно настроить количество диспетчеров, чтобы оно соответствовало доступным [[Многоядерный процессор|ядрам ЦП]] базового оборудования. Этот вариант известен как мультиреактор. Он гарантирует, что выделенный сервер полностью использует вычислительную мощность оборудования. Поскольку отдельные потоки представляют собой долгоживущие циклы событий, накладные расходы на создание и уничтожение потоков ограничиваются запуском и завершением работы сервера. Поскольку запросы распределяются между независимыми диспетчерами, мультиреактор также обеспечивает лучшую доступность и надежность; в случае возникновения ошибки и сбоя одного диспетчера он будет прерывать только запросы, выделенные этому циклу событий. <ref name="Escoffier 2021"/> <ref name="Garrett 2015"/> Для особенно сложных сервисов, одновременно требующих синхронности и асинхронности, еще одной альтернативой является шаблон проактора. Этот шаблон более сложен, чем реактор, со своими инженерными деталями, но он по-прежнему использует подкомпонент реактора для решения проблемы блокировки ввода-вывода. <ref name="Escoffier 2021"/> == Смотрите также == * [[C10k|Проблема с C10k]] * [[Событийно-ориентированное программирование|Программирование, управляемое событиями]] * [[Ввод-вывод|Ввод, вывод]] * libevent * [[Реактивное программирование]] '''Связанные шаблоны:''' * [[Активный объект (шаблон проектирования)|Активный объект]] * [[Наблюдатель (шаблон проектирования)|Шаблон наблюдателя]] * Шаблон Proactor, который позволяет смешивать синхронную и асинхронную обработку событий. == Примечания == <references group="lower-alpha" responsive="1"></references> == Ссылки == {{Примечания}} == Внешние ссылки == '''Конкретные приложения:''' * {{Cite book|автор=Alexeev|first=Andrew|ответственный=Brown|ответственный2=Wilson|часть=Chapter 14: nginx|ссылка часть=https://aosabook.org/en/v2/nginx.html|заглавие=The Architecture of Open Source Applications|издательство=Lulu.com|date=30 March 2012|volume=2|isbn=9781105571817}} '''Примеры реализации:''' * [http://www.ddj.com/cpp/193101548 Сеть APR и патерн реактора] * [https://web.archive.org/web/20100726184112/http://today.java.net/article/2007/02/08/architecture-highly-scalable-nio-based-server Архитектура высокомасштабируемого сервера на базе NIO] <nowiki> [[Категория:Шаблоны проектирования]] [[Категория:Параллельные вычисления]] [[Категория:Страницы с непроверенными переводами]] [[Category:Concurrent computing]] [[Category:Software design patterns]] </nowiki>'
Унифицированная разница изменений правки (edit_diff)
'@@ -1,14 +1,14 @@ [[Шаблон проектирования|Шаблон проектирования программного обеспечения]] "'''реактор"''' - стратегия [[Событие (объектно-ориентированное программирование)|обработки событий]], которая может [[Параллелизм (информатика)|одновременно]] реагировать на множество потенциальных запросов на обслуживание. Ключевым компонентом шаблона является [[цикл событий]], работающий в ''одном'' [[Поток выполнения|потоке]] или [[Процесс (информатика)|процессе]], который [[Мультиплексирование|демультиплексирует]] входящие запросы и отправляет их нужному обработчику запросов. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}</ref> -Полагаясь на механизмы, основанные на событиях, а не [[Асинхронный ввод-вывод|на блокирующий ввод-вывод]] или многопоточность, реактор может обрабатывать множество конкурентных запросов, граничащих с вводом-выводом, с минимальной задержкой. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref> Реактор также позволяет легко изменять или расширять отдельные процедуры обработки запросов, хотя этот шаблон имеет некоторые недостатки и ограничения. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> +Полагаясь на механизмы, основанные на событиях, а не [[Асинхронный ввод-вывод|на блокирующий ввод-вывод]] или многопоточность, реактор может обрабатывать множество конкурентных запросов, граничащих с вводом-выводом, с минимальной задержкой. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref> Реактор также позволяет легко изменять или расширять отдельные процедуры обработки запросов, хотя этот шаблон имеет некоторые недостатки и ограничения. <ref name="Schmidt 1995" /> -Благодаря балансу простоты и [[Масштабируемость|масштабируемости]] реактор стал центральным архитектурным элементом в нескольких [[Сервер (аппаратное обеспечение)|серверных]] приложениях и [[Фреймворк|фреймворков]] для [[Вычислительная сеть|работы в сети]] . Для особых случаев, когда необходима еще большая пропускная способность, производительность или сложность запроса, существуют производные - '''мультиреактор''' и проактор. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref> +Благодаря балансу простоты и [[Масштабируемость|масштабируемости]] реактор стал центральным архитектурным элементом в нескольких [[Сервер (аппаратное обеспечение)|серверных]] приложениях и [[Фреймворк|фреймворков]] для [[Вычислительная сеть|работы в сети]] . Для особых случаев, когда необходима еще большая пропускная способность, производительность или сложность запроса, существуют производные - '''мультиреактор''' и проактор. <ref name="Schmidt 1995"/><ref name="Devresse 2014" /><ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref> == Обзор == Первоначальной мотивацией для шаблона реактора были практические соображения по [[Клиент — сервер|модели клиент-сервер]] в больших сетях, такие как [[C10k|проблема C10k]] для [[Веб-сервер|веб-серверов]].<ref name="Kegel 2014">{{Cite web|url=http://www.kegel.com/c10k.html|title=The C10k problem|author=Kegel|first=Dan|website=Dan Kegel's Web Hostel|date=5 February 2014|archive-url=https://web.archive.org/web/20230906022635/http://www.kegel.com/c10k.html|archive-date=6 September 2023|access-date=10 September 2023|url-status=live}}</ref> -Наивный подход к обработке запросов на обслуживание от многих потенциальных конечных точек, таких как [[Сокет (программный интерфейс)|сетевые сокеты]] или [[Файловый дескриптор|файловые дескрипторы]], заключается в прослушивании новых запросов из цикла событий, и немедленном чтении самого раннего запроса. Как только весь запрос будет прочитан, его можно обработать и переслать, напрямую вызвав соответствующий обработчик. Подобный полностью «итеративный» сервер, обрабатывающий один запрос от начала до конца за цикл событий, логически правилен. Однако он отстанет, если получит несколько запросов подряд. Итеративный подход не может масштабироваться, поскольку чтение запроса блокирует единственный поток сервера до тех пор, пока не будет получен полный запрос. А операции ввода-вывода обычно выполняются намного медленнее, чем другие вычисления. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> +Наивный подход к обработке запросов на обслуживание от многих потенциальных конечных точек, таких как [[Сокет (программный интерфейс)|сетевые сокеты]] или [[Файловый дескриптор|файловые дескрипторы]], заключается в прослушивании новых запросов из цикла событий, и немедленном чтении самого раннего запроса. Как только весь запрос будет прочитан, его можно обработать и переслать, напрямую вызвав соответствующий обработчик. Подобный полностью «итеративный» сервер, обрабатывающий один запрос от начала до конца за цикл событий, логически правилен. Однако он отстанет, если получит несколько запросов подряд. Итеративный подход не может масштабироваться, поскольку чтение запроса блокирует единственный поток сервера до тех пор, пока не будет получен полный запрос. А операции ввода-вывода обычно выполняются намного медленнее, чем другие вычисления. <ref name="Devresse 2014" /> -Одной из стратегий преодоления этого ограничения является многопоточность: за счет немедленного отделения каждого нового запроса в отдельный рабочий поток, первый запрос больше не будет блокировать цикл событий, который может немедленно завершить итерацию и обработать другой запрос. Такая конструкция «поток на соединение» масштабируется лучше, чем чисто итеративная, но она содержит свои ограничения. С точки зрения базовых системных ресурсов каждый новый поток или процесс требует дополнительных затрат [[Компьютерная память|памяти]] и времени обработки (из-за [[Переключение контекста|переключения контекста]] ). Фундаментальная неэффективность каждого потока, ожидающего завершения ввода-вывода, также не решена. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> +Одной из стратегий преодоления этого ограничения является многопоточность: за счет немедленного отделения каждого нового запроса в отдельный рабочий поток, первый запрос больше не будет блокировать цикл событий, который может немедленно завершить итерацию и обработать другой запрос. Такая конструкция «поток на соединение» масштабируется лучше, чем чисто итеративная, но она содержит свои ограничения. С точки зрения базовых системных ресурсов каждый новый поток или процесс требует дополнительных затрат [[Компьютерная память|памяти]] и времени обработки (из-за [[Переключение контекста|переключения контекста]] ). Фундаментальная неэффективность каждого потока, ожидающего завершения ввода-вывода, также не решена. <ref name="Schmidt 1995" /><ref name="Devresse 2014"/> С точки зрения проектирования, оба подхода тесно связывают общий демультиплексор с конкретными обработчиками запросов, что делает серверный код хрупким и утомительным для модификации. Эти соображения подсказывают несколько основных проектных подходов: @@ -18,12 +18,11 @@ # Зарегистрировать обработчики запросов как [[Callback (программирование)|обратные вызовы]] с обработчиком событий для лучшего [[Разделение ответственности|разделения задач.]] -Объединение этих идей ведет шаблону реактора, который сочетает в себе преимущества однопоточной обработки с высокой пропускной способностью и масштабируемостью. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> - +Объединение этих идей ведет шаблону реактора, который сочетает в себе преимущества однопоточной обработки с высокой пропускной способностью и масштабируемостью. <ref name="Schmidt 1995"/> <ref name="Devresse 2014" /> == Применение == Шаблон реактора может стать хорошей отправной точкой для решения любой параллельной проблемы обработки событий. Этот шаблон также не ограничивается сетевыми сокетами; аппаратный ввод-вывод, доступ к [[Файловая система|файловой системе]] или [[База данных|базе данных]], [[Межпроцессное взаимодействие|меж-процессное взаимодействие]] и даже абстрактные системы [[Обмен сообщениями|передачи сообщений]] — все это возможные варианты использования. </link><sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">&#x5B; ''[[Википедия:О пользе ссылок|<span title="Seems straight-forward, but most sources emphasize network applications. (September 2023)">нужна цитата</span>]]'' &#x5D;</sup> -Однако у шаблона реактора есть ограничения, главным из которых является использование обратных вызовов, которые усложняют анализ и [[Отладка программы|отладку]] программы — проблема, характерная для проектов с [[Инверсия управления|инвертированным управлением]] . <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> Более простые подходы: «поток на соединение» и полностью итеративный подход, позволяют избежать этого и могут быть приемлемыми решениями, если не требуется масштабируемость или высокая пропускная способность. {{Efn|That said, a rule-of-thumb in software design is that if application demands can potentially increase past an assumed limit, one should expect that someday they will.}} </link> +Однако у шаблона реактора есть ограничения, главным из которых является использование обратных вызовов, которые усложняют анализ и [[Отладка программы|отладку]] программы — проблема, характерная для проектов с [[Инверсия управления|инвертированным управлением]] . <ref name="Schmidt 1995" /> Более простые подходы: «поток на соединение» и полностью итеративный подход, позволяют избежать этого и могут быть приемлемыми решениями, если не требуется масштабируемость или высокая пропускная способность. {{Efn| Практическое правило софто-строения говорит что если требования к приложению потенциально могут увеличить существующие и предполагаемые лимиты, можно ожидать что однажды так и будет.}} </link> -Однопоточность может стать недостатком в случаях требующих максимальной пропускной способности или когда запросы требуют значительной обработки. Преодолеть эти ограничения могут различные многопоточные конструкции. И фактически некоторые из них до сих пор используют шаблон реактора в качестве подкомпонента для обработки событий и ввода-вывода. <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref> +Однопоточность может стать недостатком в случаях требующих максимальной пропускной способности или когда запросы требуют значительной обработки. Преодолеть эти ограничения могут различные многопоточные конструкции. И фактически некоторые из них до сих пор используют шаблон реактора в качестве подкомпонента для обработки событий и ввода-вывода. <ref name="Schmidt 1995" /> === Приложения === @@ -42,5 +41,11 @@ == Состав == -Реактивное приложение состоит из нескольких активных частей и опирается на некоторые механизмы поддержки: <ref name="Schmidt 1995">{{Cite book|автор=Schmidt|first=Douglas C.|author-link=Douglas C. Schmidt|ответственный=Coplien|часть=Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events|ссылка часть=https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf|заглавие=Pattern Languages of Program Design|издание=1st|издательство=Addison-Wesley|date=1995|volume=1|isbn=9780201607345|editor1-link=Jim Coplien}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFSchmidt1995">[[Дуглас К. Шмидт|Schmidt, Douglas C.]] (1995). [https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf "Chapter 29: Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events"] <span class="cs1-format">(PDF)</span>. In [[Джим Коплиен|Coplien, James O.]] (ed.). ''Pattern Languages of Program Design''. Vol.&nbsp;1 (1st&nbsp;ed.). Addison-Wesley. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9780201607345|<bdi>9780201607345</bdi>]].</cite></ref>{{Глосс}} +==Structure== +<gallery> +Reactor Pattern - UML 2 Component Diagram.svg|alt=A reactor typically consists of 2 subsystems. Sockets (a.k.a. handles) and a demultiplexer (like select or epoll) are typically provided by the system. The reactive application will provide a dispatcher / event-loop that reacts to handle events by invoking handlers, which are registered as callbacks.|UML 2 component diagram of a reactive application.<ref name="Schmidt 1995" /> +ReactorPattern - UML 2 Sequence Diagram.svg|alt=Before starting the event loop, a reactive application will typically register handles & handlers for specific requests. The event loop will then respond to request-based events by invoking a handler, passing the handle for processing.|UML 2 sequence diagram of a reactive server.<ref name="Schmidt 1995" /> +</gallery> + +Реактивное приложение состоит из нескольких активных частей и опирается на некоторые механизмы поддержки: <ref name="Schmidt 1995" /> {{Глосс}} {{Терм|Handle}} {{Опр|Идентификатор и интерфейс к экземпляра запроса с IO и данными. Обычно представлен в форме сокета, файлового дескриптора, или похожего механизма предоставляемого большинством современных ОС.}} @@ -59,11 +64,11 @@ Стандартной модели реактора достаточно для многих приложений, но для особенно требовательных случаев можно обеспечить еще большую мощность за счет дополнительной сложности. -Одна из основных модификаций — вызывать обработчики событий в их собственных потоках для большей параллелизма. Запуск обработчиков в пуле потоков вместо запуска новых потоков по мере необходимости еще больше упростит многопоточность и минимизирует накладные расходы. Т. о. пул потоков - естественное дополнение шаблона реактора во многих случаях использования. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFDevresse2014">Devresse, Adrien (20 June 2014). [https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf "Efficient parallel I/O on multi-core architectures"] <span class="cs1-format">(PDF)</span>. ''2nd Thematic CERN School of Computing''. CERN. [https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf Archived] <span class="cs1-format">(PDF)</span> from the original on 8 August 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2023</span>.</cite></ref> +Одна из основных модификаций — вызывать обработчики событий в их собственных потоках для большей параллелизма. Запуск обработчиков в пуле потоков вместо запуска новых потоков по мере необходимости еще больше упростит многопоточность и минимизирует накладные расходы. Т. о. пул потоков - естественное дополнение шаблона реактора во многих случаях использования. <ref name="Devresse 2014"/> Другой способ максимизировать пропускную способность — частично воспроизвести подход сервера «поток на соединение» с размножаемыми параллельными диспетчерами/циклами событий. Однако вместо количества соединений можно настроить количество диспетчеров, чтобы оно соответствовало доступным [[Многоядерный процессор|ядрам ЦП]] базового оборудования. -Этот вариант известен как мультиреактор. Он гарантирует, что выделенный сервер полностью использует вычислительную мощность оборудования. Поскольку отдельные потоки представляют собой долгоживущие циклы событий, накладные расходы на создание и уничтожение потоков ограничиваются запуском и завершением работы сервера. Поскольку запросы распределяются между независимыми диспетчерами, мультиреактор также обеспечивает лучшую доступность и надежность; в случае возникновения ошибки и сбоя одного диспетчера он будет прерывать только запросы, выделенные этому циклу событий. <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFEscoffierFinnegan2021">Escoffier, Clement; Finnegan, Ken (November 2021). <span class="cs1-lock-registration" title="Free registration required">[https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html "Chapter 4. Design Principles of Reactive Systems"]</span>. ''Reactive Systems in Java''. O'Reilly Media. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9781492091721|<bdi>9781492091721</bdi>]].</cite></ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}<cite class="citation web cs1" data-ve-ignore="true" id="CITEREFGarrett2015">Garrett, Owen (10 June 2015). [https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/ "Inside NGINX: How We Designed for Performance & Scale"]. ''NGINX''. F5, Inc. [https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/ Archived] from the original on 20 August 2023<span class="reference-accessdate">. Retrieved <span class="nowrap">10 September</span> 2023</span>.</cite></ref> +Этот вариант известен как мультиреактор. Он гарантирует, что выделенный сервер полностью использует вычислительную мощность оборудования. Поскольку отдельные потоки представляют собой долгоживущие циклы событий, накладные расходы на создание и уничтожение потоков ограничиваются запуском и завершением работы сервера. Поскольку запросы распределяются между независимыми диспетчерами, мультиреактор также обеспечивает лучшую доступность и надежность; в случае возникновения ошибки и сбоя одного диспетчера он будет прерывать только запросы, выделенные этому циклу событий. <ref name="Escoffier 2021"/> <ref name="Garrett 2015"/> -Для особенно сложных сервисов, одновременно требующих синхронности и асинхронности, еще одной альтернативой является шаблон проактора. Этот шаблон более сложен, чем реактор, со своими инженерными деталями, но он по-прежнему использует подкомпонент реактора для решения проблемы блокировки ввода-вывода. <ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}<cite class="citation book cs1" data-ve-ignore="true" id="CITEREFEscoffierFinnegan2021">Escoffier, Clement; Finnegan, Ken (November 2021). <span class="cs1-lock-registration" title="Free registration required">[https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html "Chapter 4. Design Principles of Reactive Systems"]</span>. ''Reactive Systems in Java''. O'Reilly Media. [[Международный стандартный книжный номер|ISBN]]&nbsp;[[Special:BookSources/9781492091721|<bdi>9781492091721</bdi>]].</cite></ref> +Для особенно сложных сервисов, одновременно требующих синхронности и асинхронности, еще одной альтернативой является шаблон проактора. Этот шаблон более сложен, чем реактор, со своими инженерными деталями, но он по-прежнему использует подкомпонент реактора для решения проблемы блокировки ввода-вывода. <ref name="Escoffier 2021"/> == Смотрите также == @@ -99,3 +104,6 @@ [[Категория:Шаблоны проектирования]] [[Категория:Параллельные вычисления]] -[[Категория:Страницы с непроверенными переводами]]</nowiki> +[[Категория:Страницы с непроверенными переводами]] +[[Category:Concurrent computing]] +[[Category:Software design patterns]] +</nowiki> '
Новый размер страницы (new_size)
25341
Старый размер страницы (old_size)
41869
Изменение размера в правке (edit_delta)
-16528
Добавленные в правке строки (added_lines)
[ 0 => 'Полагаясь на механизмы, основанные на событиях, а не [[Асинхронный ввод-вывод|на блокирующий ввод-вывод]] или многопоточность, реактор может обрабатывать множество конкурентных запросов, граничащих с вводом-выводом, с минимальной задержкой. <ref name="Devresse 2014">{{Cite web|url=https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|title=Efficient parallel I/O on multi-core architectures|author=Devresse|first=Adrien|website=2nd Thematic CERN School of Computing|date=20 June 2014|publisher=CERN|archive-url=https://web.archive.org/web/20220808062914/https://indico.cern.ch/event/282910/contributions/645355/attachments/521441/719267/efficient_parallel_IO_on_multicore_arch2.pdf|archive-date=8 August 2022|access-date=14 September 2023|url-status=live}}</ref> Реактор также позволяет легко изменять или расширять отдельные процедуры обработки запросов, хотя этот шаблон имеет некоторые недостатки и ограничения. <ref name="Schmidt 1995" />', 1 => 'Благодаря балансу простоты и [[Масштабируемость|масштабируемости]] реактор стал центральным архитектурным элементом в нескольких [[Сервер (аппаратное обеспечение)|серверных]] приложениях и [[Фреймворк|фреймворков]] для [[Вычислительная сеть|работы в сети]] . Для особых случаев, когда необходима еще большая пропускная способность, производительность или сложность запроса, существуют производные - '''мультиреактор''' и проактор. <ref name="Schmidt 1995"/><ref name="Devresse 2014" /><ref name="Escoffier 2021">{{Cite book|автор=Escoffier|first=Clement|author2=Finnegan|first2=Ken|часть=Chapter 4. Design Principles of Reactive Systems|ссылка часть=https://www.oreilly.com/library/view/reactive-systems-in/9781492091714/ch04.html|заглавие=Reactive Systems in Java|издательство=O'Reilly Media|date=November 2021|isbn=9781492091721}}</ref> <ref name="Garrett 2015">{{Cite web|url=https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|title=Inside NGINX: How We Designed for Performance & Scale|author=Garrett|first=Owen|website=NGINX|date=10 June 2015|publisher=F5, Inc.|archive-url=https://web.archive.org/web/20230820232851/https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/|archive-date=20 August 2023|access-date=10 September 2023|url-status=live}}</ref>', 2 => 'Наивный подход к обработке запросов на обслуживание от многих потенциальных конечных точек, таких как [[Сокет (программный интерфейс)|сетевые сокеты]] или [[Файловый дескриптор|файловые дескрипторы]], заключается в прослушивании новых запросов из цикла событий, и немедленном чтении самого раннего запроса. Как только весь запрос будет прочитан, его можно обработать и переслать, напрямую вызвав соответствующий обработчик. Подобный полностью «итеративный» сервер, обрабатывающий один запрос от начала до конца за цикл событий, логически правилен. Однако он отстанет, если получит несколько запросов подряд. Итеративный подход не может масштабироваться, поскольку чтение запроса блокирует единственный поток сервера до тех пор, пока не будет получен полный запрос. А операции ввода-вывода обычно выполняются намного медленнее, чем другие вычисления. <ref name="Devresse 2014" />', 3 => 'Одной из стратегий преодоления этого ограничения является многопоточность: за счет немедленного отделения каждого нового запроса в отдельный рабочий поток, первый запрос больше не будет блокировать цикл событий, который может немедленно завершить итерацию и обработать другой запрос. Такая конструкция «поток на соединение» масштабируется лучше, чем чисто итеративная, но она содержит свои ограничения. С точки зрения базовых системных ресурсов каждый новый поток или процесс требует дополнительных затрат [[Компьютерная память|памяти]] и времени обработки (из-за [[Переключение контекста|переключения контекста]] ). Фундаментальная неэффективность каждого потока, ожидающего завершения ввода-вывода, также не решена. <ref name="Schmidt 1995" /><ref name="Devresse 2014"/>', 4 => 'Объединение этих идей ведет шаблону реактора, который сочетает в себе преимущества однопоточной обработки с высокой пропускной способностью и масштабируемостью. <ref name="Schmidt 1995"/> <ref name="Devresse 2014" />', 5 => 'Однако у шаблона реактора есть ограничения, главным из которых является использование обратных вызовов, которые усложняют анализ и [[Отладка программы|отладку]] программы — проблема, характерная для проектов с [[Инверсия управления|инвертированным управлением]] . <ref name="Schmidt 1995" /> Более простые подходы: «поток на соединение» и полностью итеративный подход, позволяют избежать этого и могут быть приемлемыми решениями, если не требуется масштабируемость или высокая пропускная способность. {{Efn| Практическое правило софто-строения говорит что если требования к приложению потенциально могут увеличить существующие и предполагаемые лимиты, можно ожидать что однажды так и будет.}} </link>', 6 => 'Однопоточность может стать недостатком в случаях требующих максимальной пропускной способности или когда запросы требуют значительной обработки. Преодолеть эти ограничения могут различные многопоточные конструкции. И фактически некоторые из них до сих пор используют шаблон реактора в качестве подкомпонента для обработки событий и ввода-вывода. <ref name="Schmidt 1995" />', 7 => '==Structure==', 8 => '<gallery>', 9 => 'Reactor Pattern - UML 2 Component Diagram.svg|alt=A reactor typically consists of 2 subsystems. Sockets (a.k.a. handles) and a demultiplexer (like select or epoll) are typically provided by the system. The reactive application will provide a dispatcher / event-loop that reacts to handle events by invoking handlers, which are registered as callbacks.|UML 2 component diagram of a reactive application.<ref name="Schmidt 1995" />', 10 => 'ReactorPattern - UML 2 Sequence Diagram.svg|alt=Before starting the event loop, a reactive application will typically register handles & handlers for specific requests. The event loop will then respond to request-based events by invoking a handler, passing the handle for processing.|UML 2 sequence diagram of a reactive server.<ref name="Schmidt 1995" />', 11 => '</gallery>', 12 => '', 13 => 'Реактивное приложение состоит из нескольких активных частей и опирается на некоторые механизмы поддержки: <ref name="Schmidt 1995" /> {{Глосс}}', 14 => 'Одна из основных модификаций — вызывать обработчики событий в их собственных потоках для большей параллелизма. Запуск обработчиков в пуле потоков вместо запуска новых потоков по мере необходимости еще больше упростит многопоточность и минимизирует накладные расходы. Т. о. пул потоков - естественное дополнение шаблона реактора во многих случаях использования. <ref name="Devresse 2014"/>', 15 => 'Этот вариант известен как мультиреактор. Он гарантирует, что выделенный сервер полностью использует вычислительную мощность оборудования. Поскольку отдельные потоки представляют собой долгоживущие циклы событий, накладные расходы на создание и уничтожение потоков ограничиваются запуском и завершением работы сервера. Поскольку запросы распределяются между независимыми диспетчерами, мультиреактор также обеспечивает лучшую доступность и надежность; в случае возникновения ошибки и сбоя одного диспетчера он будет прерывать только запросы, выделенные этому циклу событий. <ref name="Escoffier 2021"/> <ref name="Garrett 2015"/>', 16 => 'Для особенно сложных сервисов, одновременно требующих синхронности и асинхронности, еще одной альтернативой является шаблон проактора. Этот шаблон более сложен, чем реактор, со своими инженерными деталями, но он по-прежнему использует подкомпонент реактора для решения проблемы блокировки ввода-вывода. <ref name="Escoffier 2021"/>', 17 => '[[Категория:Страницы с непроверенными переводами]]', 18 => '[[Category:Concurrent computing]]', 19 => '[[Category:Software design patterns]]', 20 => '</nowiki>' ]
Была ли правка сделана через выходной узел сети Tor (tor_exit_node)
false
Unix-время изменения (timestamp)
'1704387938'
Название базы данных вики (wiki_name)
'ruwiki'
Языковой код вики (wiki_language)
'ru'