Cosmo ChangeFeed-错误,异常和服务失败方案的

时间:2018-08-20 12:47:40

标签: azure-cosmosdb

全部

我正在使用变更提要处理器库。想知道处理服务失败的最佳方法以及ProcessChangesAsync方法中的异常/错误情况。以下是我所指的事件。

1)服务失败-在某些操作过程中,具有处理器库的服务崩溃了。如何从同一文档(故障实例上的文档)开始该过程?是否有任何内置机制,变更提要将从上次失败的文档开始?例如。假设,在当前批次中,我们成功处理了10个docs.5,然后由于网络故障或其他原因导致服务中断。服务重新启动后,我的流程将从第6个文档开始吗?如何实现呢?

2)异常和错误-可以在全局级别使用try catch处理ProcessChangesAsync方法中的任何错误,但是如何持久保存这些故障记录并使它们可用于下一批?再次,在变更馈送过程中寻找任何可用的内置机制。

1 个答案:

答案 0 :(得分:1)

1)默认情况下,处理器库在成功运行ProcessChangesAsync之后检查点。在最新的library version中,您可以自定义检查点,以在需要时执行手动检查点。如果由于某种原因处理器在检查点之前关闭,那么它将从Leases集合中存储的最后一个成功检查点开始下一个处理。对于您而言,它将再次从第一个文档开始,因此您将永远不会丢失任何更改,但是会遇到双重处理(这是“至少一次”的模型)。

2)您没有可以利用的内置机制,在ProcessChangesAsync中处理异常是您的责任。您不仅可以添加全局try / catch,还可以在循环遍历文档的情况下,在循环内添加try / catch来处理失败的文档(也许将其发送到队列中以供以后分析/后期处理)不会丢失批次。如果您需要记录这些错误(我假设这是持久错误的意思?),那么最新版本与LibLog兼容,因此插入您自己的自定义记录非常简单:

using Microsoft.Azure.Documents.ChangeFeedProcessor.Logging;

var hostName = "SampleHost";
var tracelogProvider = new TraceLogProvider(); //You can use any provider supported by LibLog
using (tracelogProvider.OpenNestedContext(hostName))
{
    LogProvider.SetCurrentLogProvider(tracelogProvider);
    // After this, create IChangeFeedProcessor instance and start/stop it.
}

Source

评论的其他信息

为避免异常导致批次暂停或导致批次重新处理,可以进行如下处理:

public async Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList<Document> documents, CancellationToken cancellationToken)
{
    try
    {
        foreach(var document in documents)
        {
            try
            {
                // Do your work for the document
            }
            catch(Exception ex)
            {
                // Something happened with the current document, handle it, send it to a queue / another storage to analyze, log it. This catch will make the loop continue with the next.
            }

        }
    }
    catch(Exception ex)
    {
        // Something unhandled happened, log it and avoid throwing it again so the next batch is processed    
    }
}