1

这是一个关于消息传递的问题。这特别涉及用 C# 编写的内部应用程序。但它有一个类似于 erlang 的本土“消息传递”系统。

好的,我们希望可以向 erlang 人员或文档学习,以找到解决几个消息传递挑战的优雅解决方案。但是很可惜,在在线阅读了 erlang 文档和论坛之后,这些主题似乎没有得到解决——我们可以找到。

所以问题是:在erlang中,向进程发送消息的队列何时满?erlang 是否处理队列满的情况?或者 erlang 中的消息传递队列是无限的 - 仅受系统内存限制?

好吧,在我们的系统中,它涉及处理金融数据流,可能会从磁盘读取数十亿个信息元组,每个金融信息元组在金融世界中被称为“tick”。

因此有必要对我们系统中每个“进程”的队列大小进行限制。我们在每个队列中任意选择最多 1000 个项目。现在,这些队列很快就完全被滴答消息填满了。

问题在于,除了滴答声之外,进程还需要相互发送其他类型的消息,但是滴答声会填满队列,从而阻止任何其他类型的消息通过。

作为“创可贴”解决方案(这是混乱的),每个消息类型允许每个进程有多个队列。所以一个进程会有一个tick queue,一个command queue,一个fill queue,等等。

但是 erlang 通过为每个携带不同消息类型的“进程”设置一个队列,看起来更加简洁。但同样,它如何处理队列被仅一种消息类型的洪水所占据?

所以也许这是一个关于erlang内部的问题。erlang 内部是否对队列中的消息类型有单独的限制?还是它在内部对每种类型的消息都有一个单独的队列?

无论如何,发送进程如何知道队列太满而无法接收某些类型的消息?发送失败?这是否意味着在 erlang 中无法发送错误处理变得必要?

在我们的系统中,它会跟踪队列何时满,然后阻止任何进程运行,该进程将尝试添加到满队列,直到该队列有更多空间。这避免了混乱的错误处理逻辑,因为进程一旦被调用,就保证有空间发送一条消息。

但同样,如果我们将多种类型的消息放在同一个队列中。其他必须通过的消息类型将被阻止。

我可能错误地认为 erlang 不是为处理这种情况而设计的,因此它可能无法解决队列被大量单一消息类型填满的问题。

但是我们希望有人知道如何回答这一点,以提供涵盖此特定场景的良好参考信息或书籍。

4

2 回答 2

3

Erlang 将所有消息发送到单个队列,系统内存是队列大小的上限。如果要对消息进行优先级排序,则必须在获取低优先级消息之前扫描整个队列以查找高优先级消息。

有一些方法可以通过生成处理程序进程来限制和优先处理流量,但是 erlang VM 本身不支持它。

于 2012-01-03T08:56:21.753 回答
1

回答评论中的附加问题:

即使在 Safari 在线书籍中,主要的也从未说明消息是如何在 erlang 上传递的。很明显,他们没有使用“共享内存”。那么他们是如何沟通的呢?在同一台机器上是通过环回 tcp/ip 吗?

在一台虚拟机中,消息在分配给进程的内存区域之间简单地复制(除了足够大的二进制文件;对它们来说,复制指针)。如果您在同一台机器上启动多个 Erlang VM,它们可以通过 TCP/IP 进行通信。

于 2012-01-03T12:15:23.053 回答