这是一个关于消息传递的问题。这特别涉及用 C# 编写的内部应用程序。但它有一个类似于 erlang 的本土“消息传递”系统。
好的,我们希望可以向 erlang 人员或文档学习,以找到解决几个消息传递挑战的优雅解决方案。但是很可惜,在在线阅读了 erlang 文档和论坛之后,这些主题似乎没有得到解决——我们可以找到。
所以问题是:在erlang中,向进程发送消息的队列何时满?erlang 是否处理队列满的情况?或者 erlang 中的消息传递队列是无限的 - 仅受系统内存限制?
好吧,在我们的系统中,它涉及处理金融数据流,可能会从磁盘读取数十亿个信息元组,每个金融信息元组在金融世界中被称为“tick”。
因此有必要对我们系统中每个“进程”的队列大小进行限制。我们在每个队列中任意选择最多 1000 个项目。现在,这些队列很快就完全被滴答消息填满了。
问题在于,除了滴答声之外,进程还需要相互发送其他类型的消息,但是滴答声会填满队列,从而阻止任何其他类型的消息通过。
作为“创可贴”解决方案(这是混乱的),每个消息类型允许每个进程有多个队列。所以一个进程会有一个tick queue,一个command queue,一个fill queue,等等。
但是 erlang 通过为每个携带不同消息类型的“进程”设置一个队列,看起来更加简洁。但同样,它如何处理队列被仅一种消息类型的洪水所占据?
所以也许这是一个关于erlang内部的问题。erlang 内部是否对队列中的消息类型有单独的限制?还是它在内部对每种类型的消息都有一个单独的队列?
无论如何,发送进程如何知道队列太满而无法接收某些类型的消息?发送失败?这是否意味着在 erlang 中无法发送错误处理变得必要?
在我们的系统中,它会跟踪队列何时满,然后阻止任何进程运行,该进程将尝试添加到满队列,直到该队列有更多空间。这避免了混乱的错误处理逻辑,因为进程一旦被调用,就保证有空间发送一条消息。
但同样,如果我们将多种类型的消息放在同一个队列中。其他必须通过的消息类型将被阻止。
我可能错误地认为 erlang 不是为处理这种情况而设计的,因此它可能无法解决队列被大量单一消息类型填满的问题。
但是我们希望有人知道如何回答这一点,以提供涵盖此特定场景的良好参考信息或书籍。