Руководство по развитию

Что такое fibjs?

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

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

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

Назад к основам, гибкая разработка

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

Следующий код взят из документации модуля 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 v6.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 для преобразования функций обратного или асинхронного вызова в функции синхронизации и прямого их вызова. Таким образом, мы можем легко интегрировать модули различных парадигм программирования и преобразовывать их в парадигмы синхронизации с минимальными затратами на разработку, эффективно избегая катастроф, вызванных заражением парадигм.

Начать опыт

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

👉 [Условия установки и эксплуатации ]