fibjsとは何ですか?
fibjs は、Web バックエンド開発用に設計されたアプリケーション サーバー開発フレームワークです。これは Google V8 JavaScript エンジンに基づいて構築されており、従来のコールバックとは異なる同時実行ソリューションを使用します。fibjs はファイバー (ファイバー) を使用して、非同期呼び出しによって引き起こされるビジネスの複雑さをフレームワーク レベルで分離し、開発の難易度を大幅に軽減し、ユーザー空間での頻繁な非同期処理によって引き起こされるパフォーマンスの問題を軽減します。
歴史的な理由から、JavaScript は主にブラウザ UI を処理するために使用されます。UI 開発は典型的なシングルスレッドのイベント駆動モデルであるため、JavaScript は徐々に非同期処理を主要なプログラミング パラダイムとして形成してきました。
JavaScript の成功により、JavaScript を他のシナリオに適用する人が増えています。同時に、多くのシナリオにおいて、非同期処理が最適な選択ではないという認識がますます高まっています。
自然回帰、アジャイル開発
fibjs は、フレームワーク レベルでファイバー (ファイバー) を使用して、非同期呼び出しによって引き起こされるビジネスの複雑さを分離し、非同期 I/O 処理をより直感的な同期呼び出しにカプセル化します。エンジニアは、通常の同期ビジネス ロジックに従ってコードを記述するだけで、非同期処理によってもたらされる大きな利便性を享受できます。
次のコードは、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!');
比較すると、さまざまなプログラミング スタイルによってもたらされる違いが明確にわかります。コードが減ればエラーも減り、コードが減ればコードのロジックがより明確になります。この場合、開発作業と保守作業の両方にメリットがあります。
高いエネルギーを受け入れる
応答性を向上させるためにサーバーを拡張するのは比較的簡単ですが、開発フレームワークを選択する際には依然としてパフォーマンスが重要な考慮事項の 1 つです。ES7 の導入により、async が新しい非同期開発モデルとして 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
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
テスト結果から、async が広く使用されている場合、サーバーは async 関数の呼び出しと戻りの処理に多くの時間を費やすことが明確にわかります。これは実際のサーバー側アプリケーションのテストでも見つかりました。しかし、このようなパフォーマンスの大幅な低下はまったく容認できません。
これに対し、fibjs はファイバー技術を使用し、JavaScript 言語自体の特性を最大限に活かし、V8 エンジンの優れたパフォーマンスを最大限に引き出します。エンジニアはサーバーのパフォーマンスを簡単に最大化できます。
誘拐されることなくパラダイムを柔軟に選択する
fibjs の使用を選択したからといって、同期開発スタイルを使用する必要があるわけではありません。実際、fibjs は、使い慣れたさまざまな非同期プログラミング パラダイムをサポートしており、同期スタイルと非同期スタイルを柔軟に切り替えることができます。
ただし、コールバック関数であっても非同期関数であっても、伝染性という致命的な欠陥があります。関数がコールバック関数または非同期関数である場合、その関数に依存する他のすべての関数もコールバック関数または非同期関数である必要があります。大規模なソフトウェア開発では、莫大な開発コストがかかります。
単純なサーバー開発シナリオを例に挙げます。プロジェクトの開始時にセッション データをメモリに保存することを選択しましたが、現時点では、同期を使用してデータを直接読み取って保存し、これに基づいて完全なビジネス機能を開発できます。ビジネス規模の拡大に伴い、セッションデータをRedisやMongoDBに保存する必要が生じ、その際、セッション関連の操作を非同期モードに変更する必要があります。
理論的には、各関数を 1 つずつ変更して、依存する関数の要件に適合させることができますが、これにはすべてのモジュールを完全に理解し、それらを変更する能力が必要です。複数の人が共同で開発している場合、またはサードパーティのモジュールを使用している場合、これはほとんど不可能です。
したがって、すべての共通モジュールでは、非同期とパフォーマンスの関係のバランスをとるために、同期インターフェイスと非同期インターフェイスの両方を提供する必要があります。通常の開発者は非同期インターフェイスのみを提供することを選択するため、パフォーマンスの問題が発生します。
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 関数を提供します。このようにして、異なるプログラミング パラダイムのモジュールを簡単に統合して開発コストを最小限に抑え、それらを同期パラダイムに変換し、パラダイムの伝染によって引き起こされる災害を効果的に回避できます。
体験を始める
素晴らしい開発体験をする準備はできていますか? それでは、インストールから始めましょう。
👉【インストールと動作環境】