Ошибка конфликта при многократном обновлении объекта данных с 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.

Другие вопросы по тегам