【问题标题】:What guarantees does erlang's "monitor" give?erlang 的“监视器”给出了什么保证?
【发布时间】:2014-06-19 18:35:15
【问题描述】:

在阅读 ERTS 用户指南时,我发现了以下部分:

给出的唯一信号排序保证如下。如果一个实体向同一个目的地发送多个信号 实体,订单将被保留。也就是说,如果 A 向 B 发送信号 S1,然后再向 B 发送信号 S2,则 S1 是 保证不会在S2之后到达。

我在做进一步的研究谷歌搜索时也遇到过这个问题:

Erlang 参考手册,13.5:

消息发送是异步且安全的,只要接收者存在,消息就可以保证最终到达接收者。

这似乎很模糊,我想知道在以下情况下我可以依赖什么保证:

 A,B are processes on two different nodes.
 Assume A does not crash and B was a valid node at some point.
 A and B monitor each other.
 A sends messages M1,M2,M3 to B

在上述场景中,是否有可能B收到M1,M3(M2被丢弃), 在 A 处没有收到任何类型的“DOWN”/“EXIT”/心跳超时?

【问题讨论】:

  • 真的取决于A和B代表什么。在本地进程的情况下,这是不可能的:所有消息都将被 B 接收(尽管 B 可能在处理 M2 或 M3 之前崩溃)。在远程进程的情况下,这是极不可能的,但是是的,这意味着节点之间会断开连接。
  • @Soupd'Campbells 你有可以支持它的文档链接吗?特别是,这是“保证”,而不仅仅是其实施方式的结果?
  • 我已经用更具体的场景更新了这个问题。

标签: erlang message-passing


【解决方案1】:

通读erlang mailing-list 和academic faq,似乎ERTS 实现提供了一些保证,但是我无法确定它们是否在语言/规范级别也得到保证.

如果您假设TCP 是“可靠的”,那么当前的实现保证
给定A,B是不同节点(&主机)上的进程,A监控B,A发送给B,假设A没有崩溃,两个节点之间的任何消息传递失败*或B上的主机/节点/进程失败将导致收到“DOWN”消息(或在链接的情况下为“EXIT”)。 [见1和2]

*根据我在mailing-list thread 上阅读的内容,该属性几乎完全基于使用 TCP 的事实,因此“消息传递失败”是指 TCP 确定发生故障/连接需要的任何情况关闭。

academic faq 谈到这一点,好像它也是一种语言/规范级别的保证,但是我还找不到任何支持它的东西。

【讨论】:

  • 非正式的规范是:消息要么被传递,要么最终通知你一个问题。 “最终”是关键,因为它可能与其他消息的顺序不符。正如 Per Hedeland 所说,大多数 Erlang 程序员都希望消息传递成功,然后适当地处理错误,通常是通过使相关进程崩溃。
【解决方案2】:

除了订购保证外,没有其他保证。请注意,默认情况下,您甚至不知道发件人是谁,除非发件人在消息中对此进行了编码。

你的例子可能会发生:

  • A 发送 M1 和 M2
  • B 收到 M1
  • B所在节点断开连接
  • B所在的节点又出现了
  • A 将 M3 发送给 B
  • B 收到 M3

在这种情况下,M2 可能会在网络链接上丢失。这不太可能发生,但它可能发生。通常的技巧是对此类错误有某种概念。通过设置超时触发器,或者通过监控作为消息接收者的节点或 Pid。

更新场景:

在更新后的场景中,如果我没看错的话,A 会在某个时候收到'DOWN' 样式的消息,同样,如果您监视节点,它会收到一条消息告诉您节点再次启动.

虽然通常情况下,如果可能的话,最好使用幂等协议对此类事情进行建模。

【讨论】:

  • 如果发送者监视接收者,有没有一种方法会丢失消息而发送者没有收到“DOWN”消息? (假设发件人没有崩溃)
  • 我更新了问题以更好地反映我的具体情况
  • 您总是可以得到“DOWN”或NodeDown 样式的消息。但是,无法保证哪些消息会到达另一端。并且它可能需要一些时间才能确定节点链接已关闭。
  • 我“可以”总是收到 DOWN/etc 消息 - 但会在(更新的)问题中描述的场景中,我总是会收到这样的消息?
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2023-03-02
  • 2010-10-09
  • 1970-01-01
  • 2016-02-12
相关资源
最近更新 更多