2016-05-29 3 views
10

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

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

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

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

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

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

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

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

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

ответ

6

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

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

+0

Благодарим за ответ! Я решил пойти с подходом № 2 (один переход на одного пользователя). Я не уверен, понимаю ли вы то, что вы подразумеваете под «дедупликацией». В моем случае нет совпадений между наборами пользовательских данных, поэтому каждый запрос производит отчетливое изменение. Я подозреваю, что не понимаю, что такое «дубликаты», которые могут закончиться путешествием по сети. –

+2

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

Смежные вопросы