В распределенных вычислениях распределенные объекты — это объекты (в смысле объектно-ориентированного программирования), которые распределены по разным адресным пространствам, либо в разных процессах на одном компьютере, либо даже на нескольких компьютерах, подключенных через сеть, но которые работают вместе, обмениваясь данными и вызывая методы друг друга. Упор на распределённость объектной архитектуры часто связывают с прозрачностью их местоположения, когда удаленные объекты с точки зрения обращающегося к ним программного кода выглядят так же, как локальные. Основным методом обмена данными с распределенными объектами является вызов удаленного метода, как правило, посредством передачи сообщений: один объект отправляет сообщение другому объекту на удаленной машине или процессу для выполнения некоторой задачи. Результаты отправляются обратно вызывающему объекту.
Распределенные объекты были популярны в конце 1990-х — начале 2000-х годов, но с тех пор вышли из моды[1].
Термин также может в целом относиться к одному из расширений базовой концепции объекта, используемого в контексте распределенных вычислений, например, реплицированных объектов или живых распределенных объектов.
Реплицированные объекты — это группы программных компонентов (реплик), которые запускают распределенный многосторонний протокол для достижения высокой степени согласованности между своими внутренними состояниями и скоординированно отвечают на запросы. Обращение к группе реплик вместе как к объекту отражает тот факт, что взаимодействие с любым из них демонстрирует одно и то же внешне видимое состояние и поведение.
Живые распределенные объекты (или просто живые объекты)[2] обобщают концепцию реплицированного объекта на группы реплик, которые могут внутренне использовать любой распределенный протокол, что, возможно, приводит только к слабой согласованности между их локальными состояниями. Живые распределенные объекты также могут быть определены как запущенные экземпляры распределенных многосторонних протоколов, рассматриваемые с объектно-ориентированной точки зрения как сущности, которые имеют различную идентичность и могут инкапсулировать распределенное состояние и поведение.
Локальные и распределенные объекты
Локальные и распределенные объекты обладают многими отличиями[3][4]. Вот некоторые из них:
Жизненный цикл: создание, миграция и удаление распределенных для распределённых объектов отличается от локальных объектов.
Ссылки: ссылки на распределённые объекты сложнее простых указателей на адреса памяти, которых может быть достаточно в локальной системе.
Задержка запроса: запрос распредёленного объекта на несколько порядков медленнее, чем вызов локального метода.
Активация объекта: распределённые объекты не всегда могут быть доступны для обслуживания запроса объекта в любой момент времени.
Параллелизм: распределённые объекты могут выполняться параллельно.
Связь: для запросов распределённых объектов доступны различные примитивы связи.
Отказ: распределённые объекты имеют гораздо больше точек отказа, чем типичные локальные объекты.
Безопасность: распределённость делает их уязвимыми для атак.
Примеры
Возможности RPC межплатформенного протокола сериализации Cap’n Proto представляют собой протокол работы с распределёнными объектами. Вызовы методов распределенных объектов могут быть выполнены (в цепочке, в одном сетевом запросе, если это необходимо) через ссылки / возможности интерфейса[5].
Распределенные объекты реализованы в Objective-C с использованием API Cocoa с использованием класса NSConnection и вспомогательных объектов.
↑W. Emmerich (2000) Engineering distributed objects, John Wiley & Sons Ltd.
↑Samuel C. Kendall, Jim Waldo, Ann Wollrath, and Geoff Wyant. 1994. A Note on Distributed Computing. Technical Report. Sun Microsystems, Inc., Mountain View, CA, USA.