2015-08-26 3 views
1

Я разрабатываю решение, которое запрашивает веб-службу SOAP для определенных транзакций. После извлечения эти транзакции должны быть сохранены в базе данных, после чего обратный URL-адрес вызывается для отправки некоторых данных на другой сервер. Как бы вы лучше всего решили решение этой проблемы. Моя путаница заключается в том, следует ли использовать gen_server или gen_fsm, и если это так, какой компонент решения идет, то есть если gen_server, какая задача переходит на сервер, какая задача переходит к клиенту.Какое поведение Erlang, то есть gen_server или gen_fsm, следует использовать в этом случае

ответ

3

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

Как только вы узнаете эти ответы, вы можете построить свой трубопровод. Одним из примеров может служить:

  • Один процесс, который регулярно запрашивает службу SOAP и вызывает функцию с каждой партией транзакций.
  • В этой функции запускаются два процесса; который записывает транзакции в базу данных и отправляет данные на сервер. Эти процессы независимы друг от друга.

Это всего лишь один пример, и в зависимости от ваших требований вам может потребоваться структурировать вещи по-другому.

В целом, эти процессы могут быть gen_servers, поскольку ни у одного из них нет четких состояний. Фактически, два рабочих процесса не обязательно должны быть gen_servers, так как они просто выполняют одну задачу, а затем умирают. Использование gen_server в этом случае было бы излишним.

+0

Спасибо! Извините за неопределенность с моей стороны, но ваш ответ помог прояснить некоторые из моих мыслей. Просто укажем, что данные отправляются через URL после того, как они были сохранены в базе данных. Я думал о том, чтобы использовать gen_fsm для запроса веб-службы (чередовать между двумя состояниями, т.е. получать, извлекать. Затем отправлять данные в gen_server, который динамически запускает два gen_fsms, один для сохранения данных, а другой для отправки данных по URL-адресу. что gen_fsms может быть переполнен, но компонент, который запрашивает веб-службу, - это какой-то клиент для gen_server. –

+1

Я думаю, что «gen_fsm» в этом случае будет излишним, потому что в состоянии «выборки» вы просто вызовите библиотеку SOAP в этом процессе, чтобы она все равно была занята. Поскольку она только отправляет данные другим процессам, никто не должен знать, что это «состояние». Посмотрите на нее скорее как производитель, чем на конечный автомат. –

+1

И если вы хотите сначала написать в базу данных, а затем отправить данные на другой сервер, я бы сделал это в одном процессе, а не два (если это можно сделать последовательно, то есть). Это дает вам много более простая и предсказуемая система. d даже до тех пор, пока вы не сделаете это «gen_server» вообще, но просто как простой рабочий, контролируемый супервизором 'simple_one_for_one'. –