왜 노드를 선택했을까?js 개발자

다음은 어떤 사람이 기술이 다른 것보다 좋다고 믿도록 설득하려는 것이 아니라, 반대로 나는 우리가 주어진 임무에 적합한 도구를 선택할 수 있도록 모든 기술의 장점을 탐색하는 것을 좋아한다.
저는 Node.js과 5년 넘게 합작해 왔습니다. 지난 1년 동안 저는 Go 다양한 것들, 즉 더 큰 프로젝트와 various 소스 개발 도구를 사용해 왔습니다.
이 점에서 나는 이 언어들 사이에서 선택을 하여 주어진 임무를 해결하기 위해 나의 사고 과정을 기록하는 것을 좋아한다.
나처럼 노드를 사용한 적이 있는 사람에게 이 글이 가장 유용할 수도 있다.js는 과거와 현재 모든 사람이 Go로 성공적으로 전환할 수 있다는 토론을 많이 들었다.
명확하게 보기 위해서, 우리가 여기서 토론하는 것은 서버 측 기술이다.어떤 사람들은 확실히 사용Go in the browser하지만 이것은 본문의 주제가 아니다.
또 주의해야 할 것은 이 문장이나 다른 원인이 당신을 설득하더라도 당신이 하고 싶은 일을 다른 기술로 완성하는 것이 가장 좋으나, 당신의 시스템 전체를 바로 다시 쓰는 것은 매우 어렵다는 것이다.쉽게 결합할 수 있는 구성 요소를 찾아서 추가 변경을 진행합니다.
또 하나 기억해야 할 것은 '일하기에 적합한 정확한 도구' 를 극대화하지 말라는 것이다.여러 생태계를 동시에 처리하는 복잡성을 과소평가하지 마라.시스템에 신기술을 도입할 때는 조심해야 한다.복잡성은 항상 대가가 있다.
말은 그렇지만 바둑에 대해서 이야기합시다.
Node 를 사용할 때 일부 문제가 발생할 수 있습니다.js, 너는 고로 해결할 수 있어.또 다른 문제는 Go가 해결할 수 없다.never a good idea
다음 문제 중 하나가 발생하면 Go를 확인해야 할 수도 있습니다.
  • 소프트웨어는 사용 가능한 메모리가 적은 하드웨어에서 실행되어야 하거나 노드 응용 프로그램이 다른 방식으로 사용할 수 있는 메모리를 초과해야 합니다.
  • 첫 번째는 JavaScript, 두 번째는 Go:
    setTimeout(() => {}, 100000)
    
    package main
    import "time"
    func main() { time.Sleep(100 * time.Second) }
    
    내 노트북에서 JavaScript 프로세스는 8.6MB를 사용하고 Go 프로세스는 380KB를 사용합니다.이런 차이는 놀랍지 않다. 왜냐하면 Go는 기계 코드로 미리 컴파일되어 운행 시간이 매우 짧기 때문이다. 그러나 일부 유형의 소프트웨어에 있어서는 주의해야 한다.
  • 애플리케이션은 재부팅이 잦거나 CLI 툴이나 유사한 툴을 제공하고 있기 때문에 빨리 시작해야 합니다.
  • 노드는많은 다른 실행 때와 비교하면 js는 Go를 따라갈 수 없는 뛰어난 시작 시간을 가지고 있다.
    console.log('hello')
    
    package main
    import "fmt"
    func main() { fmt.Println("hello") }
    
    time 명령을 사용하여 이 두 프로그램을 실행할 때 노드 버전은 약 120밀리초가 걸리고 컴파일된 Go 프로그램은 10밀리초가 걸린다.
  • 한 서비스가 하는 일은 계산 집약형이고 CPU가 제한되어 있다.
  • 노드파이썬이나 루비 등 다른 환경에 비해 웹 응용 프로그램에서 js의 성능은 칭찬을 많이 받는다.이 성능은 JavaScript가 실행 중인 비동기 프로그래밍 모델에서 나온 것입니다.이벤트 순환과 비동기 함수를 사용하면 한 프로세스가 여러 작업을 동시에 수행할 수 있습니다.그러나 이것은 IO 제한을 받는 작업에만 적용됩니다. 즉, 네트워크나 디스크를 기다려야 하기 때문에 작업 속도가 비교적 느립니다.이러한 작업은 웹 응용 프로그램에서 매우 흔히 볼 수 있다. 왜냐하면 디스크에 있는 파일, 데이터베이스 또는 제3자 서비스 등 다른 자원에서 정보를 얻어야 하기 때문이다.
    만약 성능이 원시 계산 능력의 제한을 받는다면 Go는 흥미로운 선택이 될 수 있습니다.정적 유형 시스템과 기계 코드를 직접 컴파일하면 성능이 더욱 최적화되고, 많은 경우 자바스크립트 엔진보다 빠르다.
    또한 Go는 코드를 병렬 실행할 수 있습니다.노드는js는 병렬 실행을 지원하지 않는 좋은 병렬 모형을 가지고 있습니다.하나의 노드.js 프로세스는 항상 한 라인에서 실행됩니다.Go는 기계가 제공하는 모든 CPU를 이용할 수 있으며 Go 언어에는 간단한 병렬 원어가 내장되어 있다.Goroutines와 channels를 사용함으로써 우리는 상호 배척 자물쇠와 수동 자원 잠금에 의존하지 않고 병행 시스템을 조율하는 간단한 방법을 얻었다.
    만약 CPU가 제한되어 있고 심지어 병렬적일 수도 있다면 Go는 Node보다 더 좋은 성능 이득을 제공할 수 있을 것입니다.js.
    극단적인 상황에서 Go의 성능은 N배로 향상될 것이다. N은 프로그램이 사용할 수 있는 핵 수다.그러나 많은 경우 더 많은 프로세스를 실행해서 노드를 확장할 수 있다는 것을 기억하십시오.루틴 레벨에 비해 프로세스 레벨을 확장하는 것은 일정한 비용을 가져올 수 있지만, 상술한 제한 중 하나를 받지 않으면 문제가 되지 않을 수도 있습니다.여러 프로세스를 조율하는 가장 간단한 방법은 노드There is no silver bullet.를 사용하는 것이다.저도 여러분들이 다른 기술을 보실 수 있도록 격려합니다, 예를 들면cluster module.
  • 컴퓨터에 다른 사용 가능한 의존 항목이 없거나 배치를 허용하는 파일 크기로 인해 응용 프로그램의 배치가 제한된다.
  • 노드js는 호스트에 설치해야 합니다.또한 npm install를 사용하여 컴퓨터에서 모든 파일을 복사하고 의존항을 설치해야 한다.의존 항목은 일반적으로 본 컴퓨터의 C 라이브러리를 포함하고, 반드시 호스트 자체에 설치해야 하며, 미리 설치하는 것이 아니라 호스트 자체에 설치해야 한다.
    Go에서는 프로그램 전체와 모든 의존항을 정적 링크의 바이너리 파일로 컴파일할 수 있습니다.바이너리 파일은 모든 플랫폼에서 교차하여 컴파일할 수 있다.
    위의 hello Go 프로그램의 Linux 바이너리 파일 크기는 1.2MB입니다.
    Docker 컨테이너를 사용하는 경우 파일 크기 절감이 더 심각해질 수 있습니다.
    다음 Dockerfile을 사용하여 노드 버전을 구성하면 676MB의 이미지가 생성됩니다.
    FROM node
    WORKDIR /usr/src/app
    COPY index.js .
    CMD ["node", "index.js"]
    
    다음 Dockerfile의 Go 바이너리 파일 이미지는 1.23MB의 이미지를 생성합니다.
    FROM scratch
    COPY hello /
    ENTRYPOINT ["/hello"]
    
    많은 용기가 실행 중이고 같은 기본 이미지를 사용하면 다시 사용되며 디스크 공간은 한 번만 사용됩니다.
    230MB를 실행하는 노드node:slim와 67.5MBnode:alpine를 선택할 수 있는 컨테이너도 있습니다.하지만 그들에게도 경고가 있다.
    만약 외부 의존 항목이 없다면, Go 용기는 이렇게 작을 수밖에 없다.그렇지 않으면 Go는 Alpine이나 Debian 이미지가 필요할 수도 있고, 최종 이미지 크기도 비슷할 수도 있습니다.또한 작은 Go 용기를 만들려면 바이너리 파일을 만들고 용기에 복사해야 하기 때문에 더욱 복잡한 구축 과정이 필요하다는 것을 기억해야 한다.
    사람들이 선택하는 근거에는 또 많은 다른 부드러운 요소가 있다.
  • Go는 오류 처리 예가 있는데 자바스크립트는 세 가지 이상의 오류 처리 방식이 있다.
  • Go는 기본 도구 체인에 테스트, 기록, 코드 포맷을 위한 편리한 도구를 내장했다.
  • 정적 유형은 자동 완성, 내장 문서, 정의로 이동, 기호 이름 바꾸기 등 긴밀한 편집기 통합을 허용한다
  • 내가 보기에 이러한 논점 중 어느 것이든 기존의 코드 라이브러리를 다시 쓰는 것이 합리적이라는 것을 증명할 수 있다. 자바스크립트의 인코딩 준칙을 개선하는 데 투자하고 ZeroMQ 등 도구를 사용하며 적당한 문서와 테스트를 작성하는 것이 더욱 유익할 것이다. 이것은 자바스크립트에서도 마찬가지로 가능하다.
    만약 위의 어떤 논점이 당신을 설득한다면 Go는 당신이 해결하고자 하는 문제에 더욱 적합한 도구일 수 있습니다. 다른 언어도 Go와 많은 공통된 특징을 가지고 있다는 것을 기억하세요.만약 문제가 성능에 매우 중요하다면, 더 적합한 해결 방안은 Rust나 C 언어일 수도 있습니다. Go는 실행할 때 쓰레기 수집을 사용하고, 프로그램을 언제든지 중단할 수 있습니다.녹이 슬지 않고 고를 선택한 이유는 입문 문턱이 훨씬 낮기 때문이다.바둑은 당신의 머릿속에 남아 있는 개념이 더 적은 더 간단한 언어이다.사람들은 곧 일을 시작하여 효과를 거둘 수 있다.

    라이트급 언제 바둑 안 둬요?


    만약 상기 몇 가지가 당신이 이루고자 하는 목표와 무관하다면, 당신은 고 이외의 다른 언어를 사용할 수 있습니다.너는 너의 모든 작품을 버리고 다른 언어로 다시 쓸 충분한 이유가 없다.
    사실 노드를 꾸준히 사용하는 것이 실제로는 더 효율적일 수 있다고 생각한다.JavaScript와 그 생태계는 기술적으로 이루어진 세부 사항이 아니라 많은 강력한 도구와 추상화를 포함하고 있다.
    REPL에 코드를 불러와 시험적으로 사용하고 데이터를 실시간으로 검사할 수 있어 아이디어를 빠르게 탐색할 수 있다.자동화 테스트를 작성하면 어떤 상황에서든 이렇게 해야 합니다. 정적 유형이 당신을 위해 발견할 수 있는 문제를 발견할 수 있습니다.
    이 두 프로그램 중에서 당신은 어느 것을 쓰고 읽으며 추리하는 것을 더 좋아합니까?
    이것은 다음과 같습니다.
    const toInts = strings => strings.map(s => parseInt(s, 10))
    console.log(toInts(['1', '2']))
    
    또는 이것:
    package main
    
    import (
        "fmt"
        "strconv"
    )
    
    func toInts(strings []string) ([]int64, error) {
      var res []int64
    
      for i, s := range strings {
        r, err := strconv.ParseInt(s, 10, 64)
        if err != nil {
          return res, fmt.Errorf("failed parsing element at index '%d': %v", i, err)
        }
        res = append(res, r)
      }
    
      return res, nil
    }
    
    func main() {
      fmt.Println(toInts([]string{"1", "2"}))
    }
    
    지금 정적 언어와 동적 언어에 대해 깊이 있게 토론하고 싶다면prettier편의 재미있는 글을 추천합니다.
    보시다시피 정답은 없습니다.이것은 너의 문제에 달려 있다.그래도 뚜렷한 승자는 없을 수도 있다.
    그럼에도 불구하고 새로운 언어와 사고방식을 탐색하는 것은 결코 나쁜 생각은 아니다.만약 당신이 바둑을 보고 싶다면, 나는 당신이 여기서 이 비교를 살펴보는 것을 건의합니다.

    좋은 웹페이지 즐겨찾기