消息传递像C#中的erlang一样非常大的数据流

时间:2012-01-03 03:03:22

标签: c# erlang message-queue message-passing

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

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

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

在我们的系统中,它涉及处理一系列财务数据,可能从磁盘读取数十亿个元组信息,每个财务信息元组在金融世界中称为“滴答”。

因此有必要在我们的系统中为每个“进程”的队列大小设置一个限制。我们在每个队列中任意选择最多1000个项目。现在这些队列很快就会被刻度消息填满。

问题是,除了刻度之外,进程还需要向对方发送其他类型的消息,但是勾号会填满队列,防止任何其他类型的消息被传递。

作为“乐队援助”解决方案(混乱),每个消息类型允许每个进程多个队列。因此,进程将有一个tick队列,一个命令队列和一个fill queue等等。

但是,通过为每个携带不同消息类型的“进程”提供单个队列,erlang似乎更加清晰。但同样,它是如何处理由于只有一种消息类型泛滥而导致的队列?

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

在任何情况下,当队列太满而无法接收某些类型的消息时,如何发送进程?发送失败了吗?这是否意味着错误处理在erlang中因无法发送而变得必要?

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

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

我的错误印象是,erlang并不是为处理这种情况而设计的,所以它可能无法解决队列中充斥着单一消息类型的问题。

但我们希望有人知道如何回答这一点,以及涵盖这一特定情况的好的参考信息或书籍。

2 个答案:

答案 0 :(得分:3)

Erlang将所有消息发送到单个队列,系统内存是队列大小的上限。如果要为消息设置优先级,则必须先扫描整个队列以获取高优先级消息,然后再获取低优先级消息。

有很多方法可以通过生成处理程序流程来解决这个问题,这些流程可以限制流量并确定流量优先级,但是erlang VM本身并不支持它。

答案 1 :(得分:1)

回答评论中的其他问题:

  

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

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