node.js が大規模プロジェクトに適さない理由

node.js が大規模プロジェクトに適さない理由

序文

まず、大規模アプリケーションとは何かを明確にする必要があります。実際、これは意見の問題であり、技術的な問題ではなく哲学的な問題です。ユニクロのようなオンライン販売ができるウェブサイトは大きいですか?と聞かれたら、確かに、これは通常目にするブログや企業の Web サイトなどのロジックよりもはるかに複雑なので、大きなことだと言えるかもしれません。あるいは、それが小さい場合は、それよりも複雑なシステムを開発したことを意味します。それで、Taobao と比べるとどうでしょうか?大きいものと小さいものの比較には基準が必要です。

1. アプリケーションコンポーネント

完全な Web アプリケーションを 1 つの言語または 1 つのテクノロジーのみで構成することは可能ですか?不可能。完全な Web アプリケーションは実際には複数のテクノロジの組み合わせであるため、特定の問題を解決するためのソリューションは多数存在します。たとえば、Java、PHP、Python、Ruby など、バックエンドの論理ソリューションは多数存在します。

簡単にまとめると、アプリケーションのコンポーネントには次のものが含まれます。

Web インターフェイス表示ロジック、バックエンド ビジネス ロジック、キャッシュ、データベース、メッセージ キュー。

実際には、ログ分析、データ分析なども追加できますが、上記は最もよく知られているものにすぎません。

2. アプリケーションの種類

I/O 集約型、CPU 集約型。

一般的なインターネット製品の場合、ボトルネックとなるのはバックエンド業務のロジックではなく、I/O、つまりユーザーに返されるデータの読み取りと出力です。アプリケーションの場合、読み取りはデータベースからデータを取得することを指し、出力は特定の処理の後にこのデータをユーザーのブラウザに出力することを指します。これは I/O を大量に消費します。

CPU 集約型とは、頻繁にコンピューティング タスクを実行するアプリケーションを指しますが、Node.js は確かにこの点では欠点があります。

3. アプリケーションサービスプロセス

図に示すように、ユーザーはブラウザを通じてリクエストを送信し、ネットワーク カードは TCP 接続を受信して​​カーネルに通知し、カーネルは対応するサーバー プログラムを呼び出します。

リクエスト リクエストプロセス

レスポンス返信プロセス

下の図に示すように、Web アプリケーションがデータを返す場合、まずデータを取得し、カーネルを介してディスク ドライバーを呼び出して、データをキャッシュに読み込む必要があります。このようにして、Web アプリケーションでデータを取得して処理し、最後にカーネルを呼び出して、ネットワーク カードを介してクライアントにデータを送信します。

4. アプリケーションのボトルネック

通常、I/O 集中型サービスのボトルネックとなるのはディスクの読み取りと書き込みであるため、クラウド サーバーを購入する際に SSD ディスクを購入してパフォーマンスを向上させることができます。通常、データベース ソフトウェアのデータはファイルに保存されます。まず、このボトルネックを解決するためにメモリ キャッシュを追加することを検討してください。頻繁にアクセスされるデータをキャッシュして、Redis を使用するなどして、現在のシナリオで問題を解決できるかどうかを確認します。次に、同時実行性を向上させるために、データベース クラスターの構築または拡張を検討します。

CPU を集中的に使用するアプリケーションのボトルネックとなるのは CPU であり、このボトルネックを解決する唯一の方法は CPU 処理コアを増やすことです。

5. 分散アプリケーション

大規模な通常のアプリケーションと分散アプリケーションは、実際には異なる概念です。読者は、分散アプリケーションを、各メンバーがノードであるチームとして簡単に理解できます。大規模なプロジェクトでは、メンバーが協力して完了する必要があるため、メンバー間のコミュニケーションに多少のコストがかかります。メンバーの中には、陰謀を企てたり、不誠実な発言をしたり、責任を逃れたりする人もいます。また、メンバーが病気で自宅で療養していて、仕事ができない、といったことも考えられます。こうした問題に直面すると、Node.js の利点を十分に発揮できません (できないわけではないのですが、完璧なインフラが存在しないのです)。

分散の真の定義は、複数の異なるサーバーに異なるサービス モジュールを展開し、プロセスを基本単位としてサーバーにディスパッチし、リモート プロシージャ (RPC) を介して通信して連携し、最終的に外部にサービスを提供することです。

Node.js の現在の分散インフラストラクチャと比較すると、Go 言語のインフラストラクチャははるかに充実しており、特に Docker プロジェクトでは Go 言語の利点が十分に発揮されています。これが、Node.js コミュニティの「大物」である TJ Holowaychuk が分散アプリケーションを開発したいと考え、Go 言語に目を向けた理由です。

実際のところ、配布の問題をあまり心配する必要はありません。結局のところ、JavaScript はもともとブラウザ上で実行されるスクリプト言語にすぎませんでした。JavaScript は万能ではないのに、なぜオペレーティング システム レベルの開発で使用しなければならないのでしょうか。もっと適切な言語を見つけた方が良いのではないでしょうか?今と同じように、Web アプリケーションを構築するには JavaScript を選択します。

6. マルチプロセス Node.js

上記の知識ポイントを理解した後、読者は Node.js が大規模なアプリケーションとはほとんど関係がないことを理解しているはずです。 Node.js を学ぶ開発者のほとんどはフロントエンド開発者であるため、バックエンドの基礎知識を知りません。インターネットで情報を検索すると、Node.js は 1 つのコアしか使用できないことがわかります。TJ Holowaychuk が Go 陣営に転向したと聞いて、Node.js は大規模なアプリケーションの開発に適していないのではないかと考える開発者もいます。

Node.js が 1 つのコアしか使用できないという問題は解決されました。後で使用する Egg.js フレームワークの Egg-Cluster モジュールは、複数のプロセスを使用することでこの問題を非常にうまく解決します。

上記は、node.js が大規模プロジェクトに適していない理由の詳細です。node.js の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体
  • Node koa2 ssr プロジェクト構築手順
  • Alibaba Cloud での Node.js プロジェクトの簡単なデプロイ
  • クラウド サーバーに Node.js プロジェクトをデプロイする方法 (初心者向けシリーズ)
  • ノードでVueプロジェクトを作成する詳細な手順
  • プロジェクトエンジニアリングの自動初期化の標準プロセスを実現するノードコマンドラインツール
  • Node.js プロジェクト内のすべての空のフォルダーに gitkeep を作成する方法
  • vueSSR プロジェクトを 0 から 1 にビルドする: ノードと vue-cli3 の構成
  • PHPStormでNode.jsプロジェクトをユニットテストする方法
  • pm2 を使用してノード プロジェクトを自動的にデプロイする方法

<<:  LinuxベースのApacheウェブサイトサービス構成の詳細な説明

>>:  Linuxのファイルとフォルダの権限を操作する方法

推薦する

カンマで区切られたmysqlの分割関数の実装

1: 文字列を区切るためのストアドプロシージャを定義する 区切り文字 $$ `mess`$$ を使う...

SQLシリアル番号取得コード例

この記事は主にSQLシリアル番号取得コード例を紹介します。記事ではサンプルコードを詳細に紹介しており...

Vueカスタムコンポーネントはイベント修飾子を使用してピットレコードを踏む

序文今日、自作のコンポーネントを使っていたところ、突然、長い間忘れていたバブリングイベントに遭遇しま...

Vue ミックスインの使用方法とオプションのマージの詳細な説明

目次1. コンポーネントでの使用2. オプションのマージ要約する1. コンポーネントでの使用Mixi...

MySQL 5.7.21 のインストールと設定方法のグラフィックチュートリアル (ウィンドウ)

ウィンドウ環境にmysql5.7.21をインストールします。詳細は次のとおりです。 1. MySQL...

MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策

通常のプロジェクト開発中に、MySQL バージョンが 5.6 から 5.7 にアップグレードされた場...

データベースクエリ、どのオブジェクトにどのフィールドが含まれているか、メソッドステートメント

データベースは、どのオブジェクトにどのフィールドが含まれているかを照会します。 *を選択 sysob...

HTML ウェブページ画像タグ

画像タグ <IMG> を挿入します。今日私たちが目にするカラフルなウェブページはすべて、...

Samba を使用して Linux サーバー上で共有ファイル サービスを構築する方法

最近、私たちの小さなチームは、サーバー上の共有フォルダーを共有して、全員がパブリックリソースドキュメ...

スネークゲームのウェブ版を実装するためのJavaScript

この記事では、ウェブページのスネークゲームを実装するためのJavaScriptの具体的なコードを参考...

nginx 設定ファイルパスとリソースファイルパスを表示する方法

nginx 設定ファイルのパスを表示する nginx -t 経由nginx -t コマンドの本来の機...

ReactのsetStateがマクロタスクなのかマイクロタスクなのかについて詳しく話しましょう

目次序文面接官は適切な質問をしていますか? § React は setState をどのように制御し...

MySQL をクリーンにアンインストールする方法 (テスト済みで効果的)

Mysql を完全にアンインストールするにはどうすればいいですか?以下の手順に従って実行してくださ...

ウェブサイトのデザイン体験のための7つの異なるカラースキーム

ウェブサイト構築におけるカラーマッチングは非常に特殊であり、ウェブサイトのテーマ、感情、雰囲気などの...

Centos7 で crontab + シェル スクリプトによる定期的な自動ファイル削除の問題を解決する

問題の説明:最近、rsyncで毎回同期するデータ量が多いが、データベースのbakファイルを保持する必...