第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

并發(fā)請求業(yè)務(wù)場景實現(xiàn)

并發(fā)請求業(yè)務(wù)場景實現(xiàn)

溫溫醬 2019-02-28 04:28:20
1.開發(fā)語言java,框架springboot等。2.業(yè)務(wù)場景:以電子卡激活為例,服務(wù)B接收到用戶A(也可能是第三方程序)提交的激活電子卡請求,這一筆訂單中需要激活n張卡(1<=n<=200),每次激活一張卡都需要向C發(fā)起一次HTTP請求,而且C每次激活都需要一定的時間(時間在幾十毫秒到幾秒間),而且B給A返回此次訂單中所有激活卡的信息(從C獲取到卡密或者激活失?。?;3.主要問題在從B到C之間的設(shè)計,如何并發(fā)的發(fā)送這n次請求,而且將返回的信息歸檔在同一個訂單號中返回給A,并且使用較少的時間。4.之前使用了akka,但是對akka不大熟悉,正在努力。
查看完整描述

5 回答

?
翻過高山走不出你

TA貢獻1875條經(jīng)驗 獲得超3個贊

上面的回答中的方式是使用同步的 HTTP 請求,這樣的好處是簡單不容易出錯,缺點肯定就是效率會偏低和占用不必要的 CPU 資源。

講下我的思路:

  1. 首先,A->B 這塊,既然使用的是 SpringBoot,了解下 SpringMVC 的異步模式(關(guān)鍵類:DefferedResult,WebAsyncTask

  2. B->C 這塊,既然 B->C 是發(fā)送 HTTP 請求,那么可以考慮異步的 HTTP 操作(可以簡單了解下 okhttp 或者 httpclient 中的異步操作)。使用一個線程專門發(fā)送異步 HTTP 請求,在異步 HTTP 的回調(diào)中,可以將請求的結(jié)果寫入到消息隊列(如果業(yè)務(wù)不復(fù)雜可以直接使用 BlockingQueue);另一個線程不停的(或者每隔一小段時間)從隊列中取出消息并進行消費:即根據(jù)訂單號將結(jié)果進行歸檔,通過某個訂單號對應(yīng)的已歸檔請求的個數(shù)來判斷是否將結(jié)果返回給 A。

  3. 至于線程的管理,如果將異步 HTTP 請求交給了 okhttp 或者 httpclient,那么之外涉及的線程不多,可能沒有必要使用 akka —— 可以考慮下 SpringMVC 內(nèi)置的線程池。

查看完整回答
反對 回復(fù) 2019-03-01
?
阿晨1998

TA貢獻2037條經(jīng)驗 獲得超6個贊

不能讓C提供一個批量激活的接口嗎?
當(dāng)然估計是不能,那我說下我的想法,其實業(yè)務(wù)場景不復(fù)雜,可以直接用線程處理,在所有線程處理完之前阻塞住主線程,大概代碼如下:

//n張卡
List<Card> cardList = new ArrayList<>();
//線程池處理請求
ExecutorService executorService = Executors.newFixedThreadPool(8);
final CountDownLatch cdl = new CountDownLatch(cardList.size());
final List<String> result = new ArrayList<>();
for (Object card : cardList) {
    executorService.execute(new Runnable() {
                
        @Override
        public void run() {
            //請求C并拿到響應(yīng)
            result.add(post(card));
            cdl.countDown();
        }
    });
}
cdl.await();
查看完整回答
反對 回復(fù) 2019-03-01
  • 5 回答
  • 0 關(guān)注
  • 513 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號