가이드 개발 가이드

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 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는 새로운 비동기 개발 모델로 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 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 v6.7.192에서이 코드의 결과는 다음과 같습니다.

1 2 3
async: 5.276ms callback: 0.117ms sync: 0.038ms

테스트 결과를 통해 프로젝트에서 비동기가 널리 사용되면 서버가 비동기 함수 호출 및 반환을 처리하는 데 많은 시간을 할애 할 것임을 분명히 알 수 있습니다. 또한 일부 서버 측 애플리케이션의 실제 테스트에서도이 점을 발견했습니다. 그리고 이러한 급격한 성능 저하는 완전히 용납 할 수 없습니다.

fibjs는 fiber를 사용하기 때문에 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를 사용하여 콜백 또는 비동기 함수를 동기화 함수로 변환하고 직접 호출 할 수 있습니다. 이러한 방식으로 다양한 프로그래밍 패러다임의 모듈을 쉽게 통합하고 최소한의 개발 비용으로 동기화 패러다임으로 변환하여 패러다임 전염으로 인한 재해를 효과적으로 피할 수 있습니다.

경험 시작

즐거운 개발 경험을 시작할 준비가 되셨습니까? 이제 설치부터 시작하겠습니다.

👉 [ 설치 및 운영 환경 ]