Подтвердить что ты не робот

"Слишком много конфликтов" при создании нового объекта в dataStore

дорогой все

Сегодня утром мое приложение GAE сгенерировало несколько журналов ошибок: "слишком много споров по этим объектам хранилища данных. попробуйте еще раз". На мой взгляд, этот тип ошибки возникает только тогда, когда несколько запросов пытаются изменить ту же сущность или сущности в той же группе лиц.

Когда я получил эту ошибку, мой код вставляет новые объекты. Я смущен. Означает ли это, что существует ограничение того, как быстро мы можем создать новый объект?

Мой код определения модели и последовательности вызовов показан ниже:

# model defnition
class ExternalAPIStats(ndb.Model):
    uid = ndb.StringProperty()
    api = ndb.StringProperty()
    start_at = ndb.DateTimeProperty(auto_now_add=True)
    end_at = ndb.DateTimeProperty()

# calling sequence
stats = ExternalAPIStats(userid=current_uid, api="eapi:hr:get_by_id", start_at=start_at, end_at=end_at)
stats.put()  # **too much contention** happen here

Это довольно загадочно для меня. Мне было интересно, как я буду заниматься этой проблемой. Пожалуйста, дайте мне знать, если есть какие-либо предложения.

Ура!

4b9b3361

Ответ 1

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

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

когда "start_at" является виновником. Эта статья объясняется более подробно.

Возможно (хотя и непроверенный) попробуйте сделать ваши пакеты в пакетах. Вы запускаете запросы в поле "start_at"? Если не удалить его индексы, это также устранит проблему.

Как называются puts (т.е. то, что я задавал выше в цикле, вызов нескольких страниц)? С этим может быть проще сузить проблему.