fibjsとは何ですか?
fibjs は、主に Web バックエンド開発用に設計されたアプリケーション サーバー開発フレームワークです. Google v8 JavaScript エンジンに基づいており、従来のコールバックとは異なる同時実行ソリューションを選択します. fibjs はファイバーを使用して、フレームワーク層での非同期呼び出しによって引き起こされるビジネスの複雑さを分離し、開発の難しさを大幅に軽減し、ユーザー空間での頻繁な非同期処理によって引き起こされるパフォーマンスの問題を軽減します。
歴史的な理由から、JavaScript は主にブラウザーの UI 処理に使用されます.UI 開発は典型的なシングル スレッドのイベント駆動型モデルであるため、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
32conn.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
6conn.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
4conn.trans(() => conn.execute('INSERT INTO log SET data=?',
'Post ' + conn.execute('INSERT INTO posts SET title=?', title).insertId +
' added'));
console.log('success!');
2 つの異なるプログラミング スタイルによってもたらされる違いを明確に比較できます。コードが減ればエラーも少なくなり、コードの削減によってコードのロジックが明確になり、開発と保守の両方にメリットがあります。
高エネルギーを受け入れる
サーバーを拡張することで簡単に応答速度を上げることができますが、パフォーマンスは開発フレームワークを選択するための重要な基準の 1 つです。ES7 の導入により、新しい非同期開発パターンとして async が JavaScript に導入されました。ただし、非同期によってもたらされる同期スタイルを楽しむときは、パフォーマンスへの影響にも直面する必要があります。
テスト コードを使用して、さまざまなプログラミング スタイルによるパフォーマンスの違いを比較できます。
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
39var 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 では、このコードの結果は次のようになります。
1
2
3async: 0.539ms
callback: 0.221ms
sync: 0.061ms
テスト結果から、プロジェクトで非同期が広く使用されている場合、サーバーは非同期関数の呼び出しと戻りの処理に多くの時間を費やすことが明確にわかります。これは、サーバー側アプリケーションの実際のテストでも見つかりました。そして、このパフォーマンスの急激な低下はまったく受け入れられません。
fibjs はファイバーを使用しているため、JavaScript 言語自体の特性を十分に生かし、v8 の優れたパフォーマンスを最大限に引き出すことができます。エンジニアは、サーバーのパフォーマンスを簡単に最大化できます。
誘拐されずにパラダイムを柔軟に選択
fibjs を使用することを選択しても、同期開発スタイルを使用する必要があるという意味ではありません。実際、fibjs は、これまでに見た非同期プログラミング パラダイムをサポートしており、同期スタイルと非同期スタイルを柔軟に切り替えることができます。
コールバックであろうと非同期であろうと、伝染という致命的な欠陥があります。関数がコールバックまたは非同期である限り、それに依存する他のすべての関数はコールバックまたは非同期でなければなりません。これは、大規模なソフトウェア開発において莫大な開発コストをもたらします。
例として、単純なサーバー開発シナリオを取り上げます。プロジェクトの開始時に、セッション データのストレージとしてメモリを選択しましたが、今回は sync メソッドを使用してデータを直接読み込んで保存し、これに基づいて完全なビジネスを展開できます。事業規模の拡大に伴い、セッションデータをredisやmongodbに保存する必要があり、この際、セッション関連の操作を非同期モードに変更する必要があります。
理論的には、各関数を順番に変更して、依存する関数の要件を満たすことができますが、これには、すべてのモジュールを完全に理解し、それらを変更する能力が必要です。複数人で共同開発を行っている場合や、サードパーティ製モジュールを使用している場合、これは完全に不可能です。
したがって、すべての一般的なモジュールは、同期と非同期の両方のインターフェイスを提供して、非同期性とパフォーマンスのバランスをとる必要があります。より一般的な開発者は、非同期インターフェイスのみを提供することを選択します。したがって、パフォーマンスの災害を引き起こします。
fibjs では、明示的な非同期制御されていない伝染を回避して、同様の問題を簡単に解決できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var 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 を使用して、コールバックまたは非同期関数を同期関数に変換し、直接呼び出すことができます。このようにして、さまざまなプログラミング パラダイムのモジュールを簡単に統合し、それらを最小限の開発コストで同期パラダイムに変換して、パラダイムの伝染による災害を効果的に回避できます。
体験し始める
楽しい開発体験を始める準備はできましたか? それでは、インストールから始めましょう。
👉【インストール・動作環境】