Руководство по разработке руководства

Что такое Фибж?

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

По историческим причинам JavaScript в основном используется для обработки пользовательского интерфейса в браузерах. Разработка пользовательского интерфейса является типичной однопоточной моделью, управляемой событиями, поэтому JavaScript также сформировал асинхронное программирование в качестве основной парадигмы программирования.

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

Вернуться к истинному, гибкому развитию

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

Следующий код взят из документации модуля mysql:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
conn.beginTransaction(err => { if (err) { throw err; } conn.query('INSERT INTO posts SET title=?', title, (error, results, fields) => { if (error) { return conn.rollback(() => { throw error; }); } var log = 'Post ' + results.insertId + ' added'; conn.query('INSERT INTO log SET data=?', log, (error, results, fields) => { if (error) { return conn.rollback(() => { throw error; }); } conn.commit((err) => { if (err) { return conn.rollback(() => { throw err; }); } console.log('success!'); }); }); }); });

В fibjs такая же работа выполняется, код выглядит следующим образом:

1 2 3 4 5 6
conn.trans(() => { var result = conn.execute('INSERT INTO posts SET title=?', title); var log = 'Post ' + results.insertId + ' added'; conn.execute('INSERT INTO log SET data=?', log); }); console.log('success!');

Если вам нужна простота, вы можете написать такой код:

1 2 3 4
conn.trans(() => conn.execute('INSERT INTO log SET data=?', 'Post ' + conn.execute('INSERT INTO posts SET title=?', title).insertId + ' added')); console.log('success!');

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

Прими высокую энергию

Хотя мы можем легко увеличить скорость ответа за счет расширения сервера, производительность должна оставаться одной из важных причин выбора среды разработки. С введением ES7 асинхронность была введена в JavaScript как новая модель асинхронной разработки. Однако, когда мы наслаждаемся стилем синхронизации, предложенным async, нам также приходится сталкиваться с его влиянием на производительность.

Мы можем использовать часть тестового кода для сравнения различий в производительности, вызванных различными стилями программирования:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
var count = 1000; async function test_async(n) { if (n == count) return; await test_async(n + 1); } function test_callback(n, cb) { if (n == count) return cb(); test_callback(n + 1, () => { cb(); }); } function test_sync(n) { if (n == count) return; test_sync(n + 1); } async function test() { console.time("async"); await test_async(0); console.timeEnd("async"); console.time("callback"); test_callback(0, () => { console.timeEnd("callback"); }); console.time("sync"); test_sync(0); console.timeEnd("sync"); } test();

В последней версии v8.7.192 этот код работает следующим образом:

1 2 3
async: 5.276ms callback: 0.117ms sync: 0.038ms

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

Поскольку fibjs использует волокно, он может полностью использовать возможности самого языка JavaScript и максимизировать превосходную производительность v8. Инженеры могут легко максимизировать производительность сервера.

Гибкий выбор парадигмы без похищения

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

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

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

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

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

В fibjs вы можете легко решить подобные проблемы и избежать явной асинхронной и неконтролируемой передачи:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var util = require('util'); function session_get(sid) { return sdata; } async function async_session_get(sid) { return sdata; } function callback_session_get(sid, cb) { cb(null, sdata); } data = session_get(sid); data = util.sync(async_session_get)(sid); data = util.sync(callback_session_get)(sid);

Fibjs может использовать util.sync, чтобы превратить функции обратного вызова или асинхронности в функции синхронизации и вызывать их напрямую. Таким образом, мы можем легко интегрировать модули различных парадигм программирования и преобразовывать их в синхронизирующие парадигмы с минимальными затратами на разработку, эффективно предотвращая катастрофу, вызванную заражением парадигмы.

Начать опыт

Готовы начать приятный опыт развития? Итак, начнем с установки.

Installation [среда установки и эксплуатации ]