5

職場では、Netflix のFeign Clientを使用してサービス間のリクエストを処理しています。しかし、特に Netflix のよく知られているビデオ ストリーミングのビジネス モデルを考えると、データをストリーミングする能力が明らかに欠如していることに私は戸惑っています。ここで明らかに何かが欠けています。

説明するために、データのストリームをService AFeign Client に要求し、応答でストリームを送信するとします。この時点で、Feign Client のメソッドが呼び出されます。Service BService Bexecute()

@Override public Response execute(Request request, Options options) throws IOException {
  HttpURLConnection connection = convertAndSend(request, options);
  return convertResponse(connection);
}

HttpURLConnection convertAndSend(Request request, Options options) throws IOException {
  final HttpURLConnection connection = (HttpURLConnection) new URL(request.url()).openConnection();

  /** SNIP **/

  if (request.body() != null) {
    if (contentLength != null) {
      connection.setFixedLengthStreamingMode(contentLength);
    } else {
      connection.setChunkedStreamingMode(8196);
    }
    connection.setDoOutput(true);
    OutputStream out = connection.getOutputStream();
    if (gzipEncodedRequest) {
      out = new GZIPOutputStream(out);
    }
    try {
      out.write(request.body()); // PROBLEM
    } finally {
      try {
        out.close();
      } catch (IOException suppressed) {
      }
    }
  }
  return connection;
}

ラベルの付いた行PROBLEMは、私を混乱させるものです。

  1. オブジェクトには、request読み取るストリームの種類さえありませんbyte[] body。.
  2. 送信側では、本体全体が一度に書き込まれOutputStreamます。代わりにデータをチャンクするべきではありませんか?

例えば

// pseudocode
try {
  location = 0
  bufferSize = 2048
  buffer = request.body().read(location, bufferSize)
  while(out.readyToRead() && buffer.length > 0) {
    out.write(buffer)
    location += bufferSize
    buffer = request.body().read(location, bufferSize)
  }
}

リクエストに だけbyte[] bodyではなくストリームが含まれていた場合は、それをさらに改善して、データが利用可能になったときにデータを送信できます。

私は、このサービス アーキテクチャの分野に非常に慣れていません。私は何が欠けていますか?

4

1 に答える 1

6

Feign はコントロール プレーン API 用に設計されており、多くの場合、上向きにストリーミングしてもメリットがありません。ただし、下向きのストリーミングはサポートされています。

バッファリングがどのように機能するかに関して、より効率的であることに関心はありません (例: バイト配列の代替)。feign の設計のほとんどは、テンプレート フォーム (json または xml) を中心に展開し、これらを可能な限り再利用することを念頭に置いてください (たとえば、再送信時、バッファー + 固定長は簡単で予測可能です)。

「ストリーミング」の設計が http クライアントに結合されていれば、私は最も満足できると思います。IOTW は、トランスポートで意味のある方法でストリーミングに対処するサブタイプです。たとえば、通常の Java の場合は InputStream、OkHttp の場合は OkIo バッファ、Netty の場合は Netty バッファなどです。

スペンサーは調査のためにこれを開いたhttps://github.com/Netflix/feign/issues/220

于 2015-04-13T15:07:37.563 に答える