🔖

自作Http Client: IO Buffer

2023/12/18に公開

Http Client

以下に処理のフローを整理する

  • execute
  • enqueue

追加機能について

  • support http execute
  • support http enqueue
  • add test codes
  • retry機能追加(interceptorにて実現すること)
  • connection poolの利用
  • support tls connection
  • calledNoMoreExchangesについて確認すること
  • support cancel feature

BufferedSource

Connection: Keep-Alive ヘッダーが使われている場合、HTTP接続は複数のリクエストとレスポンスの交換に再利用される.
この設定の下で source.readUtf8() を使用すると、以下のような挙動が起こる.

  • 接続の継続
    • Keep-Alive は接続を開いたままに保つことを指示
    • そのため、サーバーは接続をすぐに閉じず、クライアントからの追加のリクエストを待機することになる
  • データの待機
    • source.readUtf8() はストリームの終わり(EOF)またはエラーが発生するまでデータを読み続ける
    • Keep-Alive の場合、サーバーが接続を閉じない限り、EOF に到達しないため、クライアントはずっとデータを待ち続けることになる
  • タイムアウトの発生
    • データが来ない状況で、クライアントが無期限に待ち続けると、最終的にクライアント側のタイムアウト設定により処理が中断される

この問題を解決するためには、以下のような方法が考えられる.

  • 明示的な終了シグナルの利用
    • サーバーからクライアントへのデータ送信が完了したことを示す明確なシグナル(たとえば特定のトークンやEOF)を利用
  • バッファリングとタイムアウトの設定
    • データをバッファリングし、特定の条件が満たされたら読み取りを終了するようにする
    • また、適切なタイムアウト設定を行い、無限に待ち続けることを防ぐ
  • 非同期処理
    • データ読み取りを非同期に行い、待機中に他の処理を実行できるようにする

これらの方法を適用することで、Keep-Alive 接続を効率的に利用し、タイムアウト問題を避けることが可能になる.

source.readUtf8()

  • このメソッドは、ソースから直接文字列データを読み取り
  • データがすぐに利用可能でない場合、メソッドはデータが到着するまでブロック(待機)する

このため、データの到着が遅れるとタイムアウトになる可能性がある

source.buffer.readUtf8()

  • こちらのメソッドは、内部バッファからデータを読み取り
  • 内部バッファには既に読み込まれたデータが含まれている可能性があり、そのためデータの到着を待たずに直接読み出すことができる

このため、タイムアウトの問題が少なくなる

Connection: Keep-Alive ヘッダーが使われている場合、HTTP接続は複数のリクエストとレスポンスの交換に再利用されることを意味します。この設定の下で source.readUtf8() を使用すると、以下のような挙動が起こります:

接続の継続: Keep-Alive は接続を開いたままに保つことを指示します。そのため、サーバーは接続をすぐに閉じず、クライアントからの追加のリクエストを待機することになります。

データの待機: source.readUtf8() はストリームの終わり(EOF)またはエラーが発生するまでデータを読み続けます。Keep-Alive の場合、サーバーが接続を閉じない限り、EOF に到達しないため、クライアントはずっとデータを待ち続けることになります。

タイムアウトの発生: データが来ない状況で、クライアントが無期限に待ち続けると、最終的にクライアント側のタイムアウト設定により処理が中断されます。

Discussion