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

Что такое 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();

В последней версии 8 результаты этого кода следующие:

1 2 3
async: 0.539ms callback: 0.221ms sync: 0.061ms

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

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

Начни испытывать

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

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