Підтримка NPM модулів в backend as a service Scorocode



Вітаємо, Хабровчане і Скорокодеры! статті про розробку Scorocode ми запитали спільнота, якийсь новий функціонал ви б хотіли побачити в сервісі. Одним з популярних варіантів стала підтримка в серверному коді npm модулів. Ви просили — ми зробили! За подробицями просимо під кат.

Коротко про реалізації
Для впровадження npm модулів нам довелося повністю переглянути пристрій зберігання файлів, скриптів. Ми відмовилися від зберігання скриптів в сторонньому хмарі і перенесли всі дані на свої сервера. Це дозволило нам створити заділ для реалізації необхідного функціоналу, а також поліпшити швидкість роботи з даними.

Далі прийшла черга самого обробника JS файлів. Даний обробник (далі «брокер») слухає RabbitMQ і при вступі завдання передає його в пул воркеров для подальшої обробки. Сам брокер написаний на Go і використовує міст Go-V8 для виконання JavaScript коду. Було зрозуміло, що для підтримки npm модулів чистий V8 не підійде, реалізовувати за запитом найпопулярніші і необхідні модулі теж утопічна ідея. У будь-якому випадку код повинен був виконуватися в NodeJS.

У багатьох наших конкурентів npm модулі або не підтримуються або підтримуються із «білого списку». Ми відразу для себе визначили, що хочемо дати нашим користувачам повний доступ до npm, не обмежуючи їх якимись списками підтримуваних модулів. Це змусило нас знайти можливість запуску обробників ізольовано від інших, щоб код не зміг зламати чужі дані.

Для вирішення завдання ізольованого запуску JavaScript коду ми вибрали Docker. Це дозволило нам запускати обробку JavaScript коду в контейнері, і надалі не обмежувати користувачів у виборі модулів. Контейнер складається з образу при виконанні скрипта. Сам же скрипт і встановлені модулі пробрасываются у вигляді файлу і папки всередину контейнера. Додатково ми доопрацювали нативну функцію require для того, щоб вона могла підтримувати користувальницькі скрипти, встановлені npm модулі, а також нативні модулі NodeJS.

Як ми залишили адміна і розробника без пива
Дана реалізація була готова давно, ми тестували її близько тижня і, на перший погляд, все працювало без проблем. Прагнучи порадувати користувачів якомога раніше, ми вирішили викотити оновлення в п'ятницю після обіду. Після викладення релізу, а також міграції даних, все працювало на ура, поки наш розробник не спробував написати код, який використовує setInterval.

Як виявилося, при використанні параметра timeout нативного модуля vm, пісочниця відпрацьовує рівно стільки, скільки потрібно, але як тільки в нашому коді зустрічається setInterval, timeout не спрацьовує. На жаль, у нас не було часу розбиратися з проблемою і після недовгих роздумів завдання контролю часу виконання скриптів була покладена на плечі самого брокера.

У підсумку, реліз був викладений, виправлені проблеми, які виникли, але вихідні у нашого адміністратора та розробника почалися тільки в суботу в 1:58, тому про келиху п'ятничного пива в барі довелося забути. Порушувати заповідь «не викладати релізи в п'ятницю» більше не будемо :)

Як використовувати npm модулі в Scorocode
Для того, щоб підключити необхідні модулі, вам потрібно перейти в розділ «Налаштування програми» і вибрати вкладку «npm залежності».



У секції dependencies опишіть всі модулі, які ви збираєтеся використовувати. Властивість — назва модуля, значення — необхідна версія (ви можете залишити значення версії порожнім, в цьому випадку буде встановлена остання версія модуля).

{
"dependencies":{
"scorocode": "",
"underscore": "",
"async": ""
}
}

Після чого натискаємо кнопку зберегти і переходимо в розділ «Серверний код» і створюємо новий скрипт:



Як видно з скріншоту, використання встановлених модулів нічим не відрізняється від використання в NodeJS. Для підключення необхідних модулів використовується require.

var SC = require('scorocode');
var async = require('async');
var _ = require('underscore');

// Ваш код.....

Висновок
В цілому нам вдалося досить безболісно реалізувати підтримку npm модулів у додатках користувачів. А тепер нам цікаво отримати зворотний зв'язок, як ви будете використовувати даний функціонал у своїх додатки?

Також, враховуючи обмеження npm, ми придивляємося до підтримки пакетного менеджера для node.js від facebook yarn. Пробував його хто-небудь, які є думки у вас на рахунок нього?
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.