0

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

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

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

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

  • 为了存储重要的资源,BL部分将要存储的资源发送到网关,并阻塞receive一个消息(成功或失败),最后以网页响应用户。
  • 对于存储不太重要的资源,BL部分只将资源发送到网关而不阻塞。发送资源后,BL 部件直接以网页响应。

我对这个想法的期望是每个请求的秒数更少,因为大多数资源都不那么重要。但我想知道这是否是一个好主意,或者换句话说,我真的能得到我所期待的吗?

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

4

1 回答 1

4

我可以看到你的提议有两个问题:

  1. 所有发送到 gen_server 网关的消息都会被序列化(阻塞或非阻塞)
  2. 如果 gen_server 网关进程崩溃,您至少会丢失进程邮箱中的消息。

我要做的是创建一个负责数据库交互的帮助模块(不是进程)。此过程将使用支持连接池的 postgresql 库(因此对 DB 的调用可以具有一些并行性)。

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

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

Erlang 中的 Postgresql 连接池

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

于 2012-09-11T18:39:08.880 回答