Мне интересно, есть ли способ реализовать фоновый такс, возможно, с пулом работников. Можете ли вы показать мне направление, я думаю о написании пакета для этого?
Фоновые задачи в Метеор
Ответ 1
Обновление 2019
Прежде чем думать о написании пакета для чего-либо, сначала посмотрите, существуют ли пакеты, которые делают то, что вам нужно. В мире Метеор это означает, что нужно искать в Атмосфере пакеты "работа/очередь/задача/управление работником/планирование", а затем npm для тех же условий поиска. Вам также необходимо более точно определить ваши требования:
- Вы хотите постоянство, или будет работать решение в памяти?
- Вы хотите иметь возможность распределять рабочие места на разные машины?
Метеор конкретных
- Job-collection - надежный (я использовал его в 2014 году на производстве при запуске), но в настоящее время в режиме обслуживания. Позволяет запланировать постоянные задания для запуска в любом месте (серверы, клиенты).
- SteveJobs - активно поддерживается Максом Савином, автором нескольких мощных инструментов Meteor
- littledata: synced-cron - "Простая система cron для Meteor. Она поддерживает синхронизацию заданий между несколькими процессами".
Брошенные пакеты:
- artwells: очередь - приоритеты, планирование, ведение журнала, повторная постановка в очередь. Очередь при поддержке MongoDB. Последнее принятие кода: 2015-окт.
- супер базовые пакеты cron: easycron. Последнее обновление: декабрь 2015 г.
- дифференциал: работники - порождают безголовые рабочие метеорные процессы для работы на асинхронных заданиях. Последнее принятие кода: январь 2015
- cron (с 2015 года)
- PowerQueue - заброшен с 2014 года. Очередь асинхронных задач, использование ресурсов газа, повторная попытка не удалась. Поддерживает вложенные очереди. Нет планирования. Никаких тестов, но отличная демоверсия. Не подходит для длительной работы из-за использования рекурсивных вызовов.
Пакеты Npm
Meteor уже несколько лет может использовать пакеты npm напрямую, поэтому этот вопрос сводится к поиску пакетов управления заданиями/работниками/очередями в NPM. Если вас не волнует настойчивость:
- Async "предоставляет около 70 функций, которые включают в себя обычные" функциональные "подозреваемые (
map
,reduce
,filter
,each
...), а также некоторые общие шаблоны для асинхронного потока управления (parallel
,series
,waterfall
...)" - d3-queue - минималистичный, написанный автором D3 Майком Бостоком
Если вы хотите сохранить постоянство, так как Meteor уже использует MongoDB, может быть выгодно использовать пакет планирования заданий с сохранением в MongoDb. Кажется, самой мощной и популярной является программа "Повестка дня", но, к сожалению, она не поддерживалась месяцами и имеет значительное отставание в решении проблем.
Если вы хотите добавить в свой проект зависимость, поддерживаемую redis, есть несколько вариантов:
- bull - наиболее полнофункциональное решение для очереди заданий для Node, поддерживаемое Redis
- Пчела - простая, быстрая, крепкая. Не страдает от утечки памяти, которую демонстрирует Bull
- Kue - приоритетная очередь заданий для узла
Как и MongoDB, Redis также может обеспечивать высокую доступность (через Redis Sentinel), и если вы хотите распределить задания между несколькими рабочими машинами, вы можете направить их все на один сервер Redis.
Ответ 2
Существует пакет, основанный на заданиях Cron, которые могут использоваться для планирования задач на определенные интервалы или даты. Вот пакет: https://atmosphere.meteor.com/package/cron
И если вам придётся заглянуть в источник этого пакета, вы заметите, что они просто используют:
Meteor.setInterval( ... , delay );
Итак, если вы сохраняете свои задачи в базе данных, загрузите их в интервалы во время запуска, тогда вы, вероятно, будете на правильном пути.
Ответ 3
Если вы ищете что-то, что характерно для Метеор, я рад поделиться тем, что есть новый пакет под названием Стив Джобс. Это облегчает выполнение фоновых заданий, как вызов метода.
Он имеет все стандартные функции, которые вы ожидаете, например, запуск задания только один раз, повторная попытка неудачных заданий и т.д. Вы можете узнать больше об этом на GitHub:
Ответ 4
Я предполагаю, что правильная поддержка включена в их дорожную карту, но тем временем мне удалось запустить ее с помощью setInterval
. См. Пакет cron-tick.