次のテクノロジとの非同期性を実現するためのアプローチの概念上の違いは何ですか。私の主な検索は Django でしたが、テクノロジーの背後にあるアイデアを説明する概念的な回答を探しています。
- Socket.IO と gevent
- WebSocket
- RabbitMQ & セロリ
これらのアプローチのほとんどに関する Web 上のチュートリアルを見つけましたが、背後にある概念は説明されておらず、技術的な実装のみが説明されています。
次のテクノロジとの非同期性を実現するためのアプローチの概念上の違いは何ですか。私の主な検索は Django でしたが、テクノロジーの背後にあるアイデアを説明する概念的な回答を探しています。
これらのアプローチのほとんどに関する Web 上のチュートリアルを見つけましたが、背後にある概念は説明されておらず、技術的な実装のみが説明されています。
非同期プログラミングは、理解するのが非常に難しい場合があります。基本的な考え方は、ブロッキング IO を回避する方法です。ブロック IO とは、ファイルへの書き込みからデータベースへのクエリ、REST API へのクエリ、何か他のことが起こるのを待っている間にアプリケーションの処理フローを中断するものすべてです。
たとえば、Gallery アプリケーションを構築すると、ユーザーは大きな HD 解像度の画像をアップロードして見せびらかすことができます。ただし、ユーザーがアップロードするこの大きな画像、サムネイル、解像度の低いバージョンなどのさまざまなコピーを作成する必要があります。これを行うには、IO のブロックが少し必要です。画像を圧縮する必要があり、それは非常に集中的であり、圧縮したらそれらをディスクに書き込む必要があります。その後、このすべての情報を DB に保存する必要がある場合があります。1 つのリクエストでこれを行うと、ユーザーのパフォーマンスが非常に遅くなり、正直なところ、必要なすべてのタスクを完了する前にバックエンド プロセスがタイムアウトする可能性があります。また、スケーリングもうまくいきません。
これを回避する 1 つの方法は、非同期プログラミングを使用することです。ユーザーのアップロードが完了すると、画像を圧縮したり、DB にデータを書き込んだりするチャンスを待っている他のアプリケーションにさまざまなシグナルを送信できます。シグナルが発生すると、これらのバックグラウンド プロセスが機能し始めます。ユーザーは長いリクエストが完了するまで座って待つ必要はありません。代わりに、サイトの閲覧を続け、コーヒーを飲み、サムネイルが作成されたときに通知を受け取ることができます。等
上記の例では、Celery、RabbitMQ、および SocketIO (または TornadIO) を使用してこれを実装します。ユーザーのアップロードが完了したら、セロリ タスクを起動します。セロリは RabbitMQ (私は Redis が好きです) を使用してタスクを管理します。10、20、30 人のセロリ ワーカーがこれらの画像のアップロードをバックグラウンドで処理します。セロリが仕事を終えると、ユーザーのブラウザも接続されているWebソケットを処理するために、ソケットサーバーにメッセージを送信します。これにより、ユーザーがアップロードした新しい画像を世界と共有する準備ができたという通知がリアルタイムでユーザーに送信されます。
これは、非同期イベント ドリブン プログラミングに関する非常に基本的な例です。とにかくよくわかります。他の誰かが私を修正してください。
これが役立つことを願っています。:)