Я создаю приложение с RethinkDB, и я собираюсь переключиться на использование changefeeds. Но я столкнулся с архитектурным выбором, и я хотел бы получить совет.RethinkDB сменяет производительность: архитектурный совет?
Мое приложение в настоящее время загружает все пользовательские данные из нескольких таблиц при входе пользователя в систему (отправляет все это во внешний интерфейс), а затем обрабатывает запросы от внешнего интерфейса, изменяет базу данных и готовит и отправляет измененные элементы пользователям. Я бы хотел переключить это на changefeeds. Как я вижу это, у меня есть два варианта:
- Настройте единую замену для каждой таблицы. Отфильтруйте пользователей, подключенных к определенному серверу, и распределите их вручную. Эти замены не всегда закрываются, например. они имеют срок службы моих серверов.
- Когда пользователь входит в систему, настройте индивидуальное изменение для этого пользователя только для данных этого пользователя (используя
getAll
со вторичным индексом). Поддерживайте столько изменений, сколько есть в настоящее время вошедших в систему пользователей. Закройте их, когда пользователи выходят из системы.
Решение №1 имеет большой недостаток: у замены RethinkDB нет понятия времени (или номера версии), как например Kafka. Это означает, что нет возможности загружать исходные данные и b) получать изменения, которые произошли с начальной загрузки. Существует временное окно, в котором изменения могут быть потеряны: между начальной загрузкой данных (a) и моментом, когда настроен changefeed (b). Я нахожу это тревожным.
Решение # 2 кажется лучше, потому что includeInitial
может использоваться для получения исходных данных, а затем без изменений. Мне пришлось бы иметь дело с начальной загрузкой (быстрее загружать один дамп всех данных, чем обрабатывать тысячи обновлений), но это кажется более «правильным». Но как насчет масштабирования? Я планирую обрабатывать до 1 тыс. Пользователей на сервер - RethinkDB подготовлен для обработки тысяч изменений, каждый из которых представляет собой запрос getAll
? Фактическая активность в этих изменениях будет очень низкой, это просто число, о котором я беспокоюсь.
Руководство RethinkDB немного немногословное о масштабировании changefeed, говоря, что:
Changefeeds выполняет также их масштабирование, хотя они создают дополнительные сообщения Внутрикластерных пропорционально количество серверов с открытыми соединениями подач на каждый написать.
Решение №2 создает еще много каналов, но количество серверов с открытыми кормовыми соединениями фактически одинаково для обоих решений. И «changefeeds работают хорошо, поскольку они масштабируются» недостаточно для продолжения :-)
Мне также будет интересно узнать, какие рекомендуемые методы обработки перезагрузок сервера/обновлений и отключений. Как я вижу это, если что-то происходит с RethinkDB, клиенты должны выполнить полную загрузку данных (используя includeInitial
) после повторного подключения, потому что нет способа узнать, какие изменения были потеряны во время простоя. Это то, что делают люди?
Благодарим за ответ! Я решил пойти с подходом № 2 (один переход на одного пользователя). Я не уверен, понимаю ли вы то, что вы подразумеваете под «дедупликацией». В моем случае нет совпадений между наборами пользовательских данных, поэтому каждый запрос производит отчетливое изменение. Я подозреваю, что не понимаю, что такое «дубликаты», которые могут закончиться путешествием по сети. –
В вашем случае их может не быть. Много раз несколько пользователей получат такое же изменение - например, если у вас есть changefeed для каждого пользователя в таблице 'messages', и сообщение отправляется нескольким пользователям. – mlucy