가이드 개발 가이드

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에서 이 코드의 결과는 다음과 같습니다.

1 2 3
async: 0.539ms callback: 0.221ms sync: 0.061ms

프로젝트에서 async가 널리 사용되면 서버가 비동기 함수 호출 및 반환을 처리하는 데 많은 시간을 소비하게 된다는 것을 테스트 결과를 통해 분명히 알 수 있습니다. 우리는 또한 일부 서버 측 응용 프로그램의 실제 테스트에서 이 점을 발견했습니다. 그리고 이러한 종류의 급격한 성능 하락은 완전히 용납될 수 없습니다.

fibjs는 Fiber를 사용하기 때문에 JavaScript 언어 자체의 특성을 최대한 살릴 수 있고 v8의 우수한 성능을 극대화할 수 있습니다. 엔지니어는 서버의 성능을 쉽게 최대화할 수 있습니다.

납치되지 않고 유연한 패러다임 선택

fibjs를 사용하기로 선택했다고 해서 동기식 개발 스타일을 사용해야 하는 것은 아닙니다.사실 fibjs는 여러분이 본 모든 비동기식 프로그래밍 패러다임을 지원하며 동기식과 비동기식 스타일을 유연하게 전환할 수 있습니다.

콜백과 비동기 모두 치명적인 결함, 즉 전염이 있습니다. 함수가 콜백 또는 비동기인 한, 이에 의존하는 다른 모든 함수는 콜백 또는 비동기여야 합니다. 이것은 대규모 소프트웨어 개발에서 막대한 개발 비용을 가져올 것입니다.

간단한 서버 개발 시나리오를 예로 들어보겠습니다. 프로젝트 초기에 세션 데이터 저장소로 메모리를 선택했는데, 이때 동기화 방식을 사용하여 데이터를 직접 읽고 저장할 수 있으며 이를 기반으로 완전한 비즈니스를 개발할 수 있습니다. 비즈니스 규모의 발전에 따라 세션 데이터를 redis나 mongodb에 저장해야 하며, 이때 세션 관련 작업을 async 모드로 수정해야 합니다.

이론적으로 각 기능을 차례로 수정하여 해당 기능이 의존하는 기능의 요구 사항을 충족하도록 할 수 있지만 이를 위해서는 모든 모듈을 완전히 이해하고 수정할 수 있는 능력이 필요합니다. 이는 여러 사람이 공동으로 개발하거나 타사 모듈을 사용하는 경우에는 완전히 불가능합니다.

따라서 모든 공통 모듈은 비동기와 성능 간의 균형을 맞추기 위해 동기화 및 비동기 인터페이스를 모두 제공해야 합니다. 보다 일반적인 개발자는 비동기 인터페이스만 제공하도록 선택할 것입니다. 이로 인해 성능이 저하됩니다.

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

경험하기 시작

즐거운 개발 경험을 시작할 준비가 되셨습니까? 그럼 설치를 시작해 보겠습니다.

👉 [ 설치 및 운영환경 ]