Давайте представим, что у нас есть система обработки заказов для пиццерии, которую нужно спроектировать и построить.
Требования:
Р1. Система должна быть клиентской -и использовать -case -агностическую, что означает, что клиент может получить доступ к системе, что не учитывалось при первоначальном проектировании. Например, если пиццерия решит, что многие ее клиенты будут использовать смартфоны Samsung Bada позже, то написание клиента для ОС Bada не потребует переписывания API системы и самой системы; или, например, если выяснится, что использование iPad вместо Android-устройств как-то лучше для драйверов доставки, то будет легко создать iPad-клиент и это никак не повлияет на API системы;
Р2. Возможность повторного использования. Это означает, что систему можно легко перенастроить без необходимости переписывать большой объем кода в случае изменения бизнес-процесса. Например, если позже пиццерия начнет принимать платежи онлайн наряду с приемом наличных водителем-курьером (, принимающим оплату до принятия заказа, VS приемом оплаты при доставке ), то будет легко адаптировать систему к новый бизнес-процесс;
Р3. Высокая -доступность и отказоустойчивость -, что означает, что система должна быть онлайн и принимать заказы 24/7.
Итак, чтобы соответствовать R3, мы могли бы использовать Erlang/OTP и иметь следующую архитектуру:
Проблема здесь в том, что в такой архитектуре много «жестко закодированных» -функций. Если, например, магазин пиццы перейдет от приема наличных платежей при доставке к приему онлайн-платежей до размещения заказа,тогда потребуется много времени и усилий, чтобы переписать всю систему и изменить API системы.
Более того, если пиццерии потребуются какие-то доработки CRM-клиента, то опять же придется переписывать API, клиентов и саму систему.
Итак, следующая архитектура направлена на решение этих проблем и, таким образом, на соответствие R1, R2 и R3 :
. Каждая «служба» в системе представляет собой веб-сервер Webmachine с RESTful API. Такой подход имеет следующие преимущества:
Таким образом, системная архитектура, предложенная на втором рисунке, представляет собой сервис-ориентированную архитектуру, в которой каждый сервис имеет RESTful API вместо WSDL-контракта и где каждый сервис представляет собой приложение Erlang/OTP.
А вот и мои вопросы: