如何在Erlang中创建一个内存绑定的消息队列?

6
我希望在Erlang中实现异步消息的速度,但仍然需要一些流程控制。我该怎么做?
2个回答

7

现在没有进程内存限制 - 它在邮件列表等讨论中。你可以查看那些线程。

好处是,当你使用OTP模式实现像gen_server这样的东西时,你有很多自由度来从进程队列中检索消息并测量队列的长度。

Rabbitmq中使用的gen_server2通过将消息移动到内部数据结构来优化此过程。 当内部队列太长时,你可以丢弃任何新的传入消息。 你可以静默地执行或通知发送方拒绝该消息。

所有这些都是非常低级别的操作。

RabbitMQ将在AMQP级别上提供此功能。


gen_server2 实现窗口吗? - Eric des Courtis
我不确定gen_server2实现的当前状态。在OTP gen_server中引入消息队列中的非线性匹配后,它可能会与主要实现合并。 - user425720

6

一种常见且相当好的强制流量控制的方法是将精选的消息转化为调用,限制每个客户端可以向服务器加载多少负载,从而以极其简单的方式提供强制反馈。当然,诀窍在于选择使用同步调用的通信方式 :-)


这也是我会采取的解决方案。基本上,在该行中构建一些流程控制。当然,还有更高级的解决方案。 - I GIVE CRAP ANSWERS
1
我不确定我是否理解。您建议在异步之上进行同步调用,以确保消息在客户端排队?我认为这取决于用例。如果客户端是短暂的,我们可能无法承受这种解决方案。 - user425720
问题的核心在于,为了具有任何形式的流程控制,最终都必须有某种形式的同步。如果提供流程的客户端只是通过消息传递进行驱动,我们无法以任何方式限制它。对此的答案往往是首先限制客户端的数量,但这将需要某种集中式的客户端数量知识,这需要同步。因此,最终归结为我们在哪里进行同步。电信应用程序中的常见解决方案是在接口处简单地进行削减,但必须知道何时进行削减 :-) - Jan Henry Nystrom
@JanHenryNystrom 我知道 gen_server:call,但我更感兴趣的是介于两者之间的中间地带。 - Eric des Courtis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接