對于我們從 gremlin 查詢中收到的每 200 個狀態代碼,我想檢查結果頂點是否與需要更新的頂點匹配。如果不匹配,請重試。
public async Task<string> ExecuteUpdateQueryAsync(string query, bool ignoreConflict = true)
{
try
{
var repsonse = await Policy
.Handle<ResponseException>(x => (long)x.StatusAttributes["x-ms-status-code"] != (long)HttpStatusCode.Conflict)
.OrResult<ResultSet<dynamic>>(r => r.StatusAttributes["x-ms-status-code"] == 200)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))
.ExecuteAsync(() => gremlinClient.SubmitAsync<dynamic>(query));
logger.LogDebug(query JsonConvert.SerializeObject(repsonse.StatusAttributes));
if (repsonse.Count > 0)
{
return JsonConvert.SerializeObject(repsonse);
}
return default;
}
...
}
編輯:
我們從 Gremlin 客戶端得到的回應類似于:(希望這會有所幫助)
g.V(['1111|2222|3333','1111|2222|3333']).Property('Transaction_Quantity',4500).Property('Transaction_Type','Repack'){"x-ms-status-code":200,"x-ms-activity-id":"a4af8faf-4aa9-4ae2-8dd8-797bdbd80a97","x-ms-request-charge":34.64,"x-ms-total-request-charge":34.64,"x-ms-server-time-ms":7.6626,"x-ms-total-server-time-ms":7.6626}
我希望能夠將此回應中的交易數量與我們嘗試更新的交易數量進行比較。
uj5u.com熱心網友回復:
免責宣告:我不熟悉 CosmosDb 的Gremlin API,因此我對 API 使用的建議可能不正確。我試圖在我的帖子中專注于波莉方面。
因此,根據我的理解,您想根據回應來決定是否需要進行進一步的重試嘗試。如果回應的其中一個欄位與某個值匹配,那么您不應該,否則您應該這樣做。
在 Polly 的情況下Handle,HandleResult、Or和OrResult策略構建器函式正在預測同步謂詞。換句話說,它們被設計為執行簡單的斷言(例如:狀態碼檢查、存在檢查、內部例外型別檢查等……)因此,大多數時候它們是用簡單的 lambda 運算式定義的。
如果您需要執行更復雜/異步的邏輯,那么您應該將該邏輯放在您要裝飾的方法呼叫旁邊。換句話說,該邏輯應該屬于待重試函式。
正如我在免責宣告中所說,我不熟悉 Gremlin API。根據這個 SO 執行緒ResultSet<dynamic>,您可以通過首先將回應反序列化然后將其反序列化為 DTO 來將回應反序列化為YourDto.
private async Task<ResultSet<dynamic>> IssueGremlinQueryAsync(string query)
{
ResultSet<dynamic> results = gremlinClient.SubmitAsync<dynamic>(query);
var parsedResult = JsonConvert.DeserializeObject<YourDto>(JsonConvert.SerializeObject(results));
//TODO: perform assertion against the parsedResult
return results;
}
在這里,您有幾個選項可以將進一步重試的需要傳播回策略:
- 使用其中一項是標志的 ValueTuple
- 使用自定義例外
- 等等。
值元組
private async Task<(bool, ResultSet<dynamic>)> IssueGremlinQueryAsync(string query)
{
ResultSet<dynamic> results = gremlinClient.SubmitAsync<dynamic>(query);
var parsedResult = JsonConvert.DeserializeObject<YourDto>(JsonConvert.SerializeObject(results));
//Replace this with your own assertion
bool shouldRetry = parsedResult.TransactionQuantity % 2 == 0;
return (shouldRetry, results);
}
元組中的第一項是標志,而第二項是未決議的results。
使用此方法,您可以ExecuteUpdateQueryAsync像這樣重構方法的相關部分:
public async Task<string> ExecuteUpdateQueryAsync(string query, bool ignoreConflict = true)
{
//...
var retryPolicy = Policy
.Handle<ResponseException>(x => (long)x.StatusAttributes["x-ms-status-code"] != (long)HttpStatusCode.Conflict)
.OrResult<(bool ShouldRetry, ResultSet<dynamic> Response)>(
x => x.ShouldRetry || (long)x.Response.StatusAttributes["x-ms-status-code"] == 200)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
var response = await retryPolicy.ExecuteAsync(async () => await IssueGremlinQueryAsync(query));
//...
}
例外
private async Task<ResultSet<dynamic>> IssueGremlinQueryAsync(string query)
{
ResultSet<dynamic> results = gremlinClient.SubmitAsync<dynamic>(query);
var parsedResult = JsonConvert.DeserializeObject<YourDto>(JsonConvert.SerializeObject(results));
//Replace this with your own assertion
bool shouldRetry = parsedResult.TransactionQuantity % 2 == 0;
return !shouldRetry ? results : throw new OperationFailedRetryNeededException("...");
}
If we should not retry then we return with the unparsed results otherwise we throw a custom exception.
With this method you can refactor the related part of your ExecuteUpdateQueryAsync method like this:
public async Task<string> ExecuteUpdateQueryAsync(string query, bool ignoreConflict = true)
{
//...
var retryPolicy = Policy
.Handle<ResponseException>(x => (long)x.StatusAttributes["x-ms-status-code"] != (long)HttpStatusCode.Conflict)
.Or<OperationFailedRetryNeededException>()
.OrResult<ResultSet<dynamic>>( x => (long)x.StatusAttributes["x-ms-status-code"] == 200)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
var response = await retryPolicy.ExecuteAsync(async () => await IssueGremlinQueryAsync(query));
//...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/424201.html
標籤:C# 。网 天蓝色 波莉 azure-cosmosdb-gremlinapi
