Какое поведение Erlang, то есть gen_server или gen_fsm, я должен использовать в этом случае

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам