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

首頁(yè) 慕課教程 Spring Cloud Hystrix Spring Cloud Hystrix 實(shí)際業(yè)務(wù)場(chǎng)景下 Hystrix 資源隔離實(shí)戰(zhàn)

實(shí)際業(yè)務(wù)場(chǎng)景下 Hystrix 資源隔離實(shí)戰(zhàn)

1. 前言

我們知道,服務(wù)資源隔離分為兩種實(shí)現(xiàn)方式,分別是基于線程池隔離的服務(wù)資源隔離、基于信號(hào)量隔離的服務(wù)資源隔離。在本節(jié)中,我將繼續(xù)為大家介紹,在真實(shí)業(yè)務(wù)場(chǎng)景下的,服務(wù)資源隔離的應(yīng)用方法及代碼實(shí)現(xiàn)。

本節(jié)主要內(nèi)容:

  • 服務(wù)資源隔離真實(shí)業(yè)務(wù)場(chǎng)景描述;

  • 業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)思路分析與實(shí)操。

2. 服務(wù)資源隔離真實(shí)業(yè)務(wù)場(chǎng)景描述

業(yè)務(wù)場(chǎng)景描述

有這樣一個(gè)真實(shí)的業(yè)務(wù)場(chǎng)景:在某大廠的訂單與支付模塊,當(dāng)有用戶下了訂單之后,需要在支付模塊進(jìn)行支付,支付動(dòng)作完成之后,支付模塊會(huì)將支付完成的結(jié)果返回給訂單模塊來(lái)通知用戶,該訂單是否支付成功,即商品是否已經(jīng)成功購(gòu)買了。

在微服務(wù)分布式架構(gòu)模式下,上述業(yè)務(wù)場(chǎng)景中出現(xiàn)了一種異常現(xiàn)象:當(dāng)用戶下了訂單之后,在支付模塊進(jìn)行支付時(shí),系統(tǒng)一直沒(méi)有響應(yīng),無(wú)論是否成功支付,用戶都收不到任何通知信息。

程序員在排查對(duì)應(yīng)的業(yè)務(wù)實(shí)現(xiàn)代碼時(shí),證實(shí)了業(yè)務(wù)實(shí)現(xiàn)代碼沒(méi)有問(wèn)題,這就導(dǎo)致無(wú)法定位問(wèn)題所在。最終經(jīng)過(guò)幾名同事一起排查,發(fā)現(xiàn)是訂單模塊與支付模塊之間進(jìn)行數(shù)據(jù)傳輸時(shí),支付模塊收到了訂單模塊傳遞過(guò)來(lái)的數(shù)據(jù),但是由于服務(wù)器高壓工作,導(dǎo)致支付模塊始終無(wú)法處理該支付請(qǐng)求,這就導(dǎo)致系統(tǒng)一直沒(méi)有響應(yīng)。

問(wèn)題原因分析

在解決問(wèn)題之前,我們首先來(lái)分析一下這種問(wèn)題產(chǎn)生的原因。

在前面我們介紹什么是 Hystrix 資源隔離小節(jié)中,我為大家闡述了在我們的 Web 項(xiàng)目中,進(jìn)程與線程之間的關(guān)系。我們知道,在一般情況下,一個(gè) Web 項(xiàng)目中只有一個(gè)工作線程來(lái)負(fù)責(zé)處理用戶調(diào)用的請(qǐng)求和服務(wù),當(dāng)該工作線程所負(fù)責(zé)的請(qǐng)求處理緩慢時(shí),該線程就會(huì)一直處理當(dāng)前的請(qǐng)求,導(dǎo)致后續(xù)請(qǐng)求只能等待處理,這就是我們說(shuō)的雪崩現(xiàn)象。

雪崩效應(yīng)產(chǎn)生原理

在微服務(wù)分布式架構(gòu)模式下,由于我們沒(méi)有對(duì)線程進(jìn)行處理,至此在處理所有業(yè)務(wù)請(qǐng)求時(shí),扔是只有一個(gè)工作線程,這就導(dǎo)致上述業(yè)務(wù)場(chǎng)出現(xiàn)了我們所說(shuō)的雪崩現(xiàn)象,不過(guò)還好,這種雪崩現(xiàn)象比較輕微,只影響到了一個(gè)業(yè)務(wù)模塊。

很多時(shí)候,當(dāng)我們的項(xiàng)目架構(gòu)演變?yōu)榛谖⒎?wù)的分布式架構(gòu)時(shí),服務(wù)器也需要同步進(jìn)行更新,有很多企業(yè)為了節(jié)約成本,則只更新很少數(shù)量的服務(wù)器,或者壓根就不更新服務(wù)器,這就導(dǎo)致經(jīng)常會(huì)出現(xiàn)由于服務(wù)器高壓工作而出現(xiàn)的請(qǐng)求處理緩慢,或請(qǐng)求無(wú)法繼續(xù)處理的情況。

3. 業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)思路分析與實(shí)操

實(shí)現(xiàn)思路分析

鑒于上述業(yè)務(wù)場(chǎng)景中所描述的問(wèn)題,我們只要為每個(gè)業(yè)務(wù)模塊分配不同的工作線程,使各模塊間不再一同共用一個(gè)工作線程,就可以有效解決上述問(wèn)題。

當(dāng)我們通過(guò)技術(shù)手段為每一個(gè)業(yè)務(wù)模塊都分配了不同的工作線程之后,各模塊的業(yè)務(wù)處理操作都會(huì)有專門的工作線程來(lái)完成,不會(huì)再出現(xiàn)各模塊共用一個(gè)工作線程的情況。如果一個(gè)模塊中的請(qǐng)求處理出現(xiàn)問(wèn)題而等待,由于我們分配了不同的工作線程,所以這種情況不會(huì)影響到其他模塊,這就解決了上述業(yè)務(wù)場(chǎng)景中出現(xiàn)的問(wèn)題。

Hystrix 提供了通過(guò)線程池或信號(hào)量隔離的方式來(lái)對(duì)服務(wù)資源進(jìn)行隔離,以解決雪崩現(xiàn)象的發(fā)生,接下來(lái)讓我們分別來(lái)看一下代碼實(shí)現(xiàn)。

實(shí)操

以線程池隔離為例,我們先給訂單服務(wù)配置資源隔離:

@RequestMapping("make_order.do")
@ResponseBody
@HystrixCommand(threadPoolKey = "userMakeOrderThread")
public CommonResponse<String> makeOrder(@RequestBody("order")Order order, @RequestBody("user")User user){
    return orderService.makeOrder(order, user);
}

代碼解釋

第 3 行,我們用戶下訂單服務(wù)中通過(guò)添加 HystrixCommand 注解的 threadPoolKey 屬性來(lái)為用戶下訂單服務(wù)單獨(dú)分配了一個(gè)名為 userMakeOrderThread 的線程池,當(dāng)我們?cè)儆杏脩粝掠唵蔚恼?qǐng)求需要處理時(shí),就會(huì)使用這個(gè)線程池中的線程。

同樣的方法,我們?yōu)橛脩糁Ц斗?wù)配置資源隔離:

@RequestMapping("aliPay.do")
@ResponseBody
@HystrixCommand(threadPoolKey = "userAliPayThread")
public CommonResponse<String> aliPay(@RequestBody("shipping")Shipping shipping, @RequestBody("user")User user){
    return payService.aliPay(shipping, user);
}
    

可以看到,我們?yōu)橹Ц赌K分配了一個(gè)名為 userAliPayThread 的線程池。

基于信號(hào)量隔離的服務(wù)隔離的配置,和上述基于線程池隔離的配置大同小異,下面我將關(guān)鍵代碼放到下方,各位同學(xué)只需要替換掉上述的線程池配置即可。

以用戶下訂單服務(wù)為例:

@HystrixCommand(fallbackMethod="makeOrderFailed", commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value = "50")
})

代碼解釋

第 3- 8 行,使用信號(hào)量隔離需要顯式聲明服務(wù)資源隔離策略,SEMAPHORE 表示使用信號(hào)量隔離策略。

Tips:
1. 在實(shí)際項(xiàng)目開(kāi)發(fā)中,像這種訂單服務(wù)和支付服務(wù)互相依賴的業(yè)務(wù)場(chǎng)景不在少數(shù),各位同學(xué)在工作時(shí),一定要在這種業(yè)務(wù)場(chǎng)景中配置好服務(wù)資源隔離,不要等在線上出現(xiàn)問(wèn)題之后再解決,那就晚了;
2. 線程池隔離和信號(hào)量隔離之間的區(qū)別有很多,這里就不做介紹了,希望各位同學(xué)可以自行查閱,他們之間的區(qū)別可以幫助你確定不同業(yè)務(wù)場(chǎng)景下采用哪種隔離方式比較合適。

4. 小結(jié)

本節(jié)內(nèi)容概覽

本小節(jié)以一個(gè)真實(shí)業(yè)務(wù)場(chǎng)景下的不同業(yè)務(wù)模塊間協(xié)作服務(wù)為背景,為大家介紹了如何在真實(shí)業(yè)務(wù)場(chǎng)景下配置 Hystrix 的服務(wù)資源隔離,并且做了代碼實(shí)操,針對(duì)容易出現(xiàn)問(wèn)題的地方,也做了注意事項(xiàng)的補(bǔ)充,希望同學(xué)們可以對(duì)真實(shí)業(yè)務(wù)場(chǎng)景下,服務(wù)資源隔離的應(yīng)用方法有所了解。