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

RethinkDB меняет производительность: архитектурный совет?

Я создаю приложение с RethinkDB, и я собираюсь переключиться на использование changefeeds. Но я столкнулся с архитектурным выбором, и я хотел бы получить совет.

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

  • Настройте одно изменение для каждой таблицы. Отфильтруйте пользователей, подключенных к определенному серверу, и распределите их вручную. Эти замены не всегда закрываются, например. они имеют срок службы моих серверов.
  • Когда пользователь входит в систему, настройте индивидуальное изменение для этого пользователя только для этих пользовательских данных (используя getAll со вторичным индексом). Поддерживайте столько изменений, сколько есть в настоящее время вошедших в систему пользователей. Закройте их, когда пользователи выходят из системы.

Решение №1 имеет большой недостаток: у RethinkDB changefeeds нет понятия времени (или номера версии), как, например, Kafka. Это означает, что нет возможности загружать исходные данные и b) получать изменения, которые произошли с начальной загрузки. Существует временное окно, в котором изменения могут быть потеряны: между начальной загрузкой данных (a) и моментом, когда настроен changefeed (b). Я нахожу это тревожным.

Решение №2 выглядит лучше, потому что includeInitial может использоваться для получения исходных данных, а затем без изменений прерывать последующие изменения. Мне придется иметь дело с начальной загрузкой (быстрее загружать один дамп всех данных, чем обрабатывать тысячи обновлений), но это кажется более "правильным". Но как насчет масштабирования? Я планирую обрабатывать до 1 тыс. Пользователей на сервер - RethinkDB подготовлен для обработки тысяч изменений, каждый из которых представляет собой запрос getAll? Фактическая активность в этих изменениях будет очень низкой, это просто число, о котором я беспокоюсь.

Руководство RethinkDB немного немного о масштабировании изменения, говоря, что:

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

Решение №2 создает еще много каналов, но количество серверов с открытыми кормовыми соединениями фактически одинаково для обоих решений. И "changefeeds работают хорошо, поскольку они масштабируются" недостаточно для продолжения: -)

Мне также было бы интересно узнать, какие рекомендуемые практики для обработки перезагрузок сервера/обновлений и отключений. Как я вижу это, если что-то происходит с RethinkDB, клиенты должны выполнить полную загрузку данных (используя includeInitial) после повторного подключения, потому что нет способа узнать, какие изменения были потеряны во время простоя. Это то, что люди делают?

4b9b3361

Ответ 1

RethinkDB должен иметь возможность обрабатывать тысячи изменений, просто отлично, если на разумном оборудовании. Одно дело, что некоторые люди могут снизить нагрузку на сеть в этом случае - они помещают прокси-сервер node на том же компьютере, что и сервер приложений, и подключаются к нему, поскольку прокси-сервер node знает достаточно, чтобы дедуплицировать входящие сообщения changefeed сети, а также потому, что из основного кластера требуется большая загрузка процессора/памяти.

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