当前位置: 首页 > 知识库问答 >
问题:

Cosmo ChangeFeed-错误、异常和服务失败场景

华展鹏
2023-03-14

所有的,

我正在使用更改源处理器Library.Want了解处理服务故障的最佳方法以及ProcessChangesAsync方法中的异常/错误场景。以下是我所指的事件。

1)服务失败——服务在某些操作过程中处理器库崩溃。如何从同一个文档(故障实例中的文档)启动进程?是否有任何内置机制可以让更改提要从最后一个失败的文档开始?例如。假设,在当前批次中,我们成功处理了10个文档。5然后由于网络故障或其他reasons.Will服务中断,一旦服务重新启动,我的进程从第6个文档开始?如何实现这一点?

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

共有1个答案

曹乐意
2023-03-14

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

2)没有您可以利用的内置机制,处理< code>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.
}

评论的额外信息

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

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    
    }
}
 类似资料:
  • 我有很多不正常的逮捕,但我不明白这怎么可能,因为不明白问题的根源。这是异常逮捕的日志: android.app.远程服务例外: android.app.ActivityThread$H. handleMessage(ActivityThread.java:1881)android.os.Handler.dispatchMessage(Handler.java:105) android.os.Loo

  • 为什么我会出现以下错误?突然,它开始出现这个错误。 失败:生成失败,出现异常。 > 其中:脚本'C:\src\flutter\package\flutter_tools\gradle\flutter.gradle'行:1070 错误:任务:app:compileFlutterBuildDebug的执行失败。 处理“命令”C:\src\flatter\bin\flatter。bat“”以非零退出值1

  • 我运行了一些java代码,它将从示例中上传:storm-starter-topologies-0.9.6.jar,控制台显示: 535[main]INFO backtype.storm.stormsubmitter-上载拓扑jar C:\apachestorm096\examples\storm-starter\storm-starter-topologies-0.9.6.jar到指定位置:–/u

  • 失败:生成失败,出现异常。 > 其中:脚本“C:\Users\lijoj\Documents\flutor\packages\flutter_tools\gradle\flutor”。渐变线:1156 出了什么问题:任务“:应用程序:编译失败”失败。 进程'命令'C:\用户\lijoj\Documents\flutter\bin\flutter.bat"以非零退出值1结束 < li >尝试: 使用

  • 我尝试运行这个gradle任务(通过gradlew) 它使用cucmber jvm 并收到此错误 当我从cmd中的同一路径运行同一行时: 更新1: 这个cmd在shell控制台中工作: ./构建/发行版/WebLarge测试/bin/WebLargeTests-f html:构建/报告/cucumber/-f json:构建/报告/cucumber/report.json--胶水com.waze.