Научная статья на тему 'Модели актера для реализации надежных, отказоустойчивых систем'

Модели актера для реализации надежных, отказоустойчивых систем Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
141
70
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Модели актера для реализации надежных, отказоустойчивых систем»

Яковлев Д. А.

МОДЕЛИ АКТЕРА ДЛЯ РЕАЛИЗАЦИИ НАДЕЖНЫХ, ОТКАЗОУСТОЙЧИВЫХ СИСТЕМ

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

Надежность программного обеспечения достаточно широкое понятие. Мы рассмотрим два его аспекта: способность обрабатывать большое число запросов и способность восстанавливаться после сбоев. Для решения этих задач обычно используют ту или иную форму параллельной обработки данных. В первом случае параллельная обработка позволит обрабатывать больший объем данных или большее число запросов одновременно, а во втором случае позволит продолжить работу системы в целом, если какая-то ее часть вышла из строя.

На сегодняшний день существует две модели параллельных вычислений: модель с разделяемой памятью (shared memory) и модель с посылкой сообщений (message passing), или модель актера. В большинстве современных языков программирования реализована поддержка первой модели, включающая механизмы создания процессов и потоков (нитей), а также механизмы, обеспечивающие совместный доступ к разделяемой памяти (механизм блокировок). Несмотря на широкое распространение, данный подход обладает рядом существенных недостатков. Во-первых, параллельные программы, использующие модель с разделяемой памятью, очень сложно писать и отлаживать. Отчасти это связано с тем, что данный подход является не естественным, он практически не встречается в реальной жизни. Сложности при отладке программ возникают, поскольку состояние гонки (race condition) делает практически невозможной точное воспроизведение условий возникновения ошибки. Взаимоблокировки (deadlocks) являются частой ошибкой, отладка которой также очень трудоемка. Во-вторых, такие программы обладают ограниченной способностью к масштабированию. Будет ли работать такая программа быстрее, если ее запустить на двухъядерном процессоре? А на четырехъядерном? А если у процессора будет 100 ядер? Если она будет работать быстрее, то во сколько раз? Также возникает проблема, если необходимо обеспечить распределенную работу программы для повышения производительности и обеспечения отказоустойчивости. Компьютеры в кластере не обладают общей памятью, поэтому необходимо реализовывать механизм обмена сообщений для синхронизации работы программ [1].

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

Актер - это вычислительная сущность, которая в ответ на пришедшее сообщение может параллельно:

послать конечное количество сообщений другим актерам;

создать конечное количество других актеров;

определить поведение в ответ на следующее сообщение.

Актеры взаимодействуют между собой асинхронно, то есть актер, пославший сообщение, не ждет ответа от адресата, а продолжает свое выполнение. Получатели сообщений идентифицируются с помощью адреса, поэтому актер может посылать сообщения только тем актерам, адреса которых он знает [2].

Рассмотрим, каким образом модель актера позволяет обеспечить надежность и отказоустойчивость программ. Одним из основных преимуществ этой модели является хорошая способность к масштабированию. Для вычислений используются независимые актеры, работающие параллельно. Для решения большей задачи мы можем создать больше актеров, и, согласно закону Густафсона, решить большую задачу за то же время, что и меньшую, за счет параллельной обработки. Мы не можем сделать то же самое, используя модель вычислений с разделяемой памятью, поскольку большое число параллельных потоков будет пытаться получить доступ к общей памяти, создавая тем самым большие очереди, в которых потоки будут простаивать, ожидая доступа к данным. За счет масштабирования модель актера позволяет обрабатывать больший объем данных и большее число запросов, тем самым, повышая надежность и доступность приложения.

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

В программе, состоящей из большого числа актеров, проще реализовать отказоустойчивость. Для этого необходимо, чтобы одни актеры осуществляли мониторинг других. Для этого актер может периодически посылать другому актеру некоторое сообщение, на которое последний должен ответить. Если ответа не последовало, значит, актер завершил свою работу. Также актер перед аварийным завершением может посылать информацию о факте завершения и условиях, при которых это завершение было произведено, другому актеру, чтобы тот, в свою очередь, предпринял необходимые меры для исправления сложившейся ситуации. Например, он может создать нового актера или перераспределить нагрузку между оставшимися. Если актеры будут выполняться на различных узлах, то это позволит обеспечить отказоустойчивую работу системы даже при физическом выходе из строя части из них.

Несмотря на все преимущества, модель актера не получила широкого распространения, и в самых популярных языках программирования реализована модель с разделяемой памятью. Среди языков, которые реализуют модель актера, можно назвать Erlang и Scala. Scala относительно молодой язык, поэтому мы рассмотрим Erlang как пример практической реализации модели актера.

Язык Erlang - функциональный язык программирования. Он был разработан в 1986 году в компании Ericsson для создания приложений для телефонии. Предметная область наложила свой отпечаток на Erlang. Телефония по своей природе параллельна - коммутаторы обрабатывают десятки и сотни тысяч одновременных соединений. Программы должны обеспечивать отказоустойчивую работу, поскольку выход из строя даже на короткое время оборудования или программного обеспечения может привести к серьезным последствиям.

В Erlang используются параллельные процессы для структурирования программы. Они не имеют разделяемой памяти и взаимодействуют друг с другом посредством посылки асинхронных сообщений. Процессы Erlang могут создавать другие процессы. Процессы Erlang являются «легкими» и принадлежат

языку, а не операционной системе, поэтому программа на Erlang может иметь десятки и даже сотни тысяч параллельных процессов [3].

Легко заметить, что процессы Erlang обладают сходными свойствами с актерами. Именно поэтому мы можем говорить, что Erlang является примером практической реализации модели актера. Erlang обладает описанной выше способностью к масштабированию, заключающейся в возможности создания огромного числа параллельных процессов, способных эффективно выполняться как на многоядерном и многопроцессорном оборудовании, так и в распределенной среде. Обмен сообщениями между процессами, расположенными на различных узлах так же прост, как и между процессами, работающими на одном узле. Эта возможность встроена в язык и практически не требует дополнительных усилий от программиста.

В Erlang реализована система супервизоров. Два процесса могут быть связаны таким образом, что они будут наблюдать друг за другом. Если один из связанных процессов завершится, второму будет послано сообщение об этом с указанием причины. Допустим, один из связанных процессов завершился из-за попытки деления на ноль. Перед завершением процесс пошлет сообщение своему супервизору об этом и указанием конкретной причины. Супервизор на основании этой информации может принять решение о создании нового процесса или о собственном завершении. Если будет принято решение о создании нового процесса, то программа будет не только отказоустойчивой, но и самовосстанавливающейся после сбоев [1].

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

Веб-сервер Yaws, написанный целиком на Erlang и ориентированный на веб-приложения с динамическим содержимым [4]. Для обработки каждого клиента используется легковесный процесс Erlang. Было проведено сравнение производительности веб-серверов Yaws и Apache [5] . Apache смог обработать примерно 4000 параллельных сессий, после чего сервер перестал справляться с нагрузкой. В то же время Yaws смог обработать примерно 80000 параллельных соединений, что в 20 раз превышает возможности Apache. Веб-сервер Yaws является самым ярким, но не единственным, примером того, как практическая реализация модели актера позволяет справляться с большими нагрузками и обрабатывать больший объем данных.

В качестве примера отказоустойчивой системы можно привести ATM коммутатор AXD301, разработанный в компании Ericsson Telecom AB. Этот коммутатор занимает 11% рынка ATM коммутаторов в мире и является бесспорным лидером в этом сегменте. Надежность этого коммутатора составляет 99,9999999% (9 девяток), что оценивается как 31 миллисекунда простоя в год. Компания British Telecom использует этот коммутатор в своей системе телефонии, которая обрабатывает порядка 30-40 миллионов звонков в неделю. Программное обеспечение для этого коммутатора написано на Erlang [6].

Таким образом, мы рассмотрели два аспекта надежности программного обеспечения: способность обрабатывать большое число запросов и способность восстанавливаться после сбоев. Было показано, что для достижения этих целей используется параллельная обработка данных. Были рассмотрены две модели параллельных вычислений, и был сделан вывод о том, что модель актера лишена недостатков модели с разделяемой памятью. Было дано описание свойств модели актера, а также того, каким образом она позволяет повысить надежность программного обеспечения по указанным выше параметрам. Был описан язык Erlang как наиболее яркий пример практической реализации вычислительной модели. Были приведены примеры успешной реализации надежных систем с использованием этого языка.

Литература

1. Armstrong, J. Programming Erlang. Software for a Concurrent World / J. Armstrong. - The Pragmatic Bookshelf, 2007. - 519 p.

2. Agha, G. A. Actors: A Model Of Concurrent Computation In Distributed Systems / Gul A. Agha. - MIT Artificial Intelligence Laboratory, 1985. - 204 p.

3. http://erlang.org/

4. http://yaws.hyber.org/

5. http://www.sics.se/~joe/apachevsyaws.html

6. Armstrong, J. Concurrency oriented programming in Erlang / J. Armstrong. - Distributed Systems Laboratory Swedish Institute of Computer Science, 2003.

i Надоели баннеры? Вы всегда можете отключить рекламу.