新しい JavaScript モジュールのリクエストが同期的であるのはなぜですか? ジョブキューでのみ使用することになっていますか?
ArangoDB で非同期の http(s) リクエストを作成する方法はありますか?
新しい JavaScript モジュールのリクエストが同期的であるのはなぜですか? ジョブキューでのみ使用することになっていますか?
ArangoDB で非同期の http(s) リクエストを作成する方法はありますか?
完全な開示: 私は ArangoDB の開発チームの一員であり、主に Foxx とすべての JavaScript に取り組んでいます。org/arangodb/request
モジュールを書いたのも私です。
ArangoDB は、多くの類似点 (V8 JavaScript エンジンの使用など) を共有しているにもかかわらず、Node.js とは異なる環境です。Node.js (またはブラウザー) とは異なり、ArangoDB はスレッドベースの同時実行モデルを使用し、イベント ループを備えていません。ただし、スレッドは JavaScript では公開されていない (実際、V8 ではすべてのスレッドが完全に分離されている) ため、通常はスレッドについて考える必要さえありません。
ブラウザーや Node.js ではsetTimeout
、イベント ループを介して (一定の時間が経過するか、外部イベントが発生するまで) コードの実行を遅らせることで、機能のような関数が動作します。
ArangoDB では、コードは常に線形に実行されます。たとえば、着信 HTTP 要求は JavaScript で Foxx コントローラーに渡され、コントローラーが戻るとすぐに応答が送信されます。を使用できたとしても、使用setTimeout
していた外部リソース (またはドキュメント コレクションやトランザクションなどの「内部」リソースでさえ) は、遅延コードが実行されるまでに既になくなっている可能性があります。
このためrequest
、モジュールによって提供される機能org/arangodb/request
も完全に同期的です。promise を返したり、コールバックを受け取ったりする代わりに、着信応答データを直接返します。また、明らかに npmと同じモジュールではなくrequest
、その API の実装が Node.js の外部で可能であるという点で、そのモジュールの API に基づく同期実装です (たとえば、ストリームを含まず、コールバックを取得する代わりにリモート応答を返します)。
Node.js/io.js のバックグラウンドを持っている場合、ノンブロッキング IO はより高いスループットを達成できるため、これは間違っていると感じるかもしれませんが、ArangoDB と Node.js の設計目標は大きく異なることに注意してください。Node.js は、ストリームとネットワーク接続を中心に構築されています。ArangoDB は永続的なデータ ストレージとして構築されており、代わりにトランザクションとロックを処理する必要があります。
重大なネットワーク遅延が発生する可能性が高い場合、または外部 API の応答がクライアントの応答に不可欠でない場合、Foxx コントローラーから外部 API に直接アクセスすることはおそらく最善の方法ではありません。これが Foxx キューの目的です。トランザクション電子メールは、この代表的な例です。
Foxx は非常に用途が広いですが、その主な焦点は、ほとんどのアプリケーション (特に、データの近くで実行することでメリットが得られるロジック) をデータベースに直接移動できるようにすることです。小規模から中規模のプロジェクトの場合、外部 API 呼び出しを境界内で実行することでおそらく回避できます。しかし、アプリケーションが主にネットワーク経由で他のサービスと通信することに関係している場合、そのコードをデータベースで実行することはおそらく最適なソリューションではありません。
幸いなことに、ArangoDB は他のものとうまく連携するため、負荷が高いときにネットワーク集約型のコードがパフォーマンスのボトルネックになることがわかった場合は、Foxx から簡単に移動できます。Foxx によってアプリケーション サーバーが不要になるわけではありませんが、複雑さを大幅に軽減できます。
ブライアンの答えの修正として: 残念ながら、同期環境で非同期コードを作成することはできません。Promises/A+ 仕様では、promise を非同期で実行する必要があると定義しています。setTimeout
ネイティブにサポートされていない場合でも、や などの既存の関数の上に構築する必要がありますがprocess.nextTick
、ArangoDB はどちらも実装していません。