在Erlang中为PostgreSQL编写网关是个好主意吗?

时间:2012-09-11 16:32:27

标签: postgresql erlang gateway

我正在Erlang中编写一个Web应用程序,并希望将我的数据存储到PostgreSQL。

我的应用程序中有两种资源。一种非常重要,而另一种则不那么重要。

  • 对于重要的一个,不允许数据丢失。
  • 对于较不重要的一个,由于系统故障导致的数据丢失是可以的。

我希望获得最大的效率并提出这样的想法:为PostgreSQL编写一个网关。网关是gen_server,业务逻辑(BL)部分可以与网关通信以存储资源。

  • 为了存储重要资源,BL部分将要存储的资源发送到网关,阻止receive一条消息(成功或失败),最后用户回复一个网页。
  • 为了存储不太重要的资源,BL部件仅将资源发送到网关而不阻塞。发送资源后,BL部分直接回复网页。

我对此想法的期望是每个请求的秒数,因为大部分资源都不太重要。但我想知道这是不是一个好主意,换句话说,我能真正得到我所期待的吗?

请根据您的经验或一些可靠的“网络搜索结果”回答。谢谢。 : - )

1 个答案:

答案 0 :(得分:4)

我可以看到您的提案存在两个问题:

  1. 发送到gen_server网关的所有消息都将被序列化(阻塞或非阻塞)
  2. 如果gen_server网关进程崩溃,您至少会丢失进程邮箱中的邮件。
  3. 我要做的是创建一个负责数据库交互的辅助模块(不是进程)。此过程将使用支持连接池的postgresql库(因此对DB的调用可以具有一些并行性)。

    如果您希望对不太重要的资源执行非阻塞数据库操作,只需生成一个进程来进行数据库交互并继续。

    postgresql erlang库的一些链接(我没有使用过):

    Postgresql connection pooling in Erlang

    http://zotonic.com/page/519/epgsql-postgresql-driver