Eventide Services中的错误处理

一个词最好地概括了服务中的错误处理不要

为了使“ 不要挽救错误”规则更加精确:当然,不要挽救没有明确预期发生的错误。

错误的要点是它们预示着一种非常特殊的情况,以至于无法恢复。 因此,术语“ 异常”错误可互换使用。 在这种特殊情况下,未知数很多,最好的办法是停止做任何事情。 换句话说:终止该过程。

除极少数情况外,通常没有安全的方法来绝对确定是否可以处理和恢复错误状态。 异常可能是由网络故障,数据库故障,服务器硬件故障或编码错误引起的。 此外,所引发的异常可能是所引发的另一种异常的副作用,并且尝试补救该次要异常可能会导致对症状而非原因的意外反应。

简而言之,当出现错误时,请不要试图阻挠。 只是让它使服务崩溃,然后让您在操作系统级别使用的任何过程监视工具通知操作员,或者就是否重新启动服务做出决定。

综上所述,有多种方法可以处理Eventide服务中的错误,并且与并发错误一样,确实有一些罕见的情况下可以或应该处理错误。


当然,不要挽救那些没有明确预期会发生的错误


使用者提供了一种实现通用错误处理程序的机制。

有关消费者的更多信息,请参见:http://docs.eventide-project.org/user-guide/consumers.html

注意:不应使用消费者的错误处理程序来使用错误报告或应用程序监视工具(如AirBrake,RayGun等)来记录错误。组件主机中有特定功能可记录错误。

要处理错误的原因很少。 但是,如果绝对有必要截取错误并对错误做出反应,则可以在使用者类中定义错误处理程序。

当使用者的任何处理程序中引发错误时,它将与错误发生时处理程序正在处理的message_data实例一起传递给使用者的error_raised方法。

消费者错误处理程序

重新引发该错误时,它将导致该服务暂停其托管的其他使用者,然后该服务将安全终止。

还应注意,如果使用者未明确提出错误,则该错误将无法终止服务过程。 消费者错误处理程序应格外小心,以确保它们达到了导致服务终止的自然目的。

在使用者级别上处理错误的主要目的是以通用的方式进行重试。 重试的详细信息超出了本文的范围。

请勿挽救错误规则有一个明显的例外:当使用带有序号的乐观锁定来防止对同一流进行并发写入的不良副作用时,预计消息存储将引发并发错误(在Eventide的情况下,它是MessageStore :: ExpectedVersion :: Error)。

当使用诸如保留模式之类的消息传递模式,或使用多个节点和重试来提供热故障转移配置时,或当从自然并发环境(如Web应用程序)写入事件流时,通常会处理并发错误。


不应使用使用者的错误处理程序来使用错误报告或应用程序监视工具记录错误


组件主机提供了一种记录错误的机制,但不记录错误。

有关组件主机的更多信息,请参见:http://docs.eventide-project.org/user-guide/component-host.html

收到错误的组件主机正在终止中。 无法截获。 它只能被记录。

当主机的任何使用者使用中出现错误时,该错误将被传递到主机的record_error方法。 然后可以将错误发送到错误报告工具。

ComponentHost错误记录器

组件主机的错误记录器的调用是组件主机终止之前要做的最后一件事。


使用者的错误处理程序和组件主机的错误记录器的结合为处理意外错误和预期错误提供了全面的解决方案。 这些工具都在服务的安全运行中发挥作用。

在处理错误时务必格外小心,以免阻止他们终止服务。 并且,当绝对必要时(如重试可恢复错误的情况一样),使用者的错误处理程序也有助于提高服务的弹性和健壮性。