Java和Clojure開源的 HTTP 客戶端

jopen 8年前發布 | 15K 次閱讀 HTTP

  • JDK’s URLConnection uses traditional thread-blocking I/O.
  • Apache HTTP Client uses traditional thread-blocking I/O with thread-pools.
  • Apache Async HTTP Client uses NIO.
  • Jersey is a ReST client/server framework; the client API can use several HTTP client backends including URLConnection and Apache HTTP Client.
  • OkHttp uses traditional thread-blocking I/O with thread-pools.
  • Retrofit turns your HTTP API into a Java interface and can use several HTTP client backends including Apache HTTP Client.
  • Grizzly is network framework with low-level HTTP support; it was using NIO but it switched to AIO .
  • Netty is a network framework with HTTP support (low-level), multi-transport, includes NIO and native (the latter uses epoll on Linux).
  • Jetty Async HTTP Client uses NIO.
  • Async HTTP Client wraps either Netty, Grizzly or JDK’s HTTP support.
  • clj-http wraps the Apache HTTP Client.
  • http-kit is an async subset of clj-http implemented partially in Java directly on top of NIO.
  • http async client wraps the Async HTTP Client for Java.

以下是負載測試的結果:

        <td class="tg-ltqa">
            -
        </td>
        <td class="tg-yjsh">
            <span class="caps"><span class="caps">OOM</span></span> - thread
        </td>
        <td class="tg-yjsh">
            <span class="caps"><span class="caps">OOM</span></span> - thread
        </td>
        <td class="tg-yjsh">
            <span class="caps"><span class="caps">OOM</span></span> - thread
        </td>
        <td class="tg-yjsh">
            <span class="caps"><span class="caps">OOM</span></span> - thread
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Time (s)
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">8.8</span></span> 
        </td>
        <td class="tg-ltqa">
            <span class="caps"><span class="caps">8.8</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">16.6</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">16.7</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">16.5</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">20.2</span></span> 
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Heap max (MiB)
        </td>
        <td class="tg-yjsh" rowspan="3">
            N/A
        </td>
        <td class="tg-ltqa">
            702
        </td>
        <td class="tg-yjsh" rowspan="3">
            N/A
        </td>
        <td class="tg-yjsh" rowspan="3">
            N/A
        </td>
        <td class="tg-yjsh" rowspan="3">
            N/A
        </td>
        <td class="tg-yjsh" rowspan="3">
            N/A
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Heap avg (MiB)
        </td>
        <td class="tg-ltqa">
            246
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Threads max
        </td>
        <td class="tg-ltqa">
            16
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb" rowspan="5">
            Throughput with target rate 1k (response after 1s)
        </td>
        <td class="tg-dk5w">
            Time max (ms)
        </td>
        <td class="tg-s6z2">
            7139
        </td>
        <td class="tg-ltqa">
            1138
        </td>
        <td class="tg-s6z2">
            10209
        </td>
        <td class="tg-s6z2">
            1301
        </td>
        <td class="tg-s6z2">
            6341
        </td>
        <td class="tg-s6z2">
            4370
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Time avg (ms)
        </td>
        <td class="tg-s6z2">
            2359
        </td>
        <td class="tg-ltqa">
            1002
        </td>
        <td class="tg-s6z2">
            3031
        </td>
        <td class="tg-s6z2">
            1008
        </td>
        <td class="tg-s6z2">
            1902
        </td>
        <td class="tg-s6z2">
            1477
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Heap max (MiB)
        </td>
        <td class="tg-s6z2">
            227
        </td>
        <td class="tg-ltqa">
            110
        </td>
        <td class="tg-s6z2">
            125
        </td>
        <td class="tg-s6z2">
            119
        </td>
        <td class="tg-s6z2">
            330
        </td>
        <td class="tg-s6z2">
            342
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Heap avg (MiB)
        </td>
        <td class="tg-s6z2">
            61
        </td>
        <td class="tg-ltqa">
            <span class="caps"><span class="caps">29.8</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">34.9</span></span> 
        </td>
        <td class="tg-s6z2">
            30
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">76.8</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">73.7</span></span> 
        </td>
    </tr>
    <tr>
        <td class="tg-dk5w">
            Threads max
        </td>
        <td class="tg-s6z2">
            4000+
        </td>
        <td class="tg-ltqa">
            15
        </td>
        <td class="tg-s6z2">
            4000+
        </td>
        <td class="tg-s6z2">
            1900+
        </td>
        <td class="tg-s6z2">
            4300+
        </td>
        <td class="tg-s6z2">
            2600+
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            Throughput with target rate 10k (response after 100ms)
        </td>
        <td class="tg-dk5w">
            Time max (ms)
        </td>
        <td class="tg-s6z2">
            4898
        </td>
        <td class="tg-ltqa">
            4085
        </td>
        <td class="tg-s6z2">
            7939
        </td>
        <td class="tg-s6z2">
            7079
        </td>
        <td class="tg-s6z2">
            45198
        </td>
        <td class="tg-s6z2">
            14512
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Time avg (ms)
        </td>
        <td class="tg-s6z2">
            2479
        </td>
        <td class="tg-s6z2">
            2717
        </td>
        <td class="tg-s6z2">
            3423
        </td>
        <td class="tg-ltqa">
            2125
        </td>
        <td class="tg-s6z2">
            25885
        </td>
        <td class="tg-s6z2">
            7594
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Heap max (MiB)
        </td>
        <td class="tg-s6z2">
            338
        </td>
        <td class="tg-s6z2">
            192
        </td>
        <td class="tg-s6z2">
            179
        </td>
        <td class="tg-ltqa">
            165
        </td>
        <td class="tg-s6z2">
            495
        </td>
        <td class="tg-s6z2">
            489
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Heap avg (MiB)
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">91.3</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">67.2</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">40.9</span></span> 
        </td>
        <td class="tg-ltqa">
            <span class="caps"><span class="caps">38.5</span></span> 
        </td>
        <td class="tg-s6z2">
            147
        </td>
        <td class="tg-s6z2">
            155
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Threads max
        </td>
        <td class="tg-s6z2">
            7500+
        </td>
        <td class="tg-ltqa">
            16
        </td>
        <td class="tg-s6z2">
            4900+
        </td>
        <td class="tg-s6z2">
            3900+
        </td>
        <td class="tg-s6z2">
            11000+
        </td>
        <td class="tg-s6z2">
            6900+
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            Throughput with target rate 100k (immediate response)
        </td>
        <td class="tg-dk5w">
            Time max (ms)
        </td>
        <td class="tg-s6z2">
            6937
        </td>
        <td class="tg-s6z2">
            3590
        </td>
        <td class="tg-s6z2">
            4668
        </td>
        <td class="tg-ltqa">
            1793
        </td>
        <td class="tg-s6z2">
            9303
        </td>
        <td class="tg-s6z2">
            9840
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Time avg (ms)
        </td>
        <td class="tg-s6z2">
            1468
        </td>
        <td class="tg-s6z2">
            1821
        </td>
        <td class="tg-s6z2">
            1287
        </td>
        <td class="tg-ltqa">
            826
        </td>
        <td class="tg-s6z2">
            1659
        </td>
        <td class="tg-s6z2">
            3442
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Heap max (MiB)
        </td>
        <td class="tg-s6z2">
            226
        </td>
        <td class="tg-s6z2">
            188
        </td>
        <td class="tg-s6z2">
            130
        </td>
        <td class="tg-ltqa">
            113
        </td>
        <td class="tg-s6z2">
            354
        </td>
        <td class="tg-s6z2">
            398
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Heap avg (MiB)
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">62.2</span></span> 
        </td>
        <td class="tg-s6z2">
            66
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">36.1</span></span> 
        </td>
        <td class="tg-ltqa">
            <span class="caps"><span class="caps">33.2</span></span> 
        </td>
        <td class="tg-s6z2">
            <span class="caps"><span class="caps">79.5</span></span> 
        </td>
        <td class="tg-s6z2">
            122
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            <br />
        </td>
        <td class="tg-dk5w">
            Threads max
        </td>
        <td class="tg-s6z2">
            3500+
        </td>
        <td class="tg-ltqa">
            16
        </td>
        <td class="tg-s6z2">
            2600+
        </td>
        <td class="tg-s6z2">
            2000+
        </td>
        <td class="tg-s6z2">
            4000+
        </td>
        <td class="tg-s6z2">
            4000+
        </td>
    </tr>
    <tr>
        <td class="tg-qnmb">
            Notes
        </td>
        <td class="tg-dk5w">
            <br />
        </td>
        <td class="tg-s6z2">
            <br />
        </td>
        <td class="tg-s6z2">
            <br />
        </td>
        <td class="tg-s6z2">
            <br />
        </td>
        <td class="tg-s6z2">
            OkHttp doesn’t use <span class="caps"><span class="caps">NIO</span></span> but regular blocking I/O under the hood.
        </td>
        <td class="tg-s6z2">
            <br />
        </td>
        <td class="tg-s6z2">
            Jersey uses one thread per connection even in the async case
        </td>
    </tr>
</tbody>

</table> 詳見:https://dzone.com/articles/high-concurrency-http-clients-on-the-jvm

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
HTTP Client Load Test (colored is best) Regular (thread-blocking) Apache (4.4.1) Comsat (fiber-blocking) Apache (async 4.1) Regular (thread-blocking) OkHttp 2.4.0 Comsat (fiber-blocking) OkHttp 2.4.0 Regular (thread-blocking) Jersey 2.19 w/JDK connector Comsat (fiber-blocking) Jersey 2.19 w/JDK connector
AHC blocking (BIO) AHC async (NIO) + Quasar fibers OkHttp blocking (BIO) OkHttp async (BIO) + Quasar fibers Jersey blocking Jersey async + Quasar fibers
Long-lived concurrent 41k (maximum rate possible) Max 16715 41k 16358 16608 16713 16713
Error OOM - thread