Web およびクラウド開発、Rust は普及するでしょうか?

Web およびクラウド開発、Rust は普及するでしょうか?

I.はじめに

2. 大工場優先、Rust の将来

3. WebになるというRustの野望

4. Rust for Web に切り替える必要がありますか?

1. 効率とパフォーマンス

2. 信頼性と保守性

5. サビは甘い前に苦い

6. Rustを使用する前のいくつかの質問

開発業界に強いセブン

I.はじめに

昨年、Web 開発会社 Mainmatter は Web 向け Rust に戦略的賭けをし、EuroRust カンファレンスを立ち上げ、Rust Foundation に参加し、社内とオープンソース領域の両方で多くの Rust プロジェクトに取り組んでいます。

Mainmatter は、Rust が今後数か月から数年以内に Web およびクラウドの分野で普及することを非常に楽観的に考えており、Rust は開発者が開発を諦めることなくこのテクノロジーを活用できる Web 開発の新時代への第一歩であると考えています。従業員の経験や生産性を犠牲にすることなく、以前は想像もできなかったより高いレベルの効率、安定性、信頼性、保守性を実現します。

この投稿の目的は、Mainmatter がなぜこの賭けに自信を持っているのか、そしてなぜ Rust には Web とクラウドで素晴らしい将来があると信じているのかを共有することです。

 

2. 大工場優先、Rust の将来

Rust は約 10 年前に登場して以来、開発者から多くの注目と愛を集めてきました。開発者がこの言語を愛するだけでなく、大企業の意思決定者も Rust が優れたテクノロジーであると考えており、この言語は過去数年間で業界全体で広く採用されています。

AWS はプラットフォームで Rust を多用し、Google は Android で使用し、Microsoft は Windows で Rust を使用します。基本的に、Rust は、システム プログラミング、オペレーティング システム、あらゆる種類の組み込みシステム、低レベル ツール、ゲームとゲーム エンジンなど、以前に使用されていた多くの分野で C と C++ を置き換える準備ができています。

もちろん、上記に加えて、今後大きな可能性を秘めているのはWebとクラウドです。Rust は、これら 2 つの分野に無限の想像力豊かなバックエンド改善スペースをもたらします。バックエンドの開発が次のレベルに進むと、チームは以前は利用できなかった機能にアクセスできるようになります。

Rust はまだ誕生したばかりですが、Truelayer、Discord、Temporal、Nando's、svix、Wingback など、多くの企業が Web やクラウドで Rust を使用して成功しているのを見てきました。

Google も長年にわたって Rust を積極的に採用しており、最近では、Google が使用している他の言語と比較して Rust で生産性が低下しているとは感じていないと述べたことは言及する価値があります。

3. WebになるというRustの野望

結局のところ、Rust エコシステムは比較的若いですが、1.0 のリリースからまだ 8 年しか経っていません。しかし、Rust とその Web エコシステムは、現実世界のアプリケーションを構築するための実行可能な選択肢となる成熟レベルに達しています。

arewewebyet.org が確認しているように、Rust は明らかに Web に対応する準備ができています。

1 つ目は、Web アプリケーションの堅牢でパフォーマンスの高い基盤である非同期ランタイムである tokio です。2 つ目、最も重要なことは、Rust には axum や actix-web などの成熟し、よく管理された Web フレームワークがすでに存在していることです。関連するすべてのデータ ストアと ORM には成熟したドライバーがあり、最終的には、(逆) シリアル化、国際化、テンプレート、可観測性など、Web アプリケーションの構築に関連する他のすべての側面をカバーするライブラリが見つかります。

全体として、Rust は、野心的な Web バックエンドの構築に堅牢で安定したビルディング ブロックを提供します。

4. Rust for Web に切り替える必要がありますか?

もちろん、なぜ Rust に切り替える必要があるのか​​と疑問に思う人もいるかもしれません。Ruby、Java、Elixir、TypeScript、Go、またはその他の言語をすでに使用しているチームにとって、Rust に切り替えるメリットはありますか?

Rust が Web 構築に優れた選択肢となる 2 つの重要な側面があります:その効率とパフォーマンス、もう 1 つは信頼性と保守性の利点をもたらす型システムです。

1. 効率とパフォーマンス

Rust はその効率性とパフォーマンスの高さで知られています。Web アプリケーションで一般的に使用される JavaScript、Ruby、Python などの言語を簡単に桁違いに上回るパフォーマンスを発揮します。他の言語 (Java、C#、Go など) には、より高いパフォーマンスの上限がある場合がありますが、Rust ツールキットがそのまま提供するパフォーマンスのレベルに近づくには、多くのエンジニアリング努力を費やす必要があります。

さらに、Rust にはガベージ コレクターがバンドルされていないという重要な利点があります。ガベージ コレクション言語は高速ですが、一貫して良好なパフォーマンスを発揮することはできません。ガベージ コレクターは、未使用のメモリを解放するために一時停止を導入し、アプリケーションのテール レイテンシーに悪影響を及ぼします。Rust にはこの問題はありません。このようなスパイクが発生することなく、安定したパフォーマンスを提供します。

このような安定した一貫したパフォーマンスを実現できる言語は、他に C と C++ だけです。残念ながら、これら 2 つの言語は、特に手動メモリ管理に関しては、いたるところに落とし穴があり、足を痛める傾向があります。Linux の作成者である Linus Torvalds 氏は次のように述べています。

「ハードウェアに非常に近いので、それで何でもできます。危険です。チェーンソーをジャグリングするようなものです。また、落とし穴がたくさんあり、見落としやすいこともわかりました。

これらの危険性があるため、C と C++ は、これら 2 つの言語の専門家であるか、専門家のチームを抱えている場合を除き、使用する必要があります。そうしないと、セキュリティ ホールだらけの不安定なシステムが得られます。

また、Web の世界では、誰もが JavaScript、Python、Ruby、Elixir などの非常に異なる言語を主に使用しているため、この種の専門知識を持っている人はほとんどいないことを忘れないでください。代わりに、Rust では同じ落とし穴に悩まされることがなく、開発者が以前のレベルの効率でソフトウェアを構築できるようになります。

Rust は通常、Web バックエンドの構築に使用される他のテクノロジーよりも桁違いに優れたパフォーマンスを発揮し、メモリ使用量を大幅に抑えます。

もちろん、Rust Web サーバーが他のテクノロジーと比べてほんのわずかな時間でリクエストに応答できるということは、より少ないサーバーで同じ数のリクエストに応答できることも意味し、結果的にホスティング コストが削減されることになります。

中小企業の製品や企業にとって、ホストされるクラウド サーバーの数を減らすことは、月々の費用を簡単に削減できることを意味します。

Python サービスの平均速度は約 50 req/s、NodeJS は約 100 req/s、Rust は約 690 req/s でした。通常は 1 つの Python サービスをホストする k8 EKS ノードに 4 つの Rust サービスをインストールできます。——Redditユーザーはそう言いました

ただし、コスト削減は全体の一部にすぎず、使用するサーバーの数が減るということは、使用するエネルギーも少なくなるということを意味します。再生可能エネルギーでデータセンターを運営するのは素晴らしいことですが、最も環境に優しいエネルギー源は依然として私たちが使用していないものです。Rust は気候危機を解決しないかもしれませんが、ここで重要なのは、私たちが作成したソフトウェアを実行すると、現実世界に影響を与える実際のリソースも消費するということです。ソフトウェア業界はこれを忘れがちです。リソースをより効率的に使用し、より少ない入力で同じ出力を得ることができれば、これはテクノロジーを選択する際の重要な考慮事項です。

 

2. 信頼性と保守性

パフォーマンスと効率は重要ですが、多くの場合、おそらくより関連性のある理由は、Rust の強力な型システムによってもたらされる信頼性と保守性の向上です。

次のようなコード スニペットは、Web アプリケーション (Ruby on Rails) では非常に一般的です。

class User
  attr :name
  attr :active
  attr :activation_date


  def activate(activation_date)
    self.active = true
    self.activation_date = activation_date
    save
  end


  def save
  end
end




user.activate(Time.now)

このコードは非常に簡潔で読みやすく、このようなコードを作成するとすぐに目的地に到達できますが、問題もあります。この例では、ユーザーの属性は確認できますが、それらの属性にどのようなルールがあるのか​​はわかりません (たとえば、active が true の場合、activation_date も設定する必要があるかもしれません。active が false の場合、おそらく activity_date を設定する必要があります)。ゼロですか?)これらの仮説をテストするには、activate メソッドの実装を検討する必要があり、情報を取得するのに比較的多大な労力がかかりました。

activate メソッドの呼び出しを見ても、それがエラーをスローするかどうか、またはどのタイムゾーンで時間を費やすべきかを知る方法はありません。Ruby はその悪名高い柔軟性を考えると少し極端かもしれませんが、これらの問題の多くは他の言語にも同様に存在します。Javaを例に挙げてみましょう。型システムの active プロパティと activity_date プロパティに関するルールをエンコードすることはまだできません。また、これらのプロパティが null である可能性があるとしても、実行時に s に対して NullPointerException が発生するリスクがあります。

コードベースが成長して開発チームが成長するにつれて、あるいは単に何人かが辞めたり参加したりするにつれて、変更が発生します。コードベースに携わる全員が、アプリケーション全体とコードベース全体で行われるすべての暗黙の前提についての完璧なメンタル モデルを持っていますが、それは困難であり、その代わりに概念を理解するにはレガシー コードを注意深く読む必要があります。これは効率を低下させるだけでなく、実稼働環境でのエラー率の増加にもつながる可能性があります。

上記と同じコード スニペットですが、Rust ではより明確で表現力豊かになります。

enum User {
    Inactive {
        name: String,
    },
    Active {
        name: String,
        active: bool,
        activation_date: DateTime<Utc>,
    },
}


impl User {
    fn activate(&self, activation_date: DateTime<Utc>) -> Result<(), DBError> {
        match self {
            User::Inactive { name } => {
                let new_user = User::Active {
                    name: name.clone(),
                    active: true,
                    activation_date: activation_date,
                };
                new_user.save()
            }
            User::Active { .. } => Err(Error::default()),
        }
    }


    fn save(&self) -> Result<(), DBError> {
    }
}

まず、ユーザーモデルについては、Rust の enum 関連データを使用できます。こうすることで、非アクティブ ユーザーとアクティブ ユーザーがどのようなものであるか、またどのようなシナリオでどの属性を設定できるかが完全に明確になります。実際、アクティブ ユーザーと非アクティブ ユーザーは同じ属性さえ持っていませんが、各ユーザーは意味のあるプロパティだけを持っています。それ。これらはそれぞれのユーザー状態を表します。また、プロパティの型は明確に定義されています。Rust は型指定されているのに対し、Ruby は明らかに型指定されていないだけでなく、型も非常に正確です。たとえば、フィールドの場合、activation_date によって予期されるタイムゾーンも型内で正確です。

関数のシグネチャ activate は、Rails サンプルで暗黙的に示されている多くの情報も明示的にエンコードします。また、予期されるタイムゾーンの activity_date の型は正しく、関数は Rust のタイムゾーン Result を返します。これは、呼び出し時にエラーが発生した可能性があることを明確に示しています。未処理のランタイム例外が発生しないように、Rust コンパイラが実際に処理する必要がある Result の成功およびエラーのバリアント。

また、Rust には (Java とは異なり) 暗黙的な null 可能性の概念がないため、関数の activity_date 引数には、関数の呼び出し時に常に値が保証されます。activate_date が計算される値を持たない可能性がある場合、期待される DateTime<Utc> 型ではないため、関数 activate に渡される Option<DateTime<Utc>> が渡されない可能性があります。Rust コンパイラは、 activate メソッドの呼び出しを引き起こす Option の一部のバリアントのコード パスのみを許可します。そのため、関数の実行時に activity_date には値が保証されます。

これは明らかに非常に単純な例ですが、Rust の 2 つの主な長所をうまく示しています。

(1) Rails の例に暗黙的に含まれている概念とルールの多くは、Rust コードの型を通じて明示的に伝えられます。アクティブ ユーザーと非アクティブ ユーザーは明確に区別され、日付フィールドの場合は、予想されるタイム ゾーンも型にエンコードされます。この表現力により、特にコード ベースを初めて使用する人にとってコードが理解しやすくなり、保守性が向上します。

(2) Rust では信頼性も大幅に向上します。これは、他の言語 (Java や Go などの型付き言語を含む) で一般的なエラーのクラス全体が、実行時ではなくコンパイル時に検出されるためです。コンパイラは、関数 activity_date のパラメータ activate に値があること、および関数が処理のために返す可能性のあるエラーがあることを保証します。

全体として、Rust がもたらす信頼性と保守性の向上は、誰もが Rust のパフォーマンスに注目しているときに見落とされがちです。ただし、これらの利点は、純粋なパフォーマンスの数値よりも、プロジェクトの長期的な成功に関連している可能性があります。

5. サビは甘い前に苦い

Rust の主な利点は信頼性、保守性、効率、パフォーマンスであるため、この言語の使用例は明らかにこれら 4 つの領域に特に関連します。ただし、メリットのコストを考慮する必要があります。

全体として、Rust は他のテクノロジー、特に Web プロジェクトで一般的に使用されるテクノロジーと比較して、依然として多額の先行投資を必要とします。

JavaScript や Ruby などの言語は結果をすぐに取得できるように設計されていますが、Rust にはあまり自由度がなく、プログラムが動作する結果を取得する前にすべてのコンパイラ チェックに合格する必要があります。Rust を使用するには、これらの言語よりも多くの初期作業が必要です。さらに、Rust を使用できるようになる前に登るべき山があります。それは、Rust の独自の所有権システムをマスターすることです。

ただし、プロジェクトの初期段階を超えて、より長い期間に視野を広げる場合、保守性、信頼性、安定性などの側面が非常に重要になり、Rust を使い始めたときに行われた追加投資は時間の経過とともに必要になる可能性があります。時間は報酬をもたらします—

Rust アプリケーションは信頼性が高いため、バグ修正に費やす時間が短縮され、メンテナンスが容易になり、成長し変化するチームと効率的に作業することが容易になります。

最終的には、Rust のワークロードは最初は大きく、次に小さくなり、最初は苦く、次に甘いことがわかります。他の言語の場合は、その逆のことがよくあります。時間の経過とともに、チームが成長するにつれて、信頼性と保守性の課題はより大きな影響を及ぼし、よりコストがかかり、より多くの作業が必要になります。

 

6. Rustを使用する前のいくつかの質問

Rust の強みと投資曲線を考慮すると、特定の状況で Rust を選択するかどうかを評価する際に答えるべき主な質問は次のとおりです。

(1) チームはすでに Rust の専門知識を持っていますか (多くの開発者は暇なときに Rust でコードを書いているため、Rust を使用していないチームの多くは実際にはすでに専門知識を持っています)?

(2) 信頼性の要件は何ですか?

(3) 長期保守計画とは何ですか?

(4) システム構築の規模はどれくらいですか? Rust でホスティングにかかる​​費用はどれくらい節約できますか?

(5) 上記の質問に対する答えに基づいて、追加の初期投資は価値がありますか?

追加の初期投資に見合う価値がないと判断されたケースもあれば、明らかにRustに有利な評価となったケースもありました。これまでに確認した典型的な使用例には次のようなものがあります。

(1) 製品の主要なビジネスロジックを実現する基幹業務システムは、信頼性と長期保守性が第一に考慮されます。

(2) 金融システムの場合、通常、エラーに対する許容度は低く、Rust によってもたらされる安定性の向上が決定的な要因となる可能性があります。また、パフォーマンスも重要な要件であり、トランザクション システムなどの特定のシナリオでは明らかに財務上の影響があります。

(3) 高いスループットとパフォーマンスを提供できなければならないシステムは、明らかに Rust の恩恵を受けるでしょう。複数のマイクロサービスの前に配置されるプロキシ サーバーなどのシステムは、最小限のオーバーヘッドと一貫したパフォーマンスを備えている必要があります。このような場合、ガベージ コレクション言語とその信頼性の低いパフォーマンス特性は通常、選択肢にはなりません。

(4) 最後に、大規模に運用されるシステムには、ホスティング コストを節約できる大きな可能性があります。

Rust を使用する決定が下されたら、主に 2 つの採用パスがあります。Rust でアプリケーション全体を最初から (書き直す) か、他のテクノロジーと合わせて段階的に採用することを検討するかのいずれかです。スペースの都合上、拡張は行いません。

開発業界に強いセブン

JNPF は多くの人が使用しようとしており、機能のマスターであり、これをベースにあらゆる情報システムを開発できます。

ローコードとは、開発プロセスで繰り返される特定のシナリオとプロセスを個別のコンポーネント、API、データベース インターフェイスに視覚化し、ホイールの繰り返し作成を回避することです。したがって、プログラマーの生産性が大幅に向上します。

公式 Web サイト: www.jnpfsoft.com/?csdn、時間があれば、知識を広げることができます。

業界をリードする SpringBoot マイクロサービス アーキテクチャを採用し、SpringCloud モデルをサポートし、迅速なシステム開発、柔軟な拡張、シームレスな統合、および高性能アプリケーションの包括的な機能を満たすプラットフォーム拡張のための完全な基盤を備えています。分担して協力して各セクションを担当します。

データベースモデリングからWeb API構築、ページデザインまで、より技術要件の高いアプリケーション開発をサポートするため、従来のソフトウェア開発とほとんど変わりませんが、ローコード可視化モードのみで、「足し算」「追加」を構築する繰り返し作業が不要になります。 「削除、変更、クエリ」機能が縮小されます。

おすすめ

転載: blog.csdn.net/Z__7Gk/article/details/132324378