fibjs가 무엇인가요?
fibjs는 주로 웹 백엔드 개발을 위해 설계된 애플리케이션 서버 개발 프레임워크로 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!');
서로 다른 두 가지 프로그래밍 스타일로 인한 차이점을 명확하게 비교할 수 있습니다. 코드가 적으면 오류가 적고, 코드가 줄어들면 코드의 논리가 명확해지고 개발과 유지 관리 모두 이점을 얻을 수 있습니다.
높은 에너지를 받아들이다
서버를 확장하여 응답 속도를 쉽게 높일 수 있지만 성능은 여전히 개발 프레임워크를 선택하는 중요한 기준 중 하나여야 합니다. 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는 fiber를 사용하기 때문에 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를 사용하여 콜백 또는 비동기 함수를 동기화 함수로 변환하고 직접 호출할 수 있습니다. 이러한 방식으로 서로 다른 프로그래밍 패러다임의 모듈을 쉽게 통합하고 최소한의 개발 비용으로 동기화 패러다임으로 변환하여 패러다임 전염으로 인한 재난을 효과적으로 피할 수 있습니다.
경험하기 시작하다
즐거운 개발 경험을 시작할 준비가 되셨습니까? 그럼 설치부터 시작하겠습니다.
👉 【설치 및 운영 환경】