Карта Twilio.Sync часто не может получить 300 единиц

1

Я разрабатываю Twilio Sync.

Я использую Map, вставляю элементы более чем 300 элементов.

Чтобы получить все элементы, я вызываю функцию getItems.

Получите на 50 пунктов, рекурсивный вызов получите все предметы.

Затем часто возникает ошибка ниже.

  1. syncsjs генерирует исключение, а сообщения - это Maximum attempt time limit reached.

Но код состояния Http - 200.

  1. Сообщение об исключении - Rate limit exceeded for read-map-MAPSID.

Код состояния Http - 429.

Эти ошибки часто возникают, но редко удаются.

Как я могу получить стабильные все элементы карты.

Теги:
twilio
synchronization

1 ответ

1

Я ведущий продукт Sync. Я считаю, что мы видели эту проблему раньше, и это, вероятно, одно из следующих:

  1. Периодически вызывая getItems (вместо того, чтобы полагаться на события "itemUpdated")
  2. getItems вызов getItems (т.е. для каждого щелчка мыши) или
  3. Пейджинг неправильно.

Я не знаю, что влияет на вас наиболее конкретно, но второе является наиболее показательным.

Запросить элементы слишком часто (не делайте этого):

$('#something').mouseUp(event => {
  …
  mySyncMap.getItems(/* everything */)
    .then(paginator => {
      displayInUi(paginator.items);
    });
});

Это кажется неоднородным, но поскольку для запроса нет конкретного начала и конца запроса, Sync не может использовать локально кэшированные данные. Он будет запрашивать все снова, что приведет к тому, что вы столкнетесь с ограничениями скорости синхронизации, в частности, "скорость чтения объектов". Поскольку вы видите ошибки HTTP 429, это, вероятно, происходит.

Запросить один раз, а затем обновить пользовательский интерфейс.

В большинстве случаев вы не должны использовать getItems() внутри обработчиков событий пользовательского интерфейса. Вместо этого используйте локальную коллекцию для хранения запрошенных элементов после инициализации:

let everything = {}
let pageHandler = function(paginator) {
  paginator.items.forEach(function(item) {
    everything[item.key] = item.value;
  });

  if (paginator.hasNextPage) {
    return paginator.nextPage().then(pageHandler);
  } else {
    drawUiWith(everything)
    return null;
};

map.getItems({ from: 'myKey', order: 'asc' })
  .then(pageHandler)
  .catch(function(error) {
    console.error('Map getItems() failed', error);
  });

... и перерисовывать, когда элементы меняются.

map.on('itemUpdated', event => {
  if (! event.isLocal)  # echo suppression, perhaps
    everything[event.item.key] = item.value;
    drawUiWith(everything);
});

Еще более эффективным было бы иметь функцию drawOneItem, но иногда это не практично.

О бесконечных петлях

Бесконечные циклы представляют собой сложную ошибку для диагностики, не видя ваш код, но это не необычная ошибка. Мы добавили фрагмент кода для подкачки элементов карты в нашу последнюю документацию SDK. Возможно, это поможет.

Надеюсь, это поможет!

  • 0
    Спасибо за ваш ответ! Моя программа вызывает getItems () при каждом открытии веб-страницы. И пользователи 300 оверов. Я думаю, часто запрашивать слишком много. Итак, я буду модифицировать свою программу, а не каждый раз запрашивать. Попробуйте изменить запрос один раз.
  • 0
    twilio.com/docs/api/sync/sync-limits Могу я задать дополнительный вопрос? Согласно приведенному выше документу, скорость записи / чтения объектов 20/s per object . Этот object означает на карте? Или за элемент карты?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню