2

我之前关于数据库访问和服务抽象的问题的答案帮助我理解了在 SOA 中数据库服务应该提供公共 API,而不是对数据库的直接访问(SQL 或通过 ORM)。

现在,如果我想在 Erlang/OTP 应用程序中创建(SOA)服务,我认为它应该是 gen_server 或其他 OTP 行为,因为在这种情况下,API 将很容易定义并且服务本身可以很容易地合并到应用程序。

但是我应该如何将数据从服务传递给它的消费者呢?

我知道在 Ruby on Rails 中我可以做类似的事情

persons = Person.find(all)

然后我可以返回persons服务消费者。

在 Erlang/OTP 中,如果persons有几千条记录,我应该在 gen_server return 语句中传递它吗?这意味着 gen_server 将向其调用者(服务消费者)发送一条消息,并且该消息将实质上复制到 Erlang VM 中。我倾向于认为这不是对 Erlang 消息传递的正确使用。

所以我的问题是:

  • 如何在 Erlang/OTP 中创建数据库服务 (SOA)?
  • 这种服务的 API 应该使用 OTP 标准机制(如 gen_server 返回消息)还是其他任何东西?
4

1 回答 1

4

并非所有 Erlang 应用程序都需要消息传递!此外,并非所有 Erlang 应用程序都需要使用gen_servers. 对于涉及连接的应用程序(例如 Web 应用程序),让我们真正分析一下您需要gen_server.

Web 服务器(Yaws)本质上会产生一个进程来处理每个传入的请求。现在,在您的应用程序中,可能会发生以下情况:

1. 您也可能会生成另一个进程来处理请求,然后将
答案作为消息发送给第一个进程
2. 您可能只是通过不同模块中的一堆顺序代码来处理请求
,例如直接发送给 mnesia 或通过 odbc 连接等
现在,在 的情况下1,您已经在增加每个请求的进程数。大多数应用程序将与 case 足够并行2。这一切是怎么gen_server来的?

Agen_server是许多事物的抽象。但是,a 仍然会gen_server处理 requests one-by-one,同时也会产生故障点。当然,当它失败时,有一个restart strategy会提出来的。因此,如果您gen_server介于两者之间yaws并说mnesiaan odbc connection to MySQL / Oracle / e.t.c.然后,则执行的并行化yaws是浪费时间,因为 gen_server 正在按顺序为这些进程提供服务。然而,现在,如果每个进程都通过一堆顺序代码来获得答案,那么好处是巨大的。

实际上,我之前创建了一些SOA应用程序,但它们是RESTFUL自然的。我发现实际上,如果他们在数据库中获取信息的路径中有一个,那么使用说yaws appmods(他们基本上RESTFUL已经)会很浪费。在应用程序的速度和稳定性方面gen_server消除了改进的性能。gen_server有时,mailbox / message boxgen_server的进程可能会变得太大,并且会减慢整个系统的速度,因为进程将等待答案。另一件事,因为消息在 erlang 虚拟机中被复制到各处,内存成为问题。作为您的问题的参考示例,打开这本书(Franceso and Simpsons Erlang Book)并查看 page 110,在标题下A Case Study on Concurrency-Oriented Programming,它们向您展示了流​​程设计模式、坏方法和好方法。

于 2012-08-03T08:44:33.757 回答