在这种情况下我应该使用哪种 Erlang 行为,即 gen_server 或 gen_fsm
Posted
技术标签:
【中文标题】在这种情况下我应该使用哪种 Erlang 行为,即 gen_server 或 gen_fsm【英文标题】:Which Erlang behaviour i.e. gen_server or gen_fsm should I use in this case 【发布时间】:2015-11-20 00:44:48 【问题描述】:我正在开发一种解决方案,用于查询 SOAP Web 服务以获取某些事务。一旦检索到,这些事务将被保存在数据库中,然后调用回调 url 将一些数据发送到另一台服务器。您将如何最好地构建解决此问题的解决方案。我的困惑是是否应该使用 gen_server 或 gen_fsm ,如果是,解决方案的哪个组件去哪里,即如果 gen_server 什么任务去服务器哪个任务去客户端。
【问题讨论】:
【参考方案1】:想想您的系统中可以并行执行哪些任务。 SOAP 查询可以并行完成吗?这有意义吗?是否可以在再次查询 SOAP 时将事务写入数据库?数据是应该在事务写入数据库后发送到另一个服务器,还是可以同时完成?
知道了这些答案后,您就可以构建自己的管道了。一个例子是:
一个进程定期查询 SOAP 服务并为每批事务调用一个函数。 在这个函数中,启动了两个进程;一种将事务写入数据库,另一种将数据发送到服务器。这些过程相互独立。这只是一个示例,根据您的要求,您可能需要以另一种方式构建事物。
一般来说,这些进程都可以是gen_servers
,因为它们都没有任何明确的状态。事实上,这两个工作进程根本不必是gen_servers
,因为它们只是执行一项任务然后就死掉了。在这种情况下使用gen_server
就太过分了。
【讨论】:
谢谢!很抱歉我的含糊不清,但你的回答有助于澄清我的一些想法。只是要指出,数据是在保存到数据库后通过 url 发送的。我正在考虑使用 gen_fsm 来查询 Web 服务(在两种状态之间交替,即 fetching,fetched。然后将数据发送到 gen_server,它动态启动两个 gen_fsms 一个用于保存数据,另一个用于通过 url 发送数据。我知道可以肯定的是 gen_fsms 可能是矫枉过正,但查询 Web 服务的组件是 gen_server 的某种客户端。 我认为在这种情况下gen_fsm
将是矫枉过正,因为在“获取”状态下,您只需在该进程中调用 SOAP 库,因此无论如何它都会很忙。由于它只向其他进程发送数据,因此其他人无需知道它的“状态”。更多地将其视为生产者,而不是状态机。
如果你想先写入数据库,然后将数据发送到另一台服务器,我会在一个进程中完成,而不是两个(如果可以顺序完成,那就是)。这为您提供了一个更简单且可预测的系统。我什至根本不将其设为gen_server
,而只是由simple_one_for_one
主管监控的简单工人。
只是为了澄清,你的意思是我有一个工作人员查询由 one_for_one 主管管理的 Web 服务,另一个简单的工作人员用于保存到数据库并调用由 simple_one_for_one 主管管理的 url(因为工作人员是生成的动态地为检索到的每个事务)。请多多指教。
是的,这将是一个很好的方法。在考虑监督者结构时,考虑需要监督什么以及它如何依赖于其他部分也很重要。在这种情况下,您的工作人员并不真正依赖于查询过程(因为他们已经拥有所需的数据)并且查询过程并不真正依赖于已启动的工作人员(它只是启动新工作人员),所以他们不t 需要在同一主管之下。不过,它们可能应该在同一个监督树下。以上是关于在这种情况下我应该使用哪种 Erlang 行为,即 gen_server 或 gen_fsm的主要内容,如果未能解决你的问题,请参考以下文章