Можно ли использовать композит Meteor для публикации десятков подписок?

В настоящее время наша система не полностью нормализована, и мы используем meteor-publish-composite для получить нормализованные данные в mongodb. Некоторые модели имеют очень мало зависимостей, но другие имеют массивы объектов (т. е. вложенных документов) с несколькими внешними ключами, на которые мы подписываемся при получении каждой модели.

Примером может служить Post, содержащий список Comment вложенных документов, где каждый комментарий имеет поле userId.

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

Влияют ли сто подписок на одну и ту же коллекцию на скорость работы приложения (значительно)? А тысяча? и т. д.


person Yanick Rochon    schedule 19.01.2017    source источник


Ответы (1)


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

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

Когда observer инициализируется (например, когда публикация подписана), он запрашивает mongodb для отправки исходного набора данных, а затем использует oplog для обнаружения изменений в будущем. К счастью, метеор может повторно использовать существующий наблюдатель для новой подписки, если запрос относится к той же коллекции, тем же селекторам и тем же параметрам.

Это означает, что вы можете создать сотни подписок на множество разных публикаций, но если они попадают в одну и ту же коллекцию и используют одни и те же селекторы запросов, то фактически у вас есть только 1 observe в игре. Для получения более подробной информации я настоятельно рекомендую прочитать эту статью. с kadira.io (откуда я получил информацию, которую использовал в этом ответе).

В дополнение к этому Meteor также может работать с несколькими публикациями, публикующими один и тот же документ, и когда это происходит, документы будут объединены в один. См. это для более подробной информации.

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

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

Я делал подобные вещи в одном из своих приложений, и у меня никогда не было проблем.

person jordanwillis    schedule 20.03.2017