Node.js vs Go。 バックエンドの Web 開発ではどちらが優れているか?
すべてのビジネス ロジックとその他の機密処理を裏で担当するアプリのバックエンドは、製品にとって最も重要な部分です。 アプリの品質を定義する要素は数多くあり、たとえば、パフォーマンスの高さやスムーズな拡張性、コードの保守性、システム全体のセキュリティなどが挙げられます。 これらはすべて、Webアプリケーションのバックエンドの品質に直接依存します。 だからこそ、プロジェクトに適したツールを選択することが重要なのです。
バックエンド開発のための技術スタックを選択することになると、多数の選択肢があります。 Ruby、Node.js、Go、Python、PHP などです。 このような多様性の中で、それぞれの技術について本質的な事実を知らずに決断することは負担になります。 私たちは、この決断をお手伝いします。
ヤランティスでは、バックエンドの開発に主にRuby、Go、およびNode.jsを使用しています。 この記事では、Go と Node.js に注目します。この 2 つの技術は、最近最も有望なバックエンド技術と見なされています。 JavaScriptの実行環境であるNode.jsは2018年に最も広く使われた開発ツールに選ばれ、Googleが開発したプログラミング言語であるGoは近年、急激な人気の高まりを見せています。
2018年、JetBrainsはGoを最も有望な言語とした。 Uber、UpGuard、KodingはNode.jsからGoに移行し、Ruby on Railsフレームワークを開発したBasecampはバックエンドサービスにGoを積極的に活用しています。 この2つのツールのうち、どちらがあなたのプロジェクトに最適なのか、確認してみましょう。
Node.jsになる
Node.js は、Google Chrome の V8 エンジンをベースにした JavaScript ランタイム環境です。 2008 年の JSConf で初めて紹介され、Node.js は開発者コミュニティから好評を博しました。 Node.jsはクロスプラットフォームのオープンソースツールで、主にWebサーバーを作成するために使用される。 JavaScript コードを実行するので、開発者は 2 つのまったく異なるプログラミング言語を学ぶことなく、サーバー側とクライアント側の両方のコードを書くことができます。
2014年に、io.js と呼ばれる Node.js の独立したフォークが作成されました。 その1年後、io.js と Node.js のコミュニティは、新しく設立された Node.js Foundation の下で共同作業を開始しました。
現在、私たちはこの技術が広く採用されるのを目の当たりにしています。 Netflix、eBay、Groupon などの人気企業は、フルスタックの Web 開発に Node.js を使用しています。 Node.js は、最も広く使われている JavaScript フレームワークです。 また、StackOverflowが毎年行っている開発者調査によると、JavaScriptはここ数年、ナンバーワンのプログラミング言語になっています。
Node.jsはいくつかの方法で使用することができます。 Node.js Foundationによる2017年の調査によると、Node.jsを使用している企業の39%は、主にバックエンドとフルスタック開発に適用しています。 フロントエンドの開発やデスクトップアプリケーションの作成にはあまり使われていないようです。
Becoming Go
Golang とも呼ばれる Go は、2009 年に Google が初めて発表した、オープン ソースで静的型付け、コンパイル、クロス プラットフォーム、および超高速のプログラミング言語です。 Goは多目的で、バックエンドの開発に適した言語です。 Googleの開発者は、既存の言語の良い面を混ぜつつ、最も一般的な問題を解決したいと考えました。 C++やJavaと同じように、Goは高レベルの効率性を持つ静的型付け言語です。 また、Go はスピードと構文の面で C 言語に似ています。 開発者が読みやすく保守性の高いコードを書けるように、明確でシンプルな言語です。
こちらもお読みください。 プロジェクトに Go 言語を使用する理由」
最初の安定版 Go は 2011 年に登場し、開発者に堅牢なゴルーチン、ガーベッジ コレクター、および組み込みテスト環境を提供しました。 ゆっくりと、しかし着実に、Go は開発者コミュニティを征服してきました。
Tiobeインデックスによると、Goは2009年と2016年にProgramming Language of the Yearに選ばれています。 2019年、GoはTiobe Indexで16位まで上昇し、今後も人気を獲得し続ける態勢にあるようです。 PYPL Indexも、この言語を17位とし、Goの人気を証明しています。 Stack Overflowの開発調査2018では、Goは16番目に人気のあるプログラミング言語となっています。 Goを使用するWebアプリには、Uber、BBC、SoundCloud、Basecampなどがあります。
Golang vs Node.jsの比較。 次世代ソリューションの戦い
Node.jsとGoの基本情報をお伝えしたので、スケーラビリティ、パフォーマンス、エラー処理、その他の基準で比較してみましょう。 さて、Go対Node.jsの戦いはどちらが勝つのでしょうか?
基準 1 パフォーマンス
パフォーマンスは、アプリケーションのロード時間と応答時間に大きく影響します。 したがって、アプリの顧客満足度に直接影響します。
ほとんどの開発者は、Go が C や C++ と同じパフォーマンスを示しており、これは本当に良いことだと指摘します。 Go には仮想マシンがなく、マシン コードにコンパイルされるため、ウォームアップ時間なしでプログラムが高速に実行されます。
また、Go にはガベージコレクターが組み込まれており、監視して不要になった占有メモリを特定し、再利用できるように解放します。 これにより、コードのカプセル化によるセキュリティ脆弱性のリスクを低減し、効果的なメモリ管理を実現します。
Go は、Go アプリの小さなメモリ フットプリントと高速なパフォーマンス、および静的にリンクされたバイナリの利便性により、マイクロサービスの構築に理想的なソリューションと言えます。
Node.js は、いくつかの理由から、最高のバックエンドソリューションの 1 つと見なされています。
-
Node.js は、その非同期およびノンブロッキングの性質を JavaScript から継承しています。 これは、小さなタスクがバックグラウンドで実行され、メインスレッドに影響を与えないことを意味します。
-
Node.js は V8 エンジンを使用しており、現在までのところ、最も速い JavaScript エンジンとみなされています。
-
Node.js のコードは再利用可能です。 これは、リアルタイムでデータを更新するイベントベースのアプリケーションにとって重要であり、インスタント メッセージング、ビデオ チャット、およびオンライン ゲームに広く使用されています。
2013年に、PayPalはJavaからNode.jsに切り替え、Node.jsを使用した経験を共有しました。 Node.js に移行した後、ページが 200ms 速く提供され、平均応答時間が 35% 減少したと言います。
生のパフォーマンスという点では、Go は紛れもないリーダーです。 しかし、実際の生活では、Node.js と Go は同じように優れたパフォーマンスを示しています。
これら 2 つの言語のパフォーマンスの違いを比較するには、The Computer Language Benchmarks Game による合成テストを確認することもできます。
基準2 スケーラビリティと並行性
並行性とは、プログラムがその実行をいくつかの個別のフローに整理し、それらの間で通信する能力のことである。 並行プログラミング技術は、CPUを効率的に使用し、アプリのパフォーマンスを向上させるための良い方法です。
同時実行は、エンタープライズ規模のアプリや、何千ものリクエストを同時に処理する必要があるアプリにとって不可欠な要素です。 アプリの同時実行性が高ければ高いほど、高負荷時にアプリがクラッシュする可能性が低くなります。
Go の開発者である Rob Pike は、Go は大規模ソフトウェア プロジェクトにとって優れたツールであると述べています。 チャネルとゴルーチンにより、並行処理は Go の強力な側面です。 ゴルーチンとは、他のメソッドや関数と並列に実行されるメソッドや関数のことである。 ゴルーチンは軽量で、オペレーティングシステムのスレッドが1MBであるのに比べ、初期サイズはわずか4KBです。 Go環境では、数千のゴルーチンを同時に実行しても、RAMをあまり消費しません。
Node.js はシングルスレッドなので、CPU バウンドタスクがイベントループをブロックし、プログラムが遅くなることが時々あります。 その結果、遅いアプリと迷惑なユーザーが発生します。
Criterion #3 コミュニティ
Node.js と Go はどちらもオープン ソースであり、コミュニティ全体がこれらの言語の改善、バグ修正、および新しい提案の作成に携わっていることを意味します。 そして、Node.js と Golang は両方とも GitHub にリポジトリがあります。 コミュニティが大きいということは、開発者が多いということでもあり、適切な専門家を見つけることが容易になります。
Node.jsは、大規模で活気のあるオープンソースコミュニティを持つ成熟したツールです。 Node.js Foundation は、Node.js の広範な採用を可能にすることを目的としています。 その最初の年に、この財団はセキュリティを担当する専門家のチームを結成し、安定性を向上させるための長期的なサポート計画を作成しました。 現在、技術運営委員会は18人のメンバーで構成され、貢献者の数は2000人を超えています。
GoDaddy, Intel, IBM, Microsoft, PayPal, and NodeSource は Node.js Foundation のアクティブなメンバーです。 毎年、コミュニティは Node+JS Interactive を開催し、開発者が Node.js の新しい改善や変更を発表するイベントを行っています。 現在までに、Node.js は 10 億件のダウンロードと GitHub の 56,000 のスターに到達しました。
Go コミュニティははるかに小さいですが、毎年成長し続けています。 Google のサポートは、Go に移行するための非常に重要な理由です。 毎年開催される GopherCon では、世界中の Go 開発者が集まり、新しい機会や変化について話し合います。 このカンファレンスをきっかけに、Goのコミュニティやプロジェクトに貢献したいと考える開発者が増えていたのです。 2017年のGolangの調査によると、回答者の59%がGoコミュニティに貢献したいと回答し、前年の55%から上昇しました。
基準4 ツール
既製のソリューションは、Webアプリ開発において開発を容易にし、コストを削減する。
開発ツールやフレームワークの種類が多いことも、Node.js を選択する理由の 1 つです。 Node.js は、マイクロサービス アーキテクチャを持つイベントベースのフレームワークです。 マイクロサービス アーキテクチャとは、1 つのアプリケーションが、明確に定義された操作インタフェースを持つ小さなモジュールに分割されることを意味し、これにより、アプリに新しいコンポーネントを簡単に追加することができます。 これは、約 80 万の既製の「ビルディング ブロック」 (あらゆる特定のケースのためのツール) で構成されており、何の苦労もなくインストールおよび実行することが可能です。 しかし、これらを賢く選択してください。コア技術は本当に良いのですが、npm はブロックのリストがうまく構造化されておらず、正しいブロックを見つけるのに時間がかかることがあります。
Go は Node.js と比較して、ツールの数が少ないです。 これは、Go がサードパーティのサポートを必要としない機能を持つ標準的な本格的なライブラリを持っているという事実で説明できます。
Node.jsのツール数はGoのツール数をはるかに超えていますが、GoにはGofmit、Godoc、GoMetaLiner、Go runなどの堅牢なツールがあります。
基準5 エラー処理
Node.js は伝統的な try…catch エラー技法を使用しており、エラーが発生するとすぐに捕捉されます。
NodeJS とは異なり、Go は実行時エラーとコンパイル時エラーを分離しており、これらは異なる方法で処理されると考えられています。 しかし、これは開発者にとっては困難を伴います。 しかし、Goの作成者は言語進化のために最大限の努力をしています。 2018年8月、Goの開発者はGo 2の開発を開始したと発表しました。 次のバージョンでは、ようやくエラー処理、読み取り専用の値、何らかの形のジェネリックのサポートが追加されると予想されます。 エラーをより早く見つけることができるため、開発者のデバッグ時間を短縮することができます。
主要な技術者は Go と Node.js についてどのように言っていますか?
では、ソフトウェア開発に Go と Node.js を使うことについて人気企業がどのように述べているかを見ていきましょう。
-
Go
2016年、Uberはジオフェンス検索マイクロサービスのパフォーマンスを向上させるためにNode.jsからGoへ移行しました。 このマイクロサービスは、1 秒あたりのクエリ数 (QPS) が最も多い同社のサービスであることが判明しました。 Uber が Go への移行を決定した理由はいくつかあります。 第 1 に、Node.js の動的型付けと解釈の性質は、CPU 集中型のポイント イン ポリゴン アルゴリズムを効率的に処理する妨げとなります。
第 2 に、最も新しいジオフェンス情報を確実に取得するために、Uber は複数のソースから同時に情報をリフレッシュする必要がありました。 これは、Node.js がシングルスレッドであるため、多くの時間を要しました。 7048>
Uber の開発者は Go を使用した経験を共有し、Go は学習と保守が非常に簡単であると述べ、また、Go の信頼性を強調しました。 Uber は、Go を使用して 99.99% のアップタイムを経験しています。 また、スループットとレイテンシーの面で高い性能を持つ言語であることも強調しています。 Uberのアプリは、1秒間に17万回のピークロードを処理することができます。
Basecamp を使用している企業も、Go のシンプルさを強調しています。 Basecamp のデータ アナリストである Noah Lorang 氏は、Go はゴルーチンによってデータ パイプラインを構築するための素晴らしいソリューションであると述べています。 彼の考えでは、Goの主な長所は、堅牢な標準ライブラリ、シンプルな構文、リファクタリングとデプロイのプロセスの容易さです。
-
Node.js
Netflix アプリのユーザー インターフェイス全体は Node.js で構築されています。 Netflix の開発チームは、高速で軽量のアプリケーションを望んでいたため、Node.js を選択しました。 Node.js に移行することにより、彼らはアプリのスタートアップ時間の 70% 削減を達成しました。
Groupon のソフトウェア エンジニアリング ディレクターの Adam Geitgey 氏は、Groupon が Ruby から Node.js に移行した理由を説明しています。 彼は、JavaScript は普遍的な言語に近いので、フロントエンド開発者が Node.js を学習して使用するのは簡単だと言っています。 さらに、Node.jsのパフォーマンスのおかげで、Grouponは425,000以上のアクティブなディールを滞りなく処理することができるのだそうです。
賞は…
ご覧の通り、Node.jsとGolangのどちらが優れているかを明確に言うのはかなり難しいです。 作りたいアプリの種類や特徴に大きく依存します。 それぞれのタスクには適切なツールが必要で、GoとNode.jsはそれぞれ得意なことが異なります。
高負荷を処理する必要があるマイクロサービスやエンタープライズ規模のプロジェクトにはGoが最適ですが、Node.jsにはほとんどすべての開発課題に対する多種多様な既製のソリューションがあるので、カスタムソフトウェアの開発時間を劇的に短縮することが可能です。
どのツールを選択するか決めかねていますか? 私たちに連絡をいただければ、プロジェクトに応じて正しい決定を下すお手伝いをします。