Ошибка конфликта при многократном обновлении объекта данных с foreach в C#
Как можно оптимизировать обновление объекта, когда этот объект обновляется много раз в секунду по запросу сервера? Метод, используемый для обновления, разработан следующим образом:
public async Task<bool> Update(T entity, string key)
{
try
{
MakeConnection();
var trans = _db.BeginTransaction();
var type = typeof(T);
var keyFactory = _db.CreateKeyFactory(type.Name);
var task = trans.Lookup(keyFactory.CreateKey(key));
if (task != null)
{
_cache.KeyCache[type.Name] = _db.CreateKeyFactory(type.Name);
var entities = _mapper.Map<Entity>(entity);
task = entities;
trans.Update(task);
}
await trans.CommitAsync();
}
catch (Exception e)
{
throw new InvalidOperationException($"An error occurred, {e}");
}
return true;
}
и это ошибка:
InvalidOperationException: произошла ошибка, Grpc.Core.RpcException: Status(StatusCode=Aborted, Detail="слишком много конфликтов на этих объектах хранилища данных. Пожалуйста, попробуйте еще раз. Группы объектов: [(app=p~******** *********, "76fcb9c1-009e-****-b54f-68a45e9c****")]")
1 ответ
Существует ограничение на частоту, с которой вы можете обновлять объект, из-за распределенной отказоустойчивости, которую обеспечивает DataStore. Рекомендуется обновлять не чаще, чем раз в секунду, хотя на практике вы можете превысить это в несколько раз.
Вы можете прочитать документацию о споре в Datastore. Согласно документу, если вы планируете обновлять одну сущность или записывать в группу сущностей более нескольких раз в секунду, лучше перерабатывать свой проект на ранних этапах, чтобы избежать возможных конфликтов после развертывания приложения.
Одним из возможных вариантов является использование счетчиков Sharding.