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