现在我正在做过程!消息,但正如我google了一下,消息队列大小仅限于内存。我有一个进程树,其中叶子生成消息并提供给根,我需要限制队列或切换到另一种方法来做同样的事情。
更多的是,有时Process会从一片叶片中获取消息,有时从两片叶片中获取消息。在第二种情况下,我需要不同的有限队列的屋檐叶。
答案 0 :(得分:8)
没有内置机制来限制进程的消息队列大小。
erlang中常见的解决方案是在生产者和消费者之间引入流量控制协议。这可以像发送方在发送下一条消息之前等待continue
回复一样简单。您可以发明更复杂的流控制协议(窗口,...),但通常发送/等待回复都可以。 gen_server:call/2
协议是一个很好的请求 - 响应协议,可以通过查看gen_server
和gen:call
的代码来重复使用 - 它会处理很多边缘情况。可能的。
另一种方法是通过系统提取消息而不是推送消息 - 在这种情况下,接收方会在发送消息准备好时要求发送方发送消息。虽然如果您有外部生产者,您无法对其进行速率限制或缓冲,那么您可能没有这个选项。
答案 1 :(得分:2)
RabbitMQ以Credit Flow的形式实现了这一点。有关此博客文章的更多信息:http://videlalvaro.github.io/2013/09/rabbitmq-internals-credit-flow-for-erlang-processes.html
答案 2 :(得分:1)
处理第二种情况的经典方法是在邮件中包含发送过程的Pid
。这对于通常具有类似于{SendingPid,Data}
的结构的erlang消息非常常见。这允许接收处理两者以查看谁发送了消息,并使用receive
中的模式匹配来选择它希望从哪个进程接收消息。
这是erlang如何在一个消息队列中多路复用来自许多不同发送者的消息,而不是被迫在任何地方处理所有可能的消息。