Azure cosmosdb Cosmo ChangeFeed-错误、异常和服务失败场景';s

Azure cosmosdb Cosmo ChangeFeed-错误、异常和服务失败场景';s,azure-cosmosdb,Azure Cosmosdb,全部, 我正在使用Change Feed处理器库。想知道处理服务故障的最佳方法以及ProcessChangesSync方法中的异常/错误场景。以下是我所指的事件 1)服务失败-在某个操作中间有处理器库崩溃。如何从同一文档(失败实例上的文档)启动流程?是否存在任何内置机制,其中更改提要将从最后一个失败的文档开始?例如,假设在当前批次中,我们有10个文档。5个文档已成功处理,但由于网络故障或其他原因,服务中断。一旦服务重新启动,我的流程是否将从第6个文档开始?如何做到这一点 2) 异常和错误-Pr

全部,

我正在使用Change Feed处理器库。想知道处理服务故障的最佳方法以及ProcessChangesSync方法中的异常/错误场景。以下是我所指的事件

1)服务失败-在某个操作中间有处理器库崩溃。如何从同一文档(失败实例上的文档)启动流程?是否存在任何内置机制,其中更改提要将从最后一个失败的文档开始?例如,假设在当前批次中,我们有10个文档。5个文档已成功处理,但由于网络故障或其他原因,服务中断。一旦服务重新启动,我的流程是否将从第6个文档开始?如何做到这一点

2) 异常和错误-ProcessChangesSync方法中的任何错误都可以在全局级别使用try-catch来处理,但是如何持久化这些失败记录并使其可用于下一批?再次,在change feed process中查找任何可用的内置机制。

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

2) 没有可以利用的内置机制,处理
processchangesync
中的异常是您的责任。您不仅可以添加一个全局try/catch,而且在对文档进行循环的情况下,还可以在循环中添加一个try/catch,以处理失败的文档(可能会将其发送到队列以便稍后进行分析/后期处理),而不会丢失批处理。如果您需要记录这些错误(我假设这就是您所说的持续错误的意思?),那么最新版本与兼容,因此插入您自己的自定义日志非常简单:

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.
}

评论的额外信息

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

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    
    }
}
public异步任务流程changesAsync(IChangeFeedObserverContext上下文、IReadOnlyList文档、CancellationToken CancellationToken)
{
尝试
{
foreach(文档中的var文档)
{
尝试
{
//为文档做你的工作
}
捕获(例外情况除外)
{
//当前文档出现问题,请处理它,将其发送到队列/另一个存储以进行分析、记录。此捕获将使循环继续进行下一个捕获。
}
}
}
捕获(例外情况除外)
{
//发生未处理的事件,请将其记录下来,避免再次抛出,以便处理下一批
}
}

@matisa-感谢您的澄清。如果您能回答更多与检查点相关的问题,那就太好了。感谢您的澄清。如果您能回答更多与检查点相关的问题,那就太好了。1)如果ProcessChangesSync方法没有引发任何异常(异常)那么leaseCollection是否有可能更改延续令牌并处理下一批?2)我的目标是避免在出现错误时处理同一批。如前所述,e、 g.10同一批中的文档和9个成功处理,1个失败,因此不希望重复同一批cz f失败。3)租约如何使用延续令牌,如何更改其值或保留相同值。谢谢。1)是的,如果您通过尝试/捕获来处理错误,请参阅#2。2) 为此,我推荐我在回答中提到的方法。在ProcessChangesSync中添加全局try/catch,在循环中添加try/catch。相应地处理每个文档异常,这样它就不会停止整个批处理。3) 在ProcessChangesSync使用最新处理的批处理令牌完成后更新租约延续令牌。如果ProcessChangesSync失败,则该令牌将保留上一个值,下一批将是失败的(在ProcessChangesSync中生成异常)