簡體   English   中英

Azure Cosmos DB MongoDB API 4.0 事務異常處理

[英]Azure Cosmos DB MongoDB API 4.0 transactions exception handling

描述

我正在開發一個應用程序,該應用程序需要處理對 MongoDB 文檔所做更新的同步。 為此,我正在使用 Azure Cosmos DB MongoDB API 4.0,它支持多文檔事務

問題

有時,我在事務中的更新期間遇到以下異常:
 MongoDB.Driver.MongoCommandException: Command update failed: Error=112, Details='Response status code does not indicate success: Conflict (409); Substatus: 5403; ActivityId: 88cc0f1f-708b-4c42-9ba7-70e367f16fe3; Reason: ({ "Errors": [ "Conflicting request to resource has been attempted. Retry to avoid conflicts." ] });. at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ProcessResponse(ConnectionId connectionId, CommandMessage responseMessage) at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken) at MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocolAsync[TResult](IWireProtocol`1 protocol, ICoreSession session, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.ExecuteAsync[TResult](IRetryableWriteOperation`1 operation, RetryableWriteContext context, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchesAsync(RetryableWriteContext context, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteAsync(IWriteBinding binding, CancellationToken cancellationToken) at MongoDB.Driver.OperationExecutor.ExecuteWriteOperationAsync[TResult](IWriteBinding binding, IWriteOperation`1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.ExecuteWriteOperationAsync[TResult](IClientSessionHandle session, IWriteOperation`1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.BulkWriteAsync(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionBase`1.UpdateOneAsync(FilterDefinition`1 filter, UpdateDefinition`1 update, UpdateOptions options, Func`3 bulkWriteAsync)

我嘗試多次重試失敗的更新操作(延遲 1000 毫秒),但沒有任何運氣。

每次重試都以相同的異常消息結束。

最后,異常消息變為:

 MongoDB.Driver.MongoCommandException: Command update failed: Error=2, Details='Response status code does not indicate success: BadRequest (400); Substatus: 1101; ActivityId: bcb86266-aa9a-4a2d-9841-7f451d6c72ee; Reason: (Message: {"Errors":["Transaction is not active"]}

我相信最后一個例外是不同的,因為事務超時(文檔中的超時 = 5 秒)。

問題

  1. 使用 Azure Cosmos DB MongoDB API 時,如何優雅地從多文檔事務期間發生的異常中恢復?
  2. 任何人都可以提供有關列出的異常消息的任何其他信息嗎? 例如:如何調試、處理、恢復它們? (任何信息都非常受歡迎)

你很擅長診斷錯誤。 Azure Cosmos DB API for MongoDB 具有列出常見錯誤和解決方案的文檔。

(1) 當另一個事務或寫操作正在使用同一個文檔時,會發生 112 錯誤。 重試操作直到成功是推薦的解決方案。

(2) 如您所述,第二個錯誤-“事務未激活”表示已超過 5 秒超時。 是否可以限制 scope 在多文檔事務中進行的操作?

另一種可能性是,如果由於可用的 RU(吞吐量)數量不足而限制操作(並在服務器端重試),操作花費的時間比預期的要長。 檢查這一點的一個好方法是查看標准化 RU 消耗是否達到 100% 並啟用服務器端重試(默認情況下啟用)。 如果是這種情況,增加 RU(吞吐量)的數量應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM