StreamInsight 弹性

当系统中断导致中断 StreamInsight 应用程序对事件的处理时,您通常会对恢复后应用程序的输出的质量和时效性具有要求。

  1. 您希望输出流的内容与尚未发生中断时的内容匹配。

  2. 您希望中断时长尽可能短。

StreamInsight 的 Premium 版本提供可定期将查询状态保存到磁盘的检查点功能。您可以将此功能与输入和输出适配器的相关功能一起使用,实现从中断恢复后输出流的等效性。因为正确编写的输入适配器仅重播自捕获最后一个检查点后缺失的事件,所以,可尽量缩短恢复所用的时间。

主题内容

  • 检查点

  • 三个弹性级别

  • 高水印

  • 无法通过检查点检查保存的事件和状态

  • 输入适配器重播

  • 输出适配器删除重复项

  • 详细信息

检查点

StreamInsight 检查点操作将以一致的形式将查询的状态保存到磁盘。在中断后,可以将查询的状态恢复到其在检查点之时的状态。

单独进行检查点检查并不确保某一查询在没有中断时生成的事件流将等效于在发生中断后生成的事件流。两个问题可能会影响该等效性:

  • **事件可能会丢失。**在检查点后 StreamInsight 接收的事件以及在中断和恢复之间发生的事件不会由检查点捕获。这些事件必须再次提供给服务器以便包含在查询输出中。若要解决此问题,需要借助能够重播缺失的事件的输入适配器。

  • **事件可能是重复的。**在最后一个检查点后、但在中断前由 StreamInsight 生成的事件将在从中断恢复期间在输入适配器按照预期重播事件时再次生成。若要解决此问题,需要借助能够删除这些重复事件的输出适配器。

检查点日志是包含持久化检查点信息的文件组。该日志保存到您在为弹性配置服务器时指定的目录中。该目录应该保留仅供 StreamInsight 使用并且应作为不透明的目录处理。

[页首]

三个弹性级别

有三个可通过 StreamInsight 实现的弹性级别。对级别的选择依赖于您的要求以及您能否更改现有应用程序和适配器。

  1. **状态保持。**您无需对输入适配器或输出适配器进行任何更改,即可使用检查点来保存查询的状态。这一级别的弹性不确保在从中断恢复后生成的流等效于未发生中断时的流,因为在捕获最后一个检查点后发生的事件已丢失。但是,在无需等效结果的情况下以及使用部分输入可实现接近正确的输出的情况下,这一弹性级别是可接受的。

  2. **完整输出。**您可以通过更改输入适配器以重播事件来确保将不会丢失任何事件。来自恢复的查询的输出流将在逻辑上等效于来自未中断查询的输出流的超集,并且其他事件将是未中断流中事件的副本。

  3. **等效输出。**您可以通过更改输入适配器以及更改输出适配器来删除重复事件,确保逻辑上等效的输出。

[页首]

高水印

高水印为直到事件流中特定点的可见的最高应用程序时间。在请求某一检查点时,StreamInsight 将捕获每个输入上截至高水印的检查点。

[页首]

无法通过检查点检查保存的事件和状态

为了理解在从中断恢复后“完整的”和“等效的”输出的先决条件,识别无法通过 StreamInsight 检查点检查保存的事件和状态将会很有用。这些事件和此状态必须单独保存,以便在从中断恢复后可用。

无法通过检查点检查保存的事件或状态

解决方法

在最后一个检查点之后、但在中断前到达的事件

为了在从中断恢复后可用于重播,必须将这些事件保存在数据存储区中。

在中断过程中到达的事件

为了在从中断恢复后可用,必须将这些事件保存在数据存储区中。

在最后一个检查点后、但在中断前已作为输出生成的事件的知识

为了支持在恢复后由输出适配器删除重复的事件,必须将这些事件保存在数据存储区中。

自定义输入适配器或输出适配器维护的任何状态

为了在从中断恢复后可用,必须将此状态保存在自定义输入适配器或输出适配器的数据存储区中。

[页首]

输入适配器重播

在某一 StreamInsight 应用程序在中断后重新启动时,对输入适配器工厂的 Create 方法的调用将向该适配器工厂提供高水印。(该适配器工厂必须实现 IHighWaterMarkInputAdapterFactory 或 IHighWaterMarkTypedInputAdapterFactory 接口,以便接收此信息。)输入适配器应该从高水印重播其输入流。

所有输入适配器的正确的重播确保输出是“完整的”。

因此,“完整的”输出具有以下要求:

  • 实现 IHighWaterMarkInputAdapterFactory 或 IHighWaterMarkTypedInputAdapterFactory 接口的输入适配器工厂。

  • 在中断前捕获的最后一个检查点后发生的所有事件恢复后的可用性。

  • 在中断过程中发生的所有事件恢复后的可用性。

  • 所有输入适配器对这些事件的正确重播。

  • 查询状态的检查点检查和恢复。

[页首]

输出适配器删除重复项

为了标识输出流中检查点的位置,对输出适配器工厂的 Create 方法的调用既提供高水印,也提供距此高水印的偏移值。(该适配器工厂必须实现 IHighWaterMarkOutputAdapterFactory 或 IHighWaterMarkTypedOutputAdapterFactory 接口,以便接收此信息。)此偏移值是必需的,因为与检查点相对应的输出流中的位置可处于该流中的任何点。

如果某一查询正确重播,则内部查询状态将是截至最后一个检查点之时的状态,并且在执行最后一个检查点之后生成的所有事件都将在重新启动时生成。这意味着,在最后一个检查点之后、但在中断之前作为输出生成的所有事件都将在恢复过程中时再次生成。它们是输出适配器必须删除的重复项。如何删除这些重复项由输出适配器确定;例如忽略重复的副本。

所有输出适配器正确删除重复项(在所有输入适配器都正确重播后)确保输出是“等效的”。

因此,除了上述针对“完整的”输出的要求之外,“等效的”输出还具有以下要求:

  • 实现 IHighWaterMarkOutputAdapterFactory 或 IHighWaterMarkTypedOutputAdapterFactory 接口的输出适配器工厂。

  • 在中断前捕获的最后一个检查点后发生的所有事件恢复后的可用性。(流中的这一位置由在创建时提供给输出适配器工厂的高水印和偏移值标识。)

  • 所有输出适配器对重复事件的正确删除。

[页首]

详细信息

有关如何生成、监视弹性 StreamInsight 应用程序和对其进行故障排除的详细信息,请参阅下列主题:

有关包括重播和取消复制的弹性应用程序的端到端代码示例,请参阅 Codeplex 上的 StreamInsight 示例页中的“检查点示例”。

[页首]