エッジクラウド上の高性能で安全なマイクロサービス

エッジ クラウドを使用すると、開発者はマイクロサービス (つまり、きめ細かい Web サービス) をユーザーの近くに展開できるため、ユーザー エクスペリエンスの向上 (つまり、非常に速い応答時間)、優れたセキュリティ、高可用性が実現します。エッジ クラウドは、ローカルまたはプライベート データ センター、CDN ネットワーク、通信データ センター (5G MEC など) を利用してコンピューティング サービスを提供します。エッジクラウドの成功事例には、Cloudflare、Fastly、Akamai、fly.io、Vercel、Netlify などが含まれます。

ただし、エッジ クラウドは、大規模なパブリック クラウドと比較してリソースに制約のある環境です。エッジ マイクロサービス自体が遅い、肥大化している、または安全でない場合、エッジ クラウドにデプロイする利点はすべて失われます。

この記事では、軽量で高性能な Web サービスを作成し、それをエッジ クラウド プロバイダーであるfly.ioに無料でデプロイする方法を説明します。

Fly.io は、世界中にエッジ データ センターを展開する最先端のクラウド VM サービス プロバイダーです。fly.io VM は、アプリケーション サーバー、データベース、および私たちのようなマイクロサービス用の軽量ランタイムをサポートします。

これらのマイクロサービスのセキュリティ サンドボックスとして WasmEdge ランタイムを使用します。WasmEdge は、クラウドネイティブ サービス用に最適化された WebAssembly ランタイムです。Rust または JavaScript で書かれたマイクロサービス アプリケーションを WasmEdge ベースの Docker イメージにパッケージ化します。このアプローチには、いくつかの大きな利点があります。

  • WasmEdge は、サンドボックス アプリケーションをネイティブに近い速度で実行します。査読済みの研究によると、WasmEdge はネイティブ マシン コードを実行する Linux に近い速度で Rust プログラムを実行できます。
  • WasmEdge は非常に安全なランタイムです。アプリケーションを外部および内部の脅威から保護します。
    • WasmEdge ランタイムの攻撃に対する脆弱性は、従来の Linux OS ランタイムに比べて大幅に軽減されています。
    • WebAssembly サンドボックスでは明示的に宣言されたアクセスのみが許可されるため、ソフトウェア サプライ チェーン攻撃のリスクが大幅に軽減されます。
  • WasmEdge は、標準の Linux OS ランタイム イメージのわずか 1/10 のメモリ フットプリントを備えた、完全なポータブル アプリケーション ランタイム環境を提供します。
  • WasmEdge ランタイムはクロスプラットフォームです。これは、開発用と展開用のマシンが同じである必要がないことを意味します。WasmEdge アプリケーションを作成したら、 fly.ioインフラストラクチャを含む WasmEdge をサポートする任意の場所にデプロイできます

複雑なアプリケーションの場合、このパフォーマンスの利点はさらに大きくなります。たとえば、WasmEdge AI 推論アプリケーションには Python のインストールは必要ありません。WasmEdgeのnode.jsアプリケーションも、node.jsとv8をインストールする必要はありません。

この記事の次は、実行方法を説明します。

  • 非同期HTTPサーバー(Rust)

  • 非常に高速な画像分類 Web サービス (Rust) と

  • node.js Webサーバー

  • データベース接続を備えたステートフル マイクロサービス

WasmEdge ではこれらすべてが迅速かつ安全に実行され、消費するリソースは通常の Linux コンテナーに必要なリソースの 1/10 のみです。

準備

まず、システムに Docker ツールがインストールされていることを確認します。そうでない場合は、このチュートリアルの最初のセクションに従ってDocker をインストールします。次に、オンライン インストーラーを使用して、WasmEdge、Rust、fly.ioflyctlツールをインストールします。

WasmEdgeをインストールします。詳細はこちらをご覧ください。

curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- -e all

Rustをインストールします。詳細はこちらをご覧ください。

`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`

fly.io用のflyctlツールをインストールします。詳細はこちらをご覧ください。

`curl -L `[`https://fly.io/install.sh`](https://fly.io/install.sh)` | sh`

インストール済みflyctl 之后,指示に従ってfly.io無料アカウントください。これで、Web サービスをエッジ クラウドにデプロイする準備が整いました。

Rust で書かれたシンプルなマイクロサービス

最初の例は、Rust で書かれた単純な HTTP サービスです。これは、任意の複雑なビジネス ロジックをサポートするように拡張できる最新の Web アプリケーションを示しています。このマイクロサービスは、人気のある Tokio および Hyper Crate に基づいており、非常に高速で非同期 (ノンブロッキング) で、開発者にとって非常に簡単に作成できます。

完全に静的にリンクされた WasmEdge イメージは、わずか 4MB です (ベース Linux イメージの 40MB と比較して)。Rust の tokio および hyper フレームワークで書かれた非同期 HTTP サービスを実行するには、これで十分です。

次の 2 つの CLI コマンドを実行して、 WasmEdge の Slim Docker イメージからfly.ioアプリケーションを作成します。

$ flyctl launch --image juntaoyuan/flyio-echo
$ flyctl deploy

大丈夫!curl コマンドを使用して、デプロイされた Web サービスが成功したかどうかをテストできます。投稿したデータはすべてエコーされます。

$ curl https://proud-sunset-3795.fly.dev/echo -d "Hello WasmEdge on fly.io!"
Hello WasmEdge on fly.io!

juntaoyuan/flyio-echoイメージの dockerfile には、WasmEdge ランタイムとカスタム Web アプリケーションの完全なパッケージが含まれていますWasmEdge_hyper_server.wasm

FROM WasmEdge/slim-runtime:0.11.0
ADD WasmEdge_hyper_server.wasm /
CMD ["WasmEdge", "--dir", ".:/", "/WasmEdge_hyper_server.wasm"]

WasmEdge_hyper_server.wasm アプリを構築するRust ソース コード プロジェクトはここにあります。Tokio API を使用して HTTP サーバーを起動します。サーバーはリクエストを受信すると、echo()そのリクエストを非同期に処理する関数に委任します。これにより、マイクロサービスは複数の同時 HTTP リクエストを受け入れて処理できるようになります。

#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    let addr = SocketAddr::from(([0, 0, 0, 0], 8080));

    let listener = TcpListener::bind(addr).await?;
    println!("Listening on http://{}", addr);
    loop {
        let (stream, _) = listener.accept().await?;

        tokio::task::spawn(async move {
            if let Err(err) = Http::new().serve_connection(stream, service_fn(echo)).await {
                println!("Error serving connection: {:?}", err);
            }
        });
    }
}

非同期echo()関数は以下のとおりです。ハイパーによって提供される HTTP API を利用して、リクエストを解析し、レスポンスを生成します。ここでのレスポンスは単なる「リクエストデータ本体」です。

async fn echo(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
    match (req.method(), req.uri().path()) {
        ... ...
        (&Method::POST, "/echo") => Ok(Response::new(req.into_body())),
        ... ...

        // Return the 404 Not Found for other routes.
        _ => {
            let mut not_found = Response::default();
            *not_found.status_mut() = StatusCode::NOT_FOUND;
            Ok(not_found)
        }
    }
}

次に、基本的なマイクロサービスにスパイスを加えてみましょう。

Rust で書かれた AI 推論マイクロサービス

この例では、画像を分類するための Web サービスを作成します。Tensorflow Lite モデルを通じてアップロードされた画像を処理します。Tensorflow にアクセスするには、ネイティブのマシンコード速度 (GPU ハードウェアなど) で推論タスクを実行する複雑な (そして肥大化した) Python プログラムを作成するのではなく、WasmEdge の Rust API を使用します。WASI-NN 標準を通じて、WasmEdge の Rust API は、Tensorflow、PyTorch、OpenVINO、およびその他の AI フレームワークの AI モデルで使用できます。

WasmEdge のフットプリントは、完全な Tensorflow Lite 依存関係を含む AI 推論アプリケーションの場合 115 MB 未満です。比較すると、標準の Tensorflow Linux イメージは 400MB を超えます。

WasmEdge + Tensorflow のスリム Docker イメージから開始して、次の 2 つの CLI コマンドを実行して、fly.ioアプリケーションを作成してデプロイします。

$ flyctl launch --image juntaoyuan/flyio-classify
$ flyctl deploy

大丈夫!curl コマンドを使用して、デプロイされた Web サービスが実際に動作するかどうかをテストできます。画像分類結果を尤度ランクとともに返します。

$ curl https://silent-glade-6853.fly.dev/classify -X POST --data-binary "@grace_hopper.jpg"
military uniform is detected with 206/255 confidence

juntaoyuan/flyio-classifyDocker イメージの Dockerfile には、WasmEdge ランタイムの完全なパッケージ、Tensorflow ライブラリ全体とその依存関係、およびカスタム Web アプリケーションが含まれていますWasmEdge_hyper_server_tflite.wasm

FROM WasmEdge/slim-tf:0.11.0
ADD WasmEdge_hyper_server_tflite.wasm /
CMD ["WasmEdge-tensorflow-lite", "--dir", ".:/", "/WasmEdge_hyper_server_tflite.wasm"]

WasmEdge_hyper_server_tflite.wasmアプリの構築に使用されるRust ソース コード プロジェクトはここにあります。前の例で示したように、 tokio ベースの非同期 HTTP サーバーは asyncmain()関数内にあります。classify()この関数は、リクエスト内の画像データを処理し、画像をテンソルに変換し、Tensorflow モデルを実行して、戻り値 (テンソル) をテキスト ラベルと認識されたコンテンツの確率に変換します。

async fn classify(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
    let model_data: &[u8] = include_bytes!("models/mobilenet_v1_1.0_224/mobilenet_v1_1.0_224_quant.tflite");
    let labels = include_str!("models/mobilenet_v1_1.0_224/labels_mobilenet_quant_v1_224.txt");
    match (req.method(), req.uri().path()) {
        
        (&Method::POST, "/classify") => {
            let buf = hyper::body::to_bytes(req.into_body()).await?;
            let flat_img = WasmEdge_tensorflow_interface::load_jpg_image_to_rgb8(&buf, 224, 224);

            let mut session = WasmEdge_tensorflow_interface::Session::new(&model_data, WasmEdge_tensorflow_interface::ModelType::TensorFlowLite);
            session.add_input("input", &flat_img, &[1, 224, 224, 3])
                .run();
            let res_vec: Vec<u8> = session.get_output("MobilenetV1/Predictions/Reshape_1");
            ... ...
            
            let mut label_lines = labels.lines();
            for _i in 0..max_index {
              label_lines.next();
            }
            let class_name = label_lines.next().unwrap().to_string();

            Ok(Response::new(Body::from(format!("{} is detected with {}/255 confidence", class_name, max_value))))
        }

        // Return the 404 Not Found for other routes.
        _ => {
            let mut not_found = Response::default();
            *not_found.status_mut() = StatusCode::NOT_FOUND;
            Ok(not_found)
        }
    }
}

この記事の最後では、データベース クライアントや Web サービス クライアントなどの機能を Rust マイクロサービスに追加する方法について説明します。

Node.js の単純なマイクロサービス

Rust ベースのマイクロサービスは軽量で高速ですが、誰もが (まだ) Rust 開発者であるわけではありません。JavaScript に慣れている場合でも、エッジ クラウドで WasmEdge のセキュリティ、パフォーマンス、フットプリントの小ささ、移植性を最大限に活用できます。具体的には、node.js APIを使用してWasmEdge用のマイクロサービスを作成することが可能です。

Node.js アプリケーションの場合、WasmEdge のフットプリントは 15MB 未満です。比較すると、標準の Node.js Linux イメージは 150MB を超えます。

WasmEdge + node.js のスリム Docker イメージから開始して、次の 2 つの CLI コマンドを実行して、fly.ioアプリケーションを作成してデプロイします。

$ flyctl launch --image juntaoyuan/flyio-nodejs-echo
$ flyctl deploy

大丈夫!curl コマンドを使用して、デプロイされた Web サービスが実際に動作することをテストできます。投稿したデータをエコーし​​ます。

$ curl https://solitary-snowflake-1159.fly.dev -d "Hello WasmEdge for Node.js on fly.io!"
Hello WasmEdge for Node.js on fly.io!

juntaoyuan/flyio-nodejs-echoDocker イメージの Dockerfile には、WasmEdge ランタイム、QuickJS ランタイム、 WasmEdge_quickjs.wasmnode.js モジュールの完全なパッケージ、および Web サービス アプリケーションが含まれていますnode_echo.js

FROM WasmEdge/slim-runtime:0.11.0
ADD WasmEdge_quickjs.wasm /
ADD node_echo.js /
ADD modules /modules
CMD ["WasmEdge", "--dir", ".:/", "/WasmEdge_quickjs.wasm", "node_echo.js"]

node_echo.jsアプリケーションの完全な JavaScript ソース コードを以下に示します。明らかに、標準のnode.js APIを使用して、HTTPリクエスト本文をエコーする非同期HTTPサーバーを作成しているだけです。

import { createServer, request, fetch } from 'http';

createServer((req, resp) => {
  req.on('data', (body) => {
    resp.end(body)
  })
}).listen(8080, () => {
  print('listen 8080 ...\n');
})

WasmEdge の QuickJS エンジンは、node.js サポートだけでなく、Tensorflow 推論サポートも提供します。JavaScript 開発者がAI 推論アプリケーションを簡単に作成できるように、Rust TensorFlow と WASI-NN SDK を JavaScript API にラップしました

エッジでのステートフルなマイクロサービス

WasmEdge を使用すると、データベースを基盤としたステートフル マイクロサービスを作成することもできます。この GitHubリポジトリには、 WasmEdge アプリケーション用の tokio ベースのノンブロッキング データベース クライアントの例が含まれています。

  • MySQL クライアントを使用すると、WasmEdge アプリケーションがほとんどのクラウド データベースにアクセスできるようになります。
  • WasmEdge アプリケーションは、アナログをエッジ キャッシュまたはデータベースとして使用できます。

次に、WasmEdge SDK とランタイムを使用して、エッジ クラウド上にさまざまな Web サービスを構築します。結果を見るのが待ちきれません!

おすすめ

転載: blog.csdn.net/weixin_42376823/article/details/127076536