Какое поведение Erlang, то есть gen_server или gen_fsm, я должен использовать в этом случае
Я разрабатываю решение, которое запрашивает веб-сервис SOAP для определенных транзакций. После получения эти транзакции должны быть сохранены в базе данных, после чего вызывается URL обратного вызова для отправки некоторых данных на другой сервер. Как бы вы лучше всего разработали решение этой проблемы. Я не могу понять, следует ли использовать gen_server или gen_fsm, и если да, то какой компонент решения идет куда, т.е. если gen_server, какая задача отправляется на сервер, какая задача передается клиенту.
1 ответ
Подумайте, какие задачи могут выполняться параллельно в вашей системе. Могут ли запросы SOAP выполняться параллельно, и имеет ли это смысл? Могут ли транзакции быть записаны в базу данных при повторном запросе SOAP? Предполагается ли отправлять данные на другой сервер после записи транзакций в базу данных, или это можно сделать одновременно?
Как только вы знаете эти ответы, вы можете построить свой конвейер. Одним из примеров будет:
- Один процесс, который регулярно запрашивает службу SOAP и вызывает функцию для каждого пакета транзакций.
- В этой функции запускаются два процесса; тот, который записывает транзакции в базу данных, и тот, который отправляет данные на сервер. Эти процессы не зависят друг от друга.
Это только один пример, и в зависимости от ваших требований, вам, возможно, придется структурировать вещи по-другому.
В общем, все эти процессы могут быть gen_servers
поскольку ни у одного из них нет четких состояний. На самом деле, два рабочих процесса не должны быть gen_servers
вообще, так как они просто выполняют одно задание, а затем умирают. Используя gen_server
в этом случае было бы излишним.