Сервис-ориентированная архитектура с Erlang/OTP: как правильно использовать обмен сообщениями

Ответы на мой предыдущий вопрос о доступе к базе данных и абстракции службы помогли мне понять, что в SOA служба базы данных должна предоставлять публичный API, а не прямой доступ (SQL или через ORM) к базе данных.

Теперь, если я хочу создать службу (SOA) в приложении Erlang/OTP, я думаю, что это должен быть gen_server или другое поведение OTP, потому что в этом случае API будет легко определен, а сама служба может быть легко включена в приложение.

Но как я должен передавать данные от сервиса к его потребителю?

Я знаю, что в Ruby on Rails я могу сделать что-то вроде

persons = Person.find(all)

Затем я могу просто вернуть persons потребителю услуги.

В Erlang/OTP, если persons составляет несколько тысяч записей, должен ли я передать его в операторе возврата gen_server? Это означает, что gen_server отправит сообщение вызывающей стороне (потребителю службы), и сообщение будет по существу скопировано в виртуальной машине Erlang. Я склонен думать, что это неправильное использование передачи сообщений Erlang.

Итак, мой вопрос:

  • Как я могу создать службу базы данных (SOA) в Erlang/OTP?
  • Должен ли API такого сервиса использовать стандартные механизмы OTP (например, ответное сообщение gen_server) или что-то еще?

person skanatek    schedule 03.08.2012    source источник


Ответы (1)


person    schedule
comment
Спасибо за очень хороший справочный пример! Понятие процесса для каждой операции VS процесса для каждой задачи не требует пояснений. Но как вы думаете, должен ли я просто вызывать какой-то последовательный код из процесса запроса вместо того, чтобы пытаться вызывать gen_server для каждого действия, как я хотел сделать [здесь][1] (рисунок 1)? Что произойдет со всем приложением, если один из запросов, обслуживаемых YAWS, не будет выполнен? [1]. stackoverflow.com/questions/11268599/ - person skanatek; 07.08.2012
comment
Возьмите запрос для каждого процесса рыскания через последовательный код. Если один из запросов завершится неудачно, остальные продолжатся. Но если gen_server выйдет из строя, все умрут. - person Muzaaya Joshua; 07.08.2012