日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
隔離術(shù)之使用Hystrix實(shí)現(xiàn)隔離

1. Hystrix簡(jiǎn)介

在樺甸等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,樺甸網(wǎng)站建設(shè)費(fèi)用合理。

Hystrix是Netflix開源的一款針對(duì)分布式系統(tǒng)的延遲和容錯(cuò)庫,目的是用來隔離分布式服務(wù)故障。它提供線程和信號(hào)量隔離,以減少不同服務(wù)之間資源競(jìng)爭(zhēng)帶來的相互影響;提供優(yōu)雅降級(jí)機(jī)制;提供熔斷機(jī)制使得服務(wù)可以快速失敗,而不是一直阻塞等待服務(wù)響應(yīng),并能從中快速恢復(fù)。Hystrix通過這些機(jī)制來阻止級(jí)聯(lián)失敗并保證系統(tǒng)彈性、可用。下圖是一個(gè)典型的分布式服務(wù)實(shí)現(xiàn)。

首先,當(dāng)大多數(shù)人在使用Tomcat時(shí),多個(gè)HTTP服務(wù)會(huì)共享一個(gè)線程池,假設(shè)其中一個(gè)HTTP服務(wù)訪問的數(shù)據(jù)庫響應(yīng)非常慢,這將造成服務(wù)響應(yīng)時(shí)間延遲增加,大多數(shù)線程阻塞等待數(shù)據(jù)響應(yīng)返回,導(dǎo)致整個(gè)Tomcat線程池都被該服務(wù)占用,甚至拖垮整個(gè)Tomcat。因此,如果我們能把不同HTTP服務(wù)隔離到不同的線程池,則某個(gè)HTTP服務(wù)的線程池滿了也不會(huì)對(duì)其他服務(wù)造成災(zāi)難性故障。這就需要線程隔離或者信號(hào)量隔離來實(shí)現(xiàn)了。

使用線程隔離或信號(hào)隔離的目的是為不同的服務(wù)分配一定的資源,當(dāng)自己的資源用完,直接返回失敗而不是占用別人的資源。

同理,如“HTTP服務(wù)1”和“HTTP服務(wù)2”要分別訪問遠(yuǎn)程的“分布式服務(wù)A”和“分布式服務(wù)B”,假設(shè)它們共享線程池,那么其中一個(gè)服務(wù)在出現(xiàn)問題時(shí)也會(huì)影響到另一個(gè)服務(wù),因此,我們需要進(jìn)行訪問隔離,可以通過Hystrix的線程池隔離或信號(hào)量隔離來實(shí)現(xiàn)。

其次,“分布式服務(wù)B”依賴了“分布式服務(wù)D”和“分布式服務(wù)E”,其中“分布式服務(wù)D”是一個(gè)可降級(jí)的服務(wù),意思是出現(xiàn)故障時(shí)(如超時(shí)、網(wǎng)絡(luò)故障)可以暫時(shí)屏蔽掉或者返回緩存臟數(shù)據(jù),如訪問商品詳情頁時(shí),可以暫時(shí)屏蔽掉上邊的商家信息,不會(huì)影響用戶下單流程。

當(dāng)我們依賴的服務(wù)訪問超時(shí)時(shí),要提供降級(jí)策略。比如,返回托底數(shù)據(jù)阻止級(jí)聯(lián)故障。當(dāng)因?yàn)橐恍┕收?如網(wǎng)絡(luò)故障)使得服務(wù)可用率下降時(shí),要能及時(shí)熔斷,一是快速失敗,二是可以保護(hù)遠(yuǎn)程分布式服務(wù)。

到此我們大體了解了Hystrix是用來解決什么問題的。

  • 限制調(diào)用分布式服務(wù)的資源使用,某一個(gè)調(diào)用的服務(wù)出現(xiàn)問題不會(huì)影響其他服務(wù)調(diào)用,通過線程池隔離和信號(hào)量隔離實(shí)現(xiàn)。
  • Hystrix提供了優(yōu)雅降級(jí)機(jī)制:超時(shí)降級(jí)、資源不足時(shí)(線程或信號(hào)量)降級(jí),降級(jí)后可以配合降級(jí)接口返回托底數(shù)據(jù)。
  • Hystrix也提供了熔斷器實(shí)現(xiàn),當(dāng)失敗率達(dá)到閥值自動(dòng)觸發(fā)降級(jí)(如因網(wǎng)絡(luò)故障/超時(shí)造成的失敗率高),熔斷器觸發(fā)的快速失敗會(huì)進(jìn)行快速恢復(fù)。
  • 還提供了請(qǐng)求緩存、請(qǐng)求合并實(shí)現(xiàn)。

接下來,我們來看下如何使用Hystrix,本書使用的版本是Hystrix- 1.5.6。

2. 隔離示例

以線程池隔離為示例,會(huì)為不同的服務(wù)設(shè)置不同的線程池,從而實(shí)現(xiàn)相互隔離。

為不同的HTTP服務(wù)設(shè)置不同的線程池,為不同的分布式服務(wù)調(diào)用設(shè)置不同的線程池。

假設(shè)我們現(xiàn)在要調(diào)用一個(gè)獲取庫存服務(wù),通過封裝一個(gè)命令GetStockServiceCommand來實(shí)現(xiàn)。

 
 
 
 
  1. public class GetStockServiceCommand extends HystrixCommand { 
  2.     private StockService stockService; 
  3.     public GetStockServiceCommand() { 
  4.         super(setter()); 
  5.     } 
  6.     private static Setter setter() { 
  7.         //服務(wù)分組 
  8.         HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory. asKey("stock"); 
  9.         //服務(wù)標(biāo)識(shí) 
  10.         HystrixCommandKey commandKey =HystrixCommandKey.Factory. asKey("getStock"); 
  11.         //線程池名稱 
  12.         HystrixThreadPoolKey threadPoolKey = HystrixThreadPoolKey.Factory. asKey("stock-pool"); 
  13.         //線程池配置 
  14.         HystrixThreadPoolProperties.Setter threadPoolProperties =HystrixThreadPoolProperties.Setter threadPoolProperties =HystrixThreadPoolProperties.Setter() 
  15.                .withCoreSize(10) 
  16.                .withKeepAliveTimeMinutes(5) 
  17.                .withMaxQueueSize(Integer.MAX_VALUE) 
  18.                .withQueueSizeRejectionThreshold(10000); 
  19.   
  20.         //命令屬性配置 
  21.         HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter() 
  22.                .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD); 
  23.         return HystrixCommand.Setter 
  24.                         .withGroupKey(groupKey) 
  25.                        .andCommandKey(commandKey) 
  26.                        .andThreadPoolKey(threadPoolKey) 
  27.                        .andThreadPoolPropertiesDefaults(threadPoolProperties) 
  28.                         .andCommandPropertiesDefaults(commandProperties); 
  29.     } 
  30.    @Override 
  31.     protectedString run() throws Exception { 
  32.         return stockService.getStock(); 
  33.     } 

幾個(gè)重要組件如下。

  • HystrixCommandGroupKey:配置全局唯一標(biāo)識(shí)服務(wù)分組的名稱,比如,庫存系統(tǒng)就是一個(gè)服務(wù)分組。當(dāng)我們監(jiān)控時(shí),相同分組的服務(wù)會(huì)聚合在一起,必填選項(xiàng)。
  • HystrixCommandKey:配置全局唯一標(biāo)識(shí)服務(wù)的名稱,比如,庫存系統(tǒng)有一個(gè)獲取庫存服務(wù),那么就可以為這個(gè)服務(wù)起一個(gè)名字來唯一識(shí)別該服務(wù),如果不配置,則默認(rèn)是簡(jiǎn)單類名。
  • HystrixThreadPoolKey:配置全局唯一標(biāo)識(shí)線程池的名稱,相同線程池名稱的線程池是同一個(gè),如果不配置,則默認(rèn)是分組名,此名字也是線程池中線程名字的前綴。
  • HystrixThreadPoolProperties:配置線程池參數(shù),coreSize配置核心線程池大小和線程池***大小,keepAliveTimeMinutes是線程池中空閑線程生存時(shí)間(如果不進(jìn)行動(dòng)態(tài)配置,那么是沒有任何作用的),maxQueueSize配置線程池隊(duì)列***大小,queueSizeRejectionThreshold限定當(dāng)前隊(duì)列大小,即實(shí)際隊(duì)列大小由這個(gè)參數(shù)決定,通過改變queueSizeRejectionThreshold可以實(shí)現(xiàn)動(dòng)態(tài)隊(duì)列大小調(diào)整。
  • HystrixCommandProperties:配置該命令的一些參數(shù),如executionIsolationStrategy配置執(zhí)行隔離策略,默認(rèn)是使用線程隔離,此處我們配置為THREAD,即線程池隔離。

此處可以粗粒度實(shí)現(xiàn)隔離,也可以細(xì)粒度實(shí)現(xiàn)隔離,如下所示。

  • 服務(wù)分組+線程池:粗粒度實(shí)現(xiàn),一個(gè)服務(wù)分組/系統(tǒng)配置一個(gè)隔離線程池即可,不配置線程池名稱或者相同分組的線程池名稱配置為一樣。
  • 服務(wù)分組+服務(wù)+線程池:細(xì)粒度實(shí)現(xiàn),一個(gè)服務(wù)分組中的每一個(gè)服務(wù)配置一個(gè)隔離線程池,為不同的命令實(shí)現(xiàn)配置不同的線程池名稱即可。
  • 混合實(shí)現(xiàn):一個(gè)服務(wù)分組配置一個(gè)隔離線程池,然后對(duì)重要服務(wù)單獨(dú)設(shè)置隔離線程池。

如上配置是在應(yīng)用啟動(dòng)時(shí)就配置好了,在實(shí)際運(yùn)行過程中,我們可能隨時(shí)調(diào)整其中一些參數(shù),如線程池大小、隊(duì)列大小,此時(shí),可以使用如下方式進(jìn)行動(dòng)態(tài)配置。

 
 
 
 
  1. String dynamicQueueSizeRejectionThreshold = "hystrix.threadpool."+ "stock-pool" + ".queueSizeRejectionThreshold"; 
  2. Configuration configuration = ConfigurationManager.getConfigInstance(); 
  3. configuration.setProperty(dynamicQueueSizeRejectionThreshold,100); 

如果是改變線程池配置,則是"hystrix.threadpool."+ threadPoolKey + propertyName;如果是改變命令屬性配置,則是"hystrix.command." + commandKey + propertyName。

接下來就可以通過如下方式創(chuàng)建命令。

 
 
 
 
  1. GetStockServiceCommand command = new GetStockServiceCommand(newStockService()); 

然后通過如下方式同步調(diào)用。

 
 
 
 
  1. String result = command.execute(); 

或者返回Future從而實(shí)現(xiàn)異步調(diào)用。

 
 
 
 
  1. Future future = command.queue(); 

或者配合RxJava實(shí)現(xiàn)響應(yīng)式編程。

 
 
 
 
  1. Observable observe =command.observe(); 
  2. observe.asObservable().subscribe((result) -> { 
  3.     System.out.println(result); 
  4. }); 

在應(yīng)用Hystrix時(shí),首先需要把服務(wù)封裝成HystrixCommand,即命令模式實(shí)現(xiàn),然后就可以通過同步/異步/響應(yīng)式模式來調(diào)用服務(wù)。

信號(hào)量隔離通過如下配置即可。

 
 
 
 
  1. HystrixCommandProperties.Setter commandProperties= HystrixCommandProperties.Setter()          .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE) 
  2.        .withExecutionIsolationSemaphoreMaxConcurrentRequests(50); 

信號(hào)量隔離只是限制了總的并發(fā)數(shù),服務(wù)使用主線程進(jìn)行同步調(diào)用,即沒有線程池。因此,如果只是想限制某個(gè)服務(wù)的總并發(fā)調(diào)用量或者調(diào)用的服務(wù)不涉及遠(yuǎn)程調(diào)用的話,可以使用輕量級(jí)的信號(hào)量來實(shí)現(xiàn)。

GetStockServiceCommand不是單例,不能重用,必須每次使用創(chuàng)建一個(gè)。如果覺得Hystrix太麻煩或者太重,則可以參考Hystrix思路設(shè)計(jì)自己的組件。

【本文是專欄作者張開濤的原創(chuàng)文章,作者微信公眾號(hào):開濤的博客( kaitao-1234567)】

戳這里,看該作者更多好文


網(wǎng)站標(biāo)題:隔離術(shù)之使用Hystrix實(shí)現(xiàn)隔離
鏈接URL:http://www.dlmjj.cn/article/dphgcoo.html