国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用 Vert.x 異步發(fā)送HTTP長(zhǎng)阻塞請(qǐng)求來(lái)提高并發(fā)響應(yīng)

這篇具有很好參考價(jià)值的文章主要介紹了使用 Vert.x 異步發(fā)送HTTP長(zhǎng)阻塞請(qǐng)求來(lái)提高并發(fā)響應(yīng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

假設(shè)我們開(kāi)發(fā)了一個(gè)必須與其他HTTP服務(wù)來(lái)交互的服務(wù)。不幸的是,這些HTTP服務(wù)速度慢且是阻塞的。

它可能是一個(gè)非常慢的遺留HTTP服務(wù)或我們必須使用的一些阻塞 API。無(wú)論如何,我們無(wú)法控制它。在這里,我們將調(diào)用兩個(gè)HTTP API。其中一個(gè)將阻塞2秒鐘,另一個(gè)將阻塞5秒鐘。

一旦兩個(gè)響應(yīng)都可用,我們還需要打印響應(yīng)狀態(tài)代碼。如果我們以老的、非異步反應(yīng)性方式執(zhí)行此操作,我們將阻塞調(diào)用線程5秒鐘。阻塞線程 5 秒效率不高,不是嗎?現(xiàn)在就叫你如何使用 Vert.x 異步發(fā)送HTTP長(zhǎng)阻塞請(qǐng)求來(lái)提高并發(fā)響應(yīng)!

服務(wù)

我使用“httpstat.us”作為網(wǎng)絡(luò)服務(wù)。這是一個(gè)簡(jiǎn)單的服務(wù),用于生成不同的HTTP代碼來(lái)測(cè)試Web客戶端??梢蕴峁╊~外的參數(shù),在本例中為 sleep ,在規(guī)定的時(shí)間內(nèi)阻塞 HTTP 請(qǐng)求。

我將使用“httpie”來(lái)測(cè)試這兩種服務(wù)。

服務(wù) 1 將阻塞5秒鐘,并返回狀態(tài)代碼為 200 的響應(yīng):

http://httpstat.us/200?sleep=5000
_____________________________________________

HTTP/1.1 200 OK
Content-Length: 6
Content-Type: text/plain
Date: Tue, 08 Mar 2022 17:05:08 GMT
Request-Context: appId=cid-v1:1e93d241-20e4-4513-bbd7-f452a16a5d69
Server: Kestrel
Set-Cookie: ARRAffinity=e2c17206c539113795daf64bd958d003f2b29b9f62da53617beea05468875ba5;Path=/;HttpOnly;Domain=httpstat.us

200 OK

服務(wù) 2 與前一個(gè)相同,只是它阻塞了2秒而不是5秒:

http://httpstat.us/200?sleep=2000
_____________________________________________

HTTP/1.1 200 OK
Content-Length: 6
Content-Type: text/plain
Date: Tue, 08 Mar 2022 17:11:53 GMT
Request-Context: appId=cid-v1:1e93d241-20e4-4513-bbd7-f452a16a5d69
Server: Kestrel
Set-Cookie: ARRAffinity=e2c17206c539113795daf64bd958d003f2b29b9f62da53617beea05468875ba5;Path=/;HttpOnly;Domain=httpstat.us

200 OK

Web 客戶端

我們已經(jīng)了解了服務(wù)。現(xiàn)在,讓我們討論 Web 客戶端?,F(xiàn)在,我將使用 Vert.x Web 客戶端。它是一個(gè)異步的,易于使用的 HTTPHTTP/2 客戶端.

  private static Future<Integer> service1(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=5000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 1: response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

  private static Future<Integer> service2(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=2000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 2 response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

這兩種方法非常相似。它們將 WebClient 作為參數(shù)并發(fā)送返回 Future<Integer> 的 HTTP 請(qǐng)求。其中整數(shù)是 HTTP 響應(yīng)代碼。返回的 Future<Integer> 向我們保證結(jié)果是異步的。狀態(tài)代碼在稍后可用時(shí)將給出回調(diào)。

我們需要組合兩個(gè)Future。使用 Vert.x的 CompositeFuture 可以實(shí)現(xiàn)多個(gè)future的協(xié)調(diào). 它支持并發(fā)組合(并行運(yùn)行多個(gè)異步操作)和順序組合(鏈?zhǔn)疆惒讲僮?.

    Future<Integer> service1Code = service1(webClient);
    Future<Integer> service2Code = service2(webClient);

    CompositeFuture.all(service1Code, service2Code)
        .onSuccess(ar -> {
          printResult(ar);

          countDownLatch.countDown();
        });

合在一起

最后,我們可以將所有的點(diǎn)點(diǎn)滴滴放在一起,如下所示:

import java.text.MessageFormat;
import java.util.concurrent.CountDownLatch;

import io.vertx.core.CompositeFuture;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.ext.web.client.WebClient;

public class Services {
  public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDownLatch = new CountDownLatch(1);

    // Vertx instance and web client
    Vertx     vertx     = Vertx.vertx();
    WebClient webClient = WebClient.create(vertx);

    Future<Integer> service1Code = service1(webClient);
    Future<Integer> service2Code = service2(webClient);

    CompositeFuture.all(service1Code, service2Code)
        .onSuccess(ar -> {
          printResult(ar);

          countDownLatch.countDown();
        });

    vertx.setPeriodic(1000, l -> System.out.println("[" + Thread.currentThread().getName() + "] is released"));

    countDownLatch.await();
    vertx.close();
  }

  private static Future<Integer> service1(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=5000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 1: response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

  private static Future<Integer> service2(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=2000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 2 response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

  private static void printResult(CompositeFuture compositeFuture) {
    System.out.println(Thread.currentThread().getName() + " Result: service1:" + compositeFuture.resultAt(0) + " service2:" + compositeFuture.resultAt(1)
    );
  }
}

下面是運(yùn)行代碼后打印在控制臺(tái)上的結(jié)果。這兩個(gè)請(qǐng)求都是從同一個(gè) vertx 事件循環(huán)線程調(diào)度的。該程序還會(huì)每秒打印線程未被阻止的消息。最后,它將打印兩個(gè)狀態(tài)代碼作為最終結(jié)果。如您所見(jiàn),一切都發(fā)生在同一個(gè)線程上:

[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] service 2 response received
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] service 1: response received
[vert.x-eventloop-thread-1] Result: service1:200 service2:200

總結(jié)

這就是我目前所要討論的全部?jī)?nèi)容。我希望這篇文章能幫助您現(xiàn)在對(duì)如何使用 Vert.x 異步發(fā)送長(zhǎng)阻塞請(qǐng)求有了更好的理解。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-438293.html

到了這里,關(guān)于使用 Vert.x 異步發(fā)送HTTP長(zhǎng)阻塞請(qǐng)求來(lái)提高并發(fā)響應(yīng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【注意】Kafka生產(chǎn)者異步發(fā)送消息仍有可能阻塞

    Kafka是常用的消息中間件。在Spring Boot項(xiàng)目中,使用KafkaTemplate作為生產(chǎn)者發(fā)送消息。有時(shí),為了不影響主業(yè)務(wù)流程,會(huì)采用 異步 發(fā)送的方式,如下所示。 本以為采用異步發(fā)送,必然不會(huì)影響到主業(yè)務(wù)流程。但實(shí)際使用時(shí)發(fā)現(xiàn),在第一次發(fā)送消息時(shí),如果Kafka Broker連接失敗,

    2023年04月13日
    瀏覽(26)
  • Axios基本使用,為學(xué)習(xí)后續(xù)的Vue服務(wù)【發(fā)送請(qǐng)求+并發(fā)請(qǐng)求+前端攔截器】

    目錄 1、項(xiàng)目中引入Axios 2、使用Axios發(fā)送請(qǐng)求 2.1、例:發(fā)送GET請(qǐng)求 2.2、例:發(fā)送POST請(qǐng)求 3、axios并發(fā)請(qǐng)求 4、攔截器 注:個(gè)人學(xué)習(xí)筆記,因自己學(xué)過(guò)后端,所以有關(guān)后端的代碼,我在這里就不展示了~ 不了解后端的寶子,也不會(huì)耽誤學(xué)習(xí),因?yàn)楣纠飼?huì)有寫(xiě)好的接口文檔,直

    2024年02月02日
    瀏覽(55)
  • AJAX 使用 JavaScript 的 `XMLHttpRequest` 對(duì)象來(lái)向服務(wù)器發(fā)送異步請(qǐng)求

    AJAX 使用 JavaScript 的 `XMLHttpRequest` 對(duì)象來(lái)向服務(wù)器發(fā)送異步請(qǐng)求

    AJAX 是一種使用異步 HTTP (Ajax) 請(qǐng)求獲取和發(fā)送數(shù)據(jù)的技術(shù)。它使得網(wǎng)頁(yè)能夠進(jìn)行異步更新,而不需要重新加載整個(gè)頁(yè)面。通過(guò)使用 AJAX,可以在不重新加載整個(gè)頁(yè)面的情況下,與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁(yè)內(nèi)容。 AJAX 使用 JavaScript 的 XMLHttpRequest 對(duì)象來(lái)向服務(wù)器發(fā)送異步請(qǐng)

    2024年01月16日
    瀏覽(27)
  • 并發(fā)測(cè)試工具 apache-jmeter使用發(fā)送post請(qǐng)求JSON數(shù)據(jù)

    并發(fā)測(cè)試工具 apache-jmeter使用發(fā)送post請(qǐng)求JSON數(shù)據(jù)

    目錄 1 下載安裝 2 漢化 3 創(chuàng)建高并發(fā)測(cè)試 配置線程組 創(chuàng)建web請(qǐng)求 創(chuàng)建監(jiān)聽(tīng)器 結(jié)果樹(shù) 匯總報(bào)告? 為web請(qǐng)求添加token 添加Content-Type用于發(fā)送json 4 啟動(dòng)測(cè)試 5 查看結(jié)果 官網(wǎng) Apache JMeter - Download Apache JMeter 解壓運(yùn)行 2 ? 打開(kāi)軟件設(shè)置中文 效果 補(bǔ)充知識(shí): 什么是Damp-up: Ramp-Up Perio

    2024年02月10日
    瀏覽(27)
  • NIFI使用InvokeHTTP發(fā)送http請(qǐng)求

    NIFI使用InvokeHTTP發(fā)送http請(qǐng)求

    這里介紹四種平時(shí)常用的http請(qǐng)求方法:GET、POST、PUT、DELETE。 在官方的介紹文檔中關(guān)于InvokeHTTP處理器的描述是這么說(shuō)的: An HTTP client processor which can interact with a configurable HTTP Endpoint. The destination URL and HTTP Method are configurable. FlowFile attributes are converted to HTTP headers and the FlowFile

    2024年02月09日
    瀏覽(28)
  • 使用Go發(fā)送HTTP POST請(qǐng)求

    使用Go發(fā)送HTTP POST請(qǐng)求

    在Go語(yǔ)言中,我們可以使用 net/http 包來(lái)發(fā)送HTTP POST請(qǐng)求。以下是一個(gè)簡(jiǎn)單的示例,展示了如何使用Go發(fā)送HTTP POST請(qǐng)求并獲取響應(yīng)。 go 復(fù)制代碼 package ?main import ?( \\\"bytes\\\" ? \\\"fmt\\\" ? \\\"io/ioutil\\\" ? \\\"net/http\\\" ? ) func ? main () ?{ // 創(chuàng)建一個(gè)HTTP客戶端 client := http.Client{} // 創(chuàng)建一個(gè)POST請(qǐng)求

    2024年01月23日
    瀏覽(28)
  • 使用Go發(fā)送HTTP GET請(qǐng)求

    使用Go發(fā)送HTTP GET請(qǐng)求

    在Go語(yǔ)言中,我們可以使用 net/http 包來(lái)發(fā)送HTTP GET請(qǐng)求。以下是一個(gè)簡(jiǎn)單的示例,展示了如何使用Go發(fā)送HTTP GET請(qǐng)求并獲取響應(yīng)。 go 復(fù)制代碼 package ?main import ?( \\\"fmt\\\" ? \\\"io/ioutil\\\" ? \\\"net/http\\\" ? ) func ? main () ?{ // 創(chuàng)建一個(gè)HTTP客戶端 client := http.Client{} // 創(chuàng)建一個(gè)GET請(qǐng)求 req, err :=

    2024年01月23日
    瀏覽(19)
  • C++使用HTTP庫(kù)和框架輕松發(fā)送HTTP請(qǐng)求

    C++使用HTTP庫(kù)和框架輕松發(fā)送HTTP請(qǐng)求

    使用C++編程發(fā)送HTTP請(qǐng)求通常需要使用第三方的HTTP庫(kù)或框架。在C++中,有幾個(gè)受歡迎的HTTP庫(kù)可供選擇,例如Curl、Boost.Beast和cpp-httplib。另外,也可以自己實(shí)現(xiàn)socket來(lái)發(fā)送http請(qǐng)求。 (1)安裝Curl庫(kù) 。 對(duì)于Debian/Ubuntu系統(tǒng): 對(duì)于RHEL/CentOS系統(tǒng): 對(duì)于macOS系統(tǒng): (2)編寫(xiě)Curl代碼

    2024年02月02日
    瀏覽(23)
  • 使用瀏覽器發(fā)送HTTP POST請(qǐng)求

    使用瀏覽器發(fā)送HTTP POST請(qǐng)求

    HTTP請(qǐng)求有如下幾個(gè)分類,其中最常見(jiàn)和常用的是GET和POST請(qǐng)求。? 一般來(lái)說(shuō),使用瀏覽器地址欄訪問(wèn)域名或ip時(shí)能且僅能向?yàn)g覽器服務(wù)端發(fā)送get請(qǐng)求,如果需要發(fā)送POST請(qǐng)求或其他類型http請(qǐng)求需要借助接口工具譬如postman。 如果某個(gè)web應(yīng)用部署環(huán)境下缺少接口調(diào)試工具,該如何

    2024年02月11日
    瀏覽(30)
  • requests 庫(kù)(發(fā)送 http 請(qǐng)求)基本使用指南

    requests 是一個(gè) Python 第三方庫(kù),用于發(fā)送 HTTP 請(qǐng)求。它提供了一種簡(jiǎn)單和方便的方法來(lái)與 Web 服務(wù)進(jìn)行交互,如獲取網(wǎng)頁(yè)內(nèi)容、發(fā)送數(shù)據(jù)、處理 Cookie 等。 requests 是 用 python 語(yǔ)言編寫(xiě)的,比 urllib2 模塊更簡(jiǎn)潔 requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會(huì)話,支持文

    2024年02月07日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包