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

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

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

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

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

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