Как бороться с задержкой индекса Elasticsearch

Здесь мой сценарий:

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

Рядом с поиском в режиме реального времени.

В справочнике по elasticsearch вы можете вручную обновить индекс, но говорит, что не нужно делать это на производстве.

... не обновляйте вручную каждый раз, когда вы индексируете документ на производстве; это повредит вашей работе. Вместо этого ваше приложение должно быть осведомлено о природе Elasticsearch в режиме реального времени и принимать во внимание его.

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

Спасибо!

Ответ 1

Даже если вы можете заставить ES обновляться самостоятельно, вы правильно заметили, что это может ухудшить производительность. Одним из решений этого и того, что часто делают люди (включая меня), является создание иллюзии в реальном времени. В конце концов, это всего лишь UX-вызов, а не техническое ограничение.

При перенаправлении в список пользователей вы можете искусственно включить новую запись, которую вы только что создали, в список пользователей, как если бы эта запись была возвращена самой ES. Ничто не мешает вам сделать это. И к тому времени, когда вы решите обновить страницу, новая пользовательская запись будет правильно возвращена ES, и никого не волнует, откуда эта запись, все, что беспокоит пользователя в этот момент, это то, что он хочет видеть новую запись, которая он просто создал, просто потому что мы привыкли мыслить последовательно.

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

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

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

UPDATE:

Для полноты картины этот ответ предшествует ES5, в котором представлен способ убедиться, что вызов индексации не будет возвращаться до тех пор, пока документ не будет виден при поиске по индексу или не вернет код ошибки. Используя ?refresh=wait_for при индексации ваших данных, вы можете быть уверены, что при ответе ES новые данные будут проиндексированы.

Ответ 3

Вот фрагмент кода, который я сделал в своем приложении Angular, чтобы справиться с этим. В компоненте:

async doNewEntrySave() {
    try {
      const resp = await this.client.createRequest(this.doc).toPromise();
      this.modeRefreshDelay = true;
      setTimeout(() => {
        this.modeRefreshDelay = false;
        this.refreshPage();
      }, 2500);
    } catch (err) {
      this.error.postError(err);
    }
  }

В шаблоне:

<div *ngIf="modeRefreshDelay">
  <h2>Waiting for update ...</h2>
</div>

Я понимаю, что это быстрое и грязное решение, но оно показывает, как должен работать пользовательский интерфейс. Очевидно, он ломается, если реальная задержка оказывается больше 2,5 секунд. Любимая версия будет зацикливаться до тех пор, пока новая запись не появится на странице задержки (с ограничением, конечно).

Если вы полностью не перепроектируете ElasticSearch, у вас всегда будет некоторая задержка между успешной операцией индексации и временем, когда этот документ появляется в результатах поиска.

Ответ 4

Данные должны быть доступны сразу после завершения индексации. Пара общих вопросов:

  1. Вы проверили процессор и оперативную память, чтобы определить, облагаете ли вы налогом свой кластер ES? Если это так, вам может потребоваться увеличить конфигурацию оборудования, чтобы учесть это. ES любит оперативную память!

  2. Используете ли вы NAS (сетевое хранилище) или виртуализированное хранилище, такое как EBS? Elastic рекомендует не делать этого из-за задержки. Если вы сможете использовать DAS (с прямым подключением) и SSD, вы будете в гораздо лучшей форме.

Чтобы дать вам пример AWS, переход с экземпляров m4.xlarge на r3.xlarge сделал для нас ОГРОМНОЕ повышение производительности.