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

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

Fibjs - это среда разработки сервера приложений, предназначенная в основном для серверной веб-разработки, построенная на движке JavaScript Google v8 и выбирающая решение для параллельного выполнения, отличное от традиционного обратного вызова. 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.7.192 результаты этого выполнения кода следующие:

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

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

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

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

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

【【 Установка и условия эксплуатации