2

我在 Erlang 中创建了一个连接池进程,它有子进程(每个都是一个连接)。连接池进程(主管)需要保存所有子子进程的状态,例如指示子进程是否可供请求者租用的标志。此状态存储在 ETS 表中

泳池大师:

  • 连接过程1
  • 连接过程2
  • 连接过程3

当客户端请求到 POOL-MASTER 的连接时,它必须通过查看 ETS 并获取状态来找出可用的连接进程。这个阶段被称为“ get-lease ”。然后状态被更新。类似地,当客户端将连接返回到池时,它使用“ return-lease ”函数将项目标记为可供下一个客户端使用。

我想让上面的函数“ get-leasereturn-lease ”是线程安全的。换句话说,我想确保没有客户端同时使用这些功能,否则连接的状态可能会混淆(两个客户端获得相同的连接)。在 java 中,将使用同步方法来实现此目的。

erlang 中有什么可以实现的吗?例如 ETS 表上的某种锁定机制,然后重新锁定?或者是否应该创建一个处理要锁定/解锁的特定功能并将消息发送到该进程的单个进程(假设消息传递是单线程的)?

4

2 回答 2

3

一种方法是建立一个专门用于通过消息传递管理租约的流程。向该进程发送一条 get_lease 消息。它将接收租约消息,从而序列化访问,并在租约可用时向请求进程发送回复消息。承租人将向经理发送 return_lease 消息,经理会将租约添加回空闲列表。

经理还必须对获得租约但未能归还租约的流程采取一些措施。这是一个租约,所以大概有一个可以用于此的到期,但经理也应该监控承租人并在承租人失败时释放租约。

于 2013-10-26T13:15:13.820 回答
3

线程安全?它是什么 ?Erlang 不知道 :)因为我们处理进程之间的消息传递。这确保了对任何结构(由服务器 erlang 进程维护)的访问将始终以序列化方式[与Don Branson提到的相同。]

我会做的是:

1.创建一个由supervisor进程监控的gen server进程。

2. 此服务器进程将是您的 ETS 表的管理器,并公开 API/方法以供客户端调用以请求和释放连接。

3.请求将由handle_call(用于同步调用)或handle_cast(用于异步调用)处理

4. 您甚至可能希望通过迭代您的 ETS 表并根据某些条件从其中删除来实现一些超时功能以释放连接

以上内容也可以很好地为您提供不错的性能(如果您想到性能)。并且没有竞争条件,因为访问是序列化的。

于 2013-10-26T14:32:05.987 回答