消息传递保证

默认情况下,Orleans 消息传递保证为“最多一次”。 或者,如果配置为超时后重试,Orleans 将改为提供至少一次传递。

在更多详细信息中:

  • Orleans 中的每一个消息有一个自动超时(可以配置确切的超时)。 如果回复未按时到达,则返回的 Task 将中断并出现超时异常。
  • Orleans 可配置为超时后执行自动重试。 默认情况下,不会自动重试。
  • 应用程序代码当然也可以选择在超时后重试。

如果 Orleans 系统配置为不执行自动重试(默认设置),应用程序也不重新发送 - Orleans 提供最多一次消息传递。 一条消息要么传递一次,要么根本不传递。 绝不会传递两次消息。

在配置重试的系统中(无论是由运行时还是由应用程序保证),消息可能多次到达。 Orleans 目前未执行任何操作来持久存储已到达且抑制第二次传递的消息。 (我们认为这会产生高昂成本。)所以,在配置重试的系统中,Orleans 无法对最多一次传递做出保证。

如果继续进行可能无限期地重试,消息将最终到达,从而提供至少一次传递保证。 请注意,“将最终到达”是运行时需要做出的保证。 即使不断重试,也不能随意使用。 Orleans 提供最终传递,因为粒度绝不会进入任何永久的故障状态,发生故障的粒度将最终在另一个接收器上重新激活。

因此,可以总结为:在未配置重试的系统中,Orleans 保证最多一次的传递。 在配置无限重试的系统中,Orleans 保证至少一次(并且不保证最多一次)的传递。

重要

Orleans 技术报告中,我们无意中仅提到了第 2 个选项(配置自动重试)。 我们忘记提及默认情况下,Orleans 默认提供最多一次传递(未配置重试)。