Ошибка конфликта при многократном обновлении объекта данных с помощью 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 ****")] ")


person Rancid    schedule 31.07.2018    source источник


Ответы (1)


Существует ограничение на частоту, с которой вы можете обновлять объект, из-за распределенной отказоустойчивости, которую обеспечивает DataStore. Рекомендуется обновлять не чаще одного раза в секунду, хотя на практике вы, вероятно, можете превысить это количество раз в несколько раз.

Вы можете прочитать документацию о конфликтах между хранилищами данных. Согласно документу, если вы ожидаете обновлять отдельную сущность или писать в группу сущностей чаще, чем несколько раз в секунду, лучше заранее переделать свой дизайн, чтобы избежать возможных конфликтов после развертывания приложения.

Один из возможных вариантов - использовать счетчики сегментирования.

person Federico Panunzio    schedule 01.08.2018