Метеорная подписка и синхронизация медленны - программирование
Подтвердить что ты не робот

Метеорная подписка и синхронизация медленны

У меня есть коллекция с 10M документами из 6000 акций, индексируется имя запаса. Когда я подписываюсь на новый запас, метеор занимает более 10 секунд, чтобы получить около 3000 документов этого запаса. Также после подписания нескольких акций, метеорит зависает со 100% -ным использованием процессора. Метеор выглядит очень медленно с синхронизацией "большой" коллекции. На самом деле мое приложение только что прочитало. Мне интересно, есть ли способ ускорить метеор для клиента только для чтения? Мне также интересно, помогает ли создание отдельной коллекции для каждого запаса?

4b9b3361

Ответ 1

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

Весь стек Meteor представляет собой чрезмерные накладные расходы по простой реализации в любом родном стеке; честно говоря, я бы даже принял во внимание накладные расходы Java или С#, чтобы представить и подумать дважды, выбирая между этими и низкоуровневыми языками, такими как PHP и С++. Языки, такие как Ruby, Python, Node.js и другие, действительно разные истории; они сделаны для быстрого прототипирования, но с точки зрения задержки/пропускной способности, за которыми они стоят, из-за накладных расходов, которые требуется для их JIT, а не для того, чтобы забыть накладные расходы на некоторые нестандартные подходы к тому, чтобы делать что-то.

TL; DR: используйте нужные инструменты для задания, или вы сократите свои пальцы...

Ответ 2

Метеор подталкивает весь набор данных к вашему клиенту.

Вы можете отключить автозапуск, удалив пакет автоматической публикации:

meteor remove autopublish

Затем создайте конкретную конкретную подписку для своего клиента.

Когда вы подписываетесь, вы можете передавать переменную сеанса в качестве аргумента, поэтому на клиенте вы делаете что-то вроде:

sub = new Meteor.autosubscribe(function(){ Meteor.subscribe('channelname', getSession('filterval')); }

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

Meteor.publish('channelname', function(filter){ return Collection.find({field: filter}); }

Теперь, когда вы меняете filterval на клиенте с помощью setSession('filterval', 'newvalue');, подписка будет автоматически изменена, и новый набор данных будет отправлен клиенту.

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

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

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

Ответ 3

Я боролся с той же проблемой. В моем случае мне пришлось только синхронизировать ~ 3000 записей, всего около 30 КБ. После нескольких недель попыток я в конце концов понял, что синхронизация не была проблемой, но, по-видимому, обновлениями LiveHTML, которые произошли во время синхронизации.

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

До (загрузка страницы на 10 секунд для 300 записей, публикуемых сервером):

Template.itemlist.items = function () {
    return Item.find({type: 'car'},
                     {sort: {start: -1},
                      limit: 30});
};

To (загрузка страницы на 2 страницы для 3000 записей, опубликованных сервером):

Template.itemlist.items = function () {
    if (Session.get("active")) {    
        return Item.find({type: 'car'},
                         {sort: {start: -1},
                          limit: 30});
    } else {
        return [];
    }
};

Чтобы "активировать" сеанс только один раз, когда данные были загружены, я добавил:

Deps.autorun(function () {
    Meteor.subscribe("Item", 
                     {
                         onReady: function() {
                             Session.set("active", true);
                         }
                     });
});

Ответ 4

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

Meteor.default_connection.registerStore "prices", 
  beginUpdate: ->
  update: (msg) ->
    updateChart(msg.set)
  endUpdate: ->
  reset: ->

для нового метеора, ниже работ.

  Meteor.default_connection.registerStore collection, 
    constructor: (@update) ->
    # Called at the beginning of a batch of updates.
    beginUpdate: ->
    update: (msg) ->
      update(msg.fields, msg.id) if msg.fields
    endUpdate: ->
    reset: ->

Ответ 5

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

Документы также относятся к управлению кешем вручную:

Сложные клиенты могут включать и отключать подписки, чтобы контролировать, как многие данные хранятся в кеше и управляют сетевым трафиком. Когда подписка отключена, все ее документы удаляются из кеш, если тот же документ не предоставлен другим активным подписка.

В настоящее время разрабатываются дополнительные улучшения производительности для Meteor, в том числе прокси-сервер уровня DDP для поддержки "очень большого числа клиентов". Вы можете увидеть более подробную информацию об этом в Meteor roadmap.