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のファイルとフォルダの権限を操作する方法

推薦する

CSS グリッドレイアウトで列にアイテムを埋め込む方法

n 個のアイテムがあり、これらのアイテムをグリッド レイアウトの列に並べ替える必要があるとします。列...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

CentOS サーバーの時間を北京時間に変更する方法

1. VPSとCentOSシステムを購入しましたが、サーバーの時間が北京時間と一致せず、時差があるこ...

dockerでPostgreSQLを実行する方法

1. Dockerをインストールします。参考URL: Docker 入門インストールチュートリアル ...

MongoDB の起動エラーを解決します: 共有ライブラリのロード中にエラーが発生しました: libstdc++.so.6: 共有オブジェクト ファイルを開けません:

MongoDB を起動すると、プロンプトは次のようになります。共有ライブラリのロード中にエラーが発...

Vue3 における非親子コンポーネントの値転送の詳細な説明

目次アプリ.vueサブ1.vueサブ2.vue要約する vue2 における非親子コンポーネントの値の...

Ubuntu 18.04 に phpMyAdmin をインストールするための詳細なチュートリアル

Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...

Vue+nodeはオーディオ録音・再生機能を実現

結果: コードロジックを実装するのが主な部分であり、具体的なページ構造を一つ一つ紹介することはありま...

MySQLにデータを素早くインポートする方法

序文:日々の勉強や仕事の中で、データをエクスポートする必要に迫られることがよくあります。たとえば、デ...

Docker Docker の保存場所を変更する コンテナイメージのサイズ制限を変更する操作

これは新しいバージョンではもう不可能なようで、推奨されません。そうでない場合は、ソフト リンクを直接...

OneProxy に基づいて MySQL の読み取り/書き込み分離と負荷分散を実装する

導入パート1: 冒頭に書いたOneProxy は、民間ソフトウェアによって完全に独立して開発された分...

フォームの送信イベントが応答しない

1. 問題の説明<br />JS を使用してフォームの送信メソッドを呼び出してフォームを...

MySQL 5.7 で業務を停止せずに従来のレプリケーションを GTID レプリケーションに変更する例

GTID の利点により、従来のファイル POS ベースのレプリケーションを GTID ベースのレプリ...

CSS で複数の境界線を実装するためのヒント

1. 複数の国境[1]背景: ボックスシャドウ、アウトライン使用シナリオの多様性を考慮すると、複数の...

Webフロントエンドスキル概要(個人の実務経験)

1. 今日、ページを作っているときに、矢印を中央に配置する効果に遭遇しました。クリック領域を大きくし...