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

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

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