lil-http-terminator, HTTP 서버를 정상적으로 종료하는 작은 JS 모듈

8467 단어 npmjavascriptnode
node.js HTTP 서버가 데이터 손실 위험 없이 종료되는 평온함을 얻으려면 node_modules를 11KB 늘리십시오.

또는 2.2MB 모듈을 11KB로 축소한 방법.

TL;DR: npm i lil-http-terminator

문제



저는 거의 10년 동안 node.js 마이크로서비스를 코딩해 왔습니다. 정상적인 HTTP 서버 종료는 항상 해결하기 어렵기 때문에 처리하고 싶지 않은 문제였습니다.

해결책



http-터미네이터 npm 모듈



최근에 나는 단계적 종료의 완벽한 구현이 있다는 것을 발견했습니다. http-terminator 이라고 합니다. 내가 그것을 사용하기로 결정한 이유는 다음과 같습니다(저자 인용).

  • it does not monkey-patch Node.js API
  • it immediately destroys all sockets without an attached HTTP request
  • it allows graceful timeout to sockets with ongoing HTTP requests
  • it properly handles HTTPS connections
  • it informs connections using keep-alive that server is shutting down by setting a connection: close header
  • it does not terminate the Node.js process


용법:

import { createHttpTerminator } from 'http-terminator';
const httpTerminator = createHttpTerminator({ server });
await httpTerminator.terminate();


모든 node.js HTTP 서버(Express.js, Nest.js, Polka.js, Koa.js, Meteor.js, Sails.js, Hapi.js 등)에서 작동합니다.

우와! 빛나는 엔지니어링! 작가님 수고하셨습니다!

하지만 함정이 있습니다.

4KB 코드베이스에 불과하므로 node_modules 에 22개의 종속성(2.2MB, 464개 파일)을 추가합니다.

직접 참조:

$ npx howfat -r tree http-terminator
npx: installed 18 in 1.695s

[email protected] (22 deps, 2.16mb, 464 files)
├── [email protected] (10.91kb, 5 files)
├─┬ [email protected] (19 deps, 2.02mb, 398 files)
│ ├── [email protected] (7.9kb, 10 files)
│ ├── [email protected] (2.7kb, 6 files)
│ ├─┬ [email protected] (9 deps, 1.79mb, 268 files)
│ │ ├─┬ [email protected] (5 deps, 1.41mb, 181 files)
│ │ │ ├── [email protected] (12.66kb, 11 files)
│ │ │ ├── [email protected] (16.56kb, 18 files)
│ │ │ ├── [email protected] (19.11kb, 9 files)
│ │ │ ╰─┬ [email protected] (1 dep, 490.54kb, 51 files)
│ │ │   ╰── [email protected] (31.67kb, 5 files)
│ │ ├── [email protected] (29.39kb, 9 files)
│ │ ├── [email protected] (23.48kb, 9 files)
│ │ ╰── [email protected] (10.73kb, 5 files)
│ ├─┬ [email protected] (1 dep, 34.32kb, 26 files)
│ │ ╰── [email protected] (🔗, 7.9kb, 10 files)
│ ├─┬ [email protected] (2 deps, 114.41kb, 41 files)
│ │ ╰─┬ [email protected] (1 dep, 48.41kb, 21 files)
│ │   ╰── [email protected] (25.92kb, 11 files)
│ ├── [email protected] (5.89kb, 8 files)
│ ├── [email protected] (12.42kb, 9 files)
│ ╰── [email protected] (3.96kb, 8 files)
╰── [email protected] (108kb, 42 files)


궁금해졌다. 그 roarr 패키지는 무엇이며 패키지에서 제거할 수 있다면 무엇입니까? 대답은 나를 놀라게 했다.

불필요한 종속성 제거



세 가지 최상위 종속성을 쉽게 제거할 수 있습니다.

유형 축제


type-fest는 패키지를 TS에서 JS로 다시 작성하여 제거할 수 있습니다. 아직 "부끄럽다"고 말하는 것을 보류하십시오.

단일 기능 모듈입니다. 하나의 기능에만 코드 완성이 필요하지 않습니다. 따라서 JS로 다시 작성하는 것이 TypeScript 지지자에게 단점이 되어서는 안 됩니다.

지연


delay 모듈은 한 줄 함수로 다시 작성할 수 있습니다. 여기있어:

const delay = time => new Promise(r => setTimeout(r, time));


포효


roarr 트리에서 가장 큰 모듈은 2MB의 하드 드라이브를 사용합니다. 하지만 말 그대로 한줄에 쓰입니다!!!

if (terminating) {
  log.warn('already terminating HTTP server');

  return terminating;
}


모듈은 HTTP 서버를 두 번 종료하기로 결정한 경우 해당 경고를 인쇄합니다. 그게 다야. 전체 roarr 모듈 내에서 http-terminator 로거를 더 이상 사용하지 않습니다.

실수로 .termiate()를 두 번 호출하는 것은 거의 불가능합니다. 이런 일이 일어난다는 것은 상상하기 어렵습니다. 그래서 log 변수를 options에 넣고 기본적으로 console에 할당하기로 했습니다.

우리는 20개의 종속성을 제거하고 동시에 동료 개발자가 원하는 로거( winston , bunyan , pino , morgan 등 또는 roarr 그 자체).

lil-http-terminator를 만나보세요


http-terminator lil-http-terminator 으로 갈랐습니다.

const HttpTerminator = require("lil-http-terminator");
const httpTerminator = HttpTerminator({ server });
await httpTerminator.terminate();


원본만큼 멋진 lil- 버전은 다음과 같습니다.
  • 0 종속성(원본에는 3개의 직접 하위 종속성과 18개의 간접 하위 종속성이 있음);
  • 단 5개 파일(원본은 총 464개 파일);
  • 단 11KB(원본은 2180KB);
  • NPM에서 3.9KB .tar.gz 파일로 패키징했습니다(원본 다운로드는 약 522KB).
  • 훨씬 적은 메모리를 사용합니다(측정하지는 않았지만).
  • 에는 8개의 devDependencies가 있습니다(원본에는 17개).

  • 뒷말



    저는 약 20년 동안 돈을 위해 코드를 작성하고 있습니다. 저는 거의 10년 동안 node.js와 npm을 사용하고 있습니다. 훌륭하고 강력한 node.js 서비스, 스크립트, 서버리스 기능, 앱을 개발하는 방법을 배웠습니다. 우리가 더 잘 따르는 모범 사례를 발견(재발명)했습니다. 코드를 작성한 후 몇 년 동안 유지 관리할 수 있도록 만드는 방법을 알고 있습니다. 가장 어려운 부분은 항상 타사 종속성이었습니다. 하위 종속성이 추가될 때마다 회사에 수천 달러의 비용이 들 수 있다는 것을 어렵게 배웠습니다.

    2시간만에 포크해서 썼습니다 lil-http-terminator . 이런 식으로 8시간에서 80시간을 절약할 수 있을 것으로 예상합니다. 똑같이 저장할 수 있습니다.

    좋은 웹페이지 즐겨찾기