왜 노드를 선택했을까?js 개발자
11402 단어 technologygojavascriptnode
저는 Node.js과 5년 넘게 합작해 왔습니다. 지난 1년 동안 저는 Go 다양한 것들, 즉 더 큰 프로젝트와 various 소스 개발 도구를 사용해 왔습니다.
이 점에서 나는 이 언어들 사이에서 선택을 하여 주어진 임무를 해결하기 위해 나의 사고 과정을 기록하는 것을 좋아한다.
나처럼 노드를 사용한 적이 있는 사람에게 이 글이 가장 유용할 수도 있다.js는 과거와 현재 모든 사람이 Go로 성공적으로 전환할 수 있다는 토론을 많이 들었다.
명확하게 보기 위해서, 우리가 여기서 토론하는 것은 서버 측 기술이다.어떤 사람들은 확실히 사용Go in the browser하지만 이것은 본문의 주제가 아니다.
또 주의해야 할 것은 이 문장이나 다른 원인이 당신을 설득하더라도 당신이 하고 싶은 일을 다른 기술로 완성하는 것이 가장 좋으나, 당신의 시스템 전체를 바로 다시 쓰는 것은 매우 어렵다는 것이다.쉽게 결합할 수 있는 구성 요소를 찾아서 추가 변경을 진행합니다.
또 하나 기억해야 할 것은 '일하기에 적합한 정확한 도구' 를 극대화하지 말라는 것이다.여러 생태계를 동시에 처리하는 복잡성을 과소평가하지 마라.시스템에 신기술을 도입할 때는 조심해야 한다.복잡성은 항상 대가가 있다.
말은 그렇지만 바둑에 대해서 이야기합시다.
Node 를 사용할 때 일부 문제가 발생할 수 있습니다.js, 너는 고로 해결할 수 있어.또 다른 문제는 Go가 해결할 수 없다.never a good idea
다음 문제 중 하나가 발생하면 Go를 확인해야 할 수도 있습니다.
setTimeout(() => {}, 100000)
package main
import "time"
func main() { time.Sleep(100 * time.Second) }
내 노트북에서 JavaScript 프로세스는 8.6MB를 사용하고 Go 프로세스는 380KB를 사용합니다.이런 차이는 놀랍지 않다. 왜냐하면 Go는 기계 코드로 미리 컴파일되어 운행 시간이 매우 짧기 때문이다. 그러나 일부 유형의 소프트웨어에 있어서는 주의해야 한다.console.log('hello')
package main
import "fmt"
func main() { fmt.Println("hello") }
time
명령을 사용하여 이 두 프로그램을 실행할 때 노드 버전은 약 120밀리초가 걸리고 컴파일된 Go 프로그램은 10밀리초가 걸린다.만약 성능이 원시 계산 능력의 제한을 받는다면 Go는 흥미로운 선택이 될 수 있습니다.정적 유형 시스템과 기계 코드를 직접 컴파일하면 성능이 더욱 최적화되고, 많은 경우 자바스크립트 엔진보다 빠르다.
또한 Go는 코드를 병렬 실행할 수 있습니다.노드는js는 병렬 실행을 지원하지 않는 좋은 병렬 모형을 가지고 있습니다.하나의 노드.js 프로세스는 항상 한 라인에서 실행됩니다.Go는 기계가 제공하는 모든 CPU를 이용할 수 있으며 Go 언어에는 간단한 병렬 원어가 내장되어 있다.Goroutines와 channels를 사용함으로써 우리는 상호 배척 자물쇠와 수동 자원 잠금에 의존하지 않고 병행 시스템을 조율하는 간단한 방법을 얻었다.
만약 CPU가 제한되어 있고 심지어 병렬적일 수도 있다면 Go는 Node보다 더 좋은 성능 이득을 제공할 수 있을 것입니다.js.
극단적인 상황에서 Go의 성능은 N배로 향상될 것이다. N은 프로그램이 사용할 수 있는 핵 수다.그러나 많은 경우 더 많은 프로세스를 실행해서 노드를 확장할 수 있다는 것을 기억하십시오.루틴 레벨에 비해 프로세스 레벨을 확장하는 것은 일정한 비용을 가져올 수 있지만, 상술한 제한 중 하나를 받지 않으면 문제가 되지 않을 수도 있습니다.여러 프로세스를 조율하는 가장 간단한 방법은 노드There is no silver bullet.를 사용하는 것이다.저도 여러분들이 다른 기술을 보실 수 있도록 격려합니다, 예를 들면cluster module.
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와 많은 공통된 특징을 가지고 있다는 것을 기억하세요.만약 문제가 성능에 매우 중요하다면, 더 적합한 해결 방안은 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편의 재미있는 글을 추천합니다.보시다시피 정답은 없습니다.이것은 너의 문제에 달려 있다.그래도 뚜렷한 승자는 없을 수도 있다.
그럼에도 불구하고 새로운 언어와 사고방식을 탐색하는 것은 결코 나쁜 생각은 아니다.만약 당신이 바둑을 보고 싶다면, 나는 당신이 여기서 이 비교를 살펴보는 것을 건의합니다.
Reference
이 문제에 관하여(왜 노드를 선택했을까?js 개발자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jorinvo/why-go-for-nodejs-developers-4mc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)