Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
·þÎñÈÝ´íģʽ
 
À´Ô´£ºÃÀÍŵãÆÀ¼¼ÊõÍÅ¶Ó ·¢²¼ÓÚ£º2017-3-2
  5519  次浏览      28
 

±³¾°

Ëæ×ÅÃÀÍŵãÆÀ·þÎñ¿ò¼ÜºÍ·þÎñÖÎÀíÌåϵµÄÖð²½³ÉÊ죬·þÎñ»¯ÒѳÉΪ¹«Ë¾ÄÚ²¿ÏµÍ³Éè¼ÆµÄÇ÷ÊÆ¡£±¾×Å´óϵͳС×ö¡¢Ö°Ôðµ¥Ò»µÄÔ­Ôò£¬ÎÒÃǶȼټ¼ÊõÍŶӶÔÒµÎñϵͳ½øÐÐÁ˲»ÉÙ·þÎñ»¯²ð·Ö¹¤×÷¡£Ëæ×ÅÒµÎñ¸´ÔӶȵÄÔö¼Ó£¬ÒÀÀµµÄ·þÎñÒ²Öð²½Ôö¼Ó£¬³öÏÖÁ˲»ÉÙÓÉÓÚ·þÎñµ÷ÓóöÏÖÒì³£ÎÊÌâ¶øµ¼ÖµÄÖØ´óʹʣ¬È磺

1£©ÏµÍ³ÒÀÀµµÄij¸ö·þÎñ·¢ÉúÑÓ³Ù»òÕß¹ÊÕÏ£¬ÊýÃëÄÚµ¼ÖÂËùÓÐÓ¦ÓÃ×ÊÔ´£¨Ị̈߳¬¶ÓÁеȣ©±»ºÄ¾¡£¬Ôì³ÉËùνµÄÑ©±ÀЧӦ (Cascading Failure)£¬µ¼ÖÂÕû¸öϵͳ¾Ü¾ø¶ÔÍâÌṩ·þÎñ¡£

2£©ÏµÍ³ÔâÊܶñÒâÅÀ³æÏ®»÷£¬ÔÚ·Å´óЧӦÏÂûÓжÔÏÂÓÎÒÀÀµ·þÎñ×öºÃÏÞËÙ´¦Àí£¬×îÖÕµ¼ÖÂÏÂÓηþÎñ±ÀÀ£¡£

ÈÝ´íÊÇÒ»¸öºÜ´óµÄ»°Ì⣬ÊÜÆª·ùËùÏÞ£¬±¾ÎĽ«½éÉܽöÏÞ¶¨ÔÚ·þÎñµ÷Óü䳣ÓõÄһЩÈÝ´íģʽ¡£

Éè¼ÆÔ­Ôò

·þÎñÈÝ´íµÄÉè¼ÆÓиö»ù±¾Ô­Ôò£¬¾ÍÊÇ¡°Design for Failure¡±¡£ÎªÁ˱ÜÃâ³öÏÖ¡°Ç§ÀïÖ®µÌÀ£ÓÚÒÏѨ¡±ÕâÖÖÇé¿ö£¬ÔÚÉè¼ÆÉÏÐèÒª¿¼Âǵ½¸÷Öֱ߽糡¾°ºÍ¶ÔÓÚ·þÎñ¼äµ÷ÓóöÏÖµÄÒì³£»òÑÓ³ÙÇé¿ö£¬Í¬Ê±ÔÚÉè¼ÆºÍ±à³ÌʱҲҪ¿¼ÂÇÖܵ½¡£ÕâÒ»Çж¼ÊÇΪÁË´ïµ½ÒÔÏÂÄ¿±ê£º

1£©Ò»¸öÒÀÀµ·þÎñµÄ¹ÊÕϲ»»áÑÏÖØÆÆ»µÓû§µÄÌåÑé¡£

2£©ÏµÍ³ÄÜ×Ô¶¯»ò°ë×Ô¶¯´¦Àí¹ÊÕÏ£¬¾ß±¸×ÔÎÒ»Ö¸´ÄÜÁ¦¡£

»ùÓÚÕâ¸öÔ­ÔòºÍÄ¿±ê£¬ÑÜÉú³öÏÂÎĽ«Òª½éÉܵÄһЩģʽ£¬Äܹ»½â¾ö·Ö²¼Ê½·þÎñµ÷ÓÃÖеÄһЩÎÊÌ⣬Ìá¸ßϵͳÔÚ¹ÊÕÏ·¢ÉúʱµÄ´æ»îÄÜÁ¦¡£

һЩ¾­µäµÄÈÝ´íģʽ

Ëùνģʽ£¬Æäʵ¾ÍÊÇijÖÖ³¡¾°ÏÂÒ»ÀàÎÊÌâ¼°Æä½â¾ö·½°¸µÄ×ܽá¹éÄÉ£¬ÍùÍù¿ÉÒÔÖØÓá£Ä£Ê½¿ÉÒÔÖ¸µ¼ÎÒÃÇÍê³ÉÈÎÎñ£¬×÷³öºÏÀíµÄϵͳÉè¼Æ·½°¸£¬´ïµ½Ê°빦±¶µÄЧ¹û¡£¶øÔÚ·þÎñÈÝ´íÕâ¸ö·½Ïò£¬ÐÐÒµÄÚÒѾ­ÓÐÁ˲»ÉÙʵ¼ù×ܽá³öÀ´µÄ½â¾ö·½°¸¡£

³¬Ê±ÓëÖØÊÔ£¨Timeout and Retry£©

³¬Ê±Ä£Ê½£¬ÊÇÒ»ÖÖ×î³£¼ûµÄÈÝ´íģʽ£¬ÔÚÃÀÍŵãÆÀµÄ¹¤³Ìʵ¼ùÖдóÁ¿´æÔÚ¡£³£¼ûµÄÓÐÉèÖÃÍøÂçÁ¬½Ó³¬Ê±Ê±¼ä£¬Ò»´ÎRPCµÄÏìÓ¦³¬Ê±Ê±¼äµÈ¡£ÔÚ·Ö²¼Ê½·þÎñµ÷Óõij¡¾°ÖУ¬ËüÖ÷Òª½â¾öÁ˵±ÒÀÀµ·þÎñ³öÏÖ½¨Á¢ÍøÂçÁ¬½Ó»òÏìÓ¦ÑÓ³Ù£¬²»ÓÃÎÞÏ޵ȴýµÄÎÊÌ⣬µ÷Ó÷½¿ÉÒÔ¸ù¾ÝÊÂÏÈÉè¼ÆµÄ³¬Ê±Ê±¼äÖжϵ÷Ó㬼°Ê±ÊͷŹؼü×ÊÔ´£¬ÈçWebÈÝÆ÷µÄÁ¬½ÓÊý£¬Êý¾Ý¿âÁ¬½ÓÊýµÈ£¬±ÜÃâÕû¸öϵͳ×ÊÔ´ºÄ¾¡³öÏ־ܾø¶ÔÍâÌṩ·þÎñÕâÖÖÇé¿ö¡£

ÖØÊÔģʽ£¬Ò»°ãºÍ³¬Ê±Ä£Ê½½áºÏʹÓã¬ÊÊÓÃÓÚ¶ÔÓÚÏÂÓηþÎñµÄÊý¾ÝÇ¿ÒÀÀµµÄ³¡¾°£¨²»Ç¿ÒÀÀµµÄ³¡¾°²»½¨ÒéʹÓã¡£©£¬Í¨¹ýÖØÊÔÀ´±£Ö¤Êý¾ÝµÄ¿É¿¿ÐÔ»òÒ»ÖÂÐÔ£¬³£ÓÃÓÚÒòÍøÂç¶¶¶¯µÈµ¼Ö·þÎñµ÷ÓóöÏÖ³¬Ê±µÄ³¡¾°¡£Ó볬ʱʱ¼äÉèÖýáºÏʹÓúó£¬ÐèÒª¿¼ÂǽӿڵÄÏìӦʱ¼ä·Ö²¼Çé¿ö£¬³¬Ê±Ê±¼ä¿ÉÒÔÉèÖÃΪÒÀÀµ·þÎñ½Ó¿Ú99.5%ÏìӦʱ¼äµÄÖµ£¬ÖØÊÔ´ÎÊýÒ»°ã1-2´ÎΪÒË£¬·ñÔò»áµ¼ÖÂÇëÇóÏìӦʱ¼äÑÓ³¤£¬ÍÏÀÛµ½Õû¸öϵͳ¡£

һЩʵÏÖ˵Ã÷£º

public class RetryCommand<T> {
private int maxRetries = 2;// ÖØÊÔ´ÎÊý ĬÈÏ2´Î
private long retryInterval = 5;//ÖØÊÔ¼ä¸ôʱ¼äms ĬÈÏ5ms
private Map<String, Object> params;

public RetryCommand() {

}

public RetryCommand(long retryInterval, int maxRetries) {
this.retryInterval = retryInterval;
this.maxRetries = maxRetries;
}

public T command(Map<String, Object> params){
//Some remote service call with timeout
serviceA.doSomethingWithTimeOut(timeout);
}

private final T retry() throws RuntimeException {
int retryCounter = 0;
while (retryCounter < maxRetries) {
try {
return command(params);
} catch (Exception e) {
retryCounter++;
if (retryCounter >= maxRetries) {
break;
}
}
}
throw new RuntimeException("Command failed on all of " + maxRetries + " retries");
}

//Ê¡ÂÔ
}

ÏÞÁ÷(Rate Limiting/Load Shedder)

ÏÞÁ÷ģʽ£¬³£ÓÃÓÚÏÂÓηþÎñÈÝÁ¿ÓÐÏÞ£¬µ«ÓÖųöÏÖÍ»·¢Á÷Á¿ÃÍÔö£¨Èç¶ñÒâÅÀ³æ£¬½Ú¼ÙÈÕ´ó´ÙµÈ£©¶øµ¼ÖÂÏÂÓηþÎñÒòѹÁ¦¹ý´ó¶ø¾Ü¾ø·þÎñµÄ³¡¾°¡£³£¼ûµÄÏÞÁ÷ģʽÓпØÖƲ¢·¢ºÍ¿ØÖÆËÙÂÊ£¬Ò»¸öÊÇÏÞÖÆ²¢·¢µÄÊýÁ¿£¬Ò»¸öÊÇÏÞÖÆ²¢·¢·ÃÎʵÄËÙÂÊ¡£

¿ØÖƲ¢·¢

ÊôÓÚÒ»Öֽϳ£¼ûµÄÏÞÁ÷ÊֶΣ¬ÔÚ¹¤³Ìʵ¼ùÖпÉÒÔͨ¹ýÐźÅÁ¿»úÖÆ£¨ÈçJavaÖеÄSemaphore£©À´¿ØÖÆ£¬¾Ù¸öÀý×Ó£º

¼ÙÈçÓÐÒ»¸öÐèÇó£¬Òª¶ÁÈ¡¼¸Íò¸öÎļþµÄÊý¾Ý£¬ÒòΪ¶¼ÊÇIOÃܼ¯ÐÍÈÎÎñ£¬ÎÒÃÇ¿ÉÒÔÆô¶¯¼¸Ê®¸öÏ̲߳¢·¢µÄ¶ÁÈ¡£¬µ«ÊÇÈç¹û¶Áµ½ÄÚ´æºó£¬»¹ÐèÒª´æ´¢µ½Êý¾Ý¿âÖУ¬¶øÊý¾Ý¿âµÄÁ¬½ÓÊýÖ»ÓÐ10¸ö£¬ÕâʱÎÒÃDZØÐë¿ØÖÆÖ»ÓÐÊ®¸öÏß³Ìͬʱ»ñÈ¡Êý¾Ý¿âÁ¬½Ó±£´æÊý¾Ý£¬·ñÔò»á±¨´íÎÞ·¨»ñÈ¡Êý¾Ý¿âÁ¬½Ó¡£Õâ¸öʱºò£¬ÎÒÃǾͿÉÒÔʹÓÃSemaphoreÀ´¿ØÖƲ¢·¢Êý£¬È磺

public class SemaphoreTest {

private static final int THREAD_COUNT = 30;

private static ExecutorService threadPool = Executors
.newFixedThreadPool(THREAD_COUNT);

private static Semaphore s = new Semaphore(10);

public static void main(String[] args) {
for (int i = 0; i < THREAD_COUNT; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
s.acquire();
System.out.println("save data");
s.release();
} catch (InterruptedException e) {
e.printStack();
}
}
});
}

threadPool.shutdown();
}
}

ÔÚ´úÂëÖУ¬ËäÈ»ÓÐ30¸öÏß³ÌÔÚÖ´ÐУ¬µ«ÊÇÖ»ÔÊÐí10¸ö²¢·¢µÄÖ´ÐС£SemaphoreµÄ¹¹Ôì·½·¨Semaphore(int permits) ½ÓÊÜÒ»¸öÕûÐ͵ÄÊý×Ö£¬±íʾ¿ÉÓõÄÐí¿ÉÖ¤ÊýÁ¿¡£Semaphore(10)±íʾÔÊÐí10¸öÏ̻߳ñÈ¡Ðí¿ÉÖ¤£¬Ò²¾ÍÊÇ×î´ó²¢·¢ÊýÊÇ10¡£SemaphoreµÄÓ÷¨Ò²ºÜ¼òµ¥£¬Ê×ÏÈÏß³ÌʹÓÃSemaphoreµÄacquire()»ñȡһ¸öÐí¿ÉÖ¤£¬Ê¹ÓÃÍêÖ®ºóµ÷ÓÃrelease()¹é»¹Ðí¿ÉÖ¤£¬»¹¿ÉÒÔÓÃtryAcquire()·½·¨³¢ÊÔ»ñÈ¡Ðí¿ÉÖ¤¡£

¿ØÖÆËÙÂÊ

ÔÚÎÒÃǵŤ³Ìʵ¼ùÖУ¬³£¼ûµÄÊÇʹÓÃÁîÅÆÍ°Ëã·¨À´ÊµÏÖÕâÖÖģʽ£¬ÆäËûÈç©ͰËã·¨Ò²¿ÉÒÔʵÏÖ¿ØÖÆËÙÂÊ£¬µ«ÔÚÎÒÃǵŤ³Ìʵ¼ùÖÐʹÓò»¶à£¬ÕâÀï²»×ö½éÉÜ£¬¶ÁÕßÇë×ÔÐÐÁ˽⡣

ÁîÅÆÍ°Ëã·¨

ÔÚWikipediaÉÏ£¬ÁîÅÆÍ°Ëã·¨ÊÇÕâôÃèÊöµÄ£º

ÿÃë»áÓÐr¸öÁîÅÆ·ÅÈëͰÖУ¬»òÕß˵£¬Ã¿¹ý1/rÃëͰÖÐÔö¼ÓÒ»¸öÁîÅÆ¡£

ͰÖÐ×î¶à´æ·Åb¸öÁîÅÆ£¬Èç¹ûͰÂúÁË£¬Ð·ÅÈëµÄÁîÅÆ»á±»¶ªÆú¡£

µ±Ò»¸ön×Ö½ÚµÄÊý¾Ý°üµ½´ïʱ£¬ÏûºÄn¸öÁîÅÆ£¬È»ºó·¢Ë͸ÃÊý¾Ý°ü¡£

Èç¹ûͰÖпÉÓÃÁîÅÆÐ¡ÓÚn£¬Ôò¸ÃÊý¾Ý°ü½«±»»º´æ»ò¶ªÆú¡£

ÁîÅÆÍ°¿ØÖƵÄÊÇÒ»¸öʱ¼ä´°¿ÚÄÚͨ¹ýµÄÊý¾ÝÁ¿£¬ÔÚAPI²ãÃæÎÒÃdz£ËµµÄQPS¡¢TPS£¬ÕýºÃÊÇÒ»¸öʱ¼ä´°¿ÚÄÚµÄÇëÇóÁ¿»òÕßÊÂÎñÁ¿£¬Ö»²»¹ýʱ¼ä´°¿ÚÏÞ¶¨ÔÚ1s°ÕÁË¡£ÒÔÒ»¸öºã¶¨µÄËÙ¶ÈÍùͰÀï·ÅÈëÁîÅÆ£¬¶øÈç¹ûÇëÇóÐèÒª±»´¦Àí£¬ÔòÐèÒªÏÈ´ÓͰÀï»ñȡһ¸öÁîÅÆ£¬µ±Í°ÀïûÓÐÁîÅÆ¿Éȡʱ£¬Ôò¾Ü¾ø·þÎñ¡£ÁîÅÆÍ°µÄÁíÍâÒ»¸öºÃ´¦ÊÇ¿ÉÒÔ·½±ãµÄ¸Ä±äËÙ¶È£¬Ò»µ©ÐèÒªÌá¸ßËÙÂÊ£¬Ôò°´ÐèÌá¸ß·ÅÈëͰÖеÄÁîÅÆµÄËÙÂÊ¡£

ÔÚÎÒÃǵŤ³Ìʵ¼ùÖУ¬Í¨³£Ê¹ÓÃGuavaÖеÄRatelimiterÀ´ÊµÏÖ¿ØÖÆËÙÂÊ£¬ÈçÎÒÃDz»Ï£ÍûÿÃëµÄÈÎÎñÌá½»³¬¹ýÁ½¸ö£º

//ËÙÂÊÊÇÿÃëÁ½¸öÐí¿É
final RateLimiter rateLimiter = RateLimiter.create(2.0);

void submitTasks(List tasks, Executor executor) {
for (Runnable task : tasks) {
rateLimiter.acquire(); // Ò²ÐíÐèÒªµÈ´ý
executor.execute(task);
}
}

ÔÚÎÒÃǵŤ³Ìʵ¼ùÖУ¬Å¼¶û»áÓöµ½Ò»Ð©·þÎñÓÉÓÚÍøÂçÁ¬½Ó³¬Ê±£¬ÏµÍ³ÓÐÒì³£»òload¹ý¸ß³öÏÖÔÝʱ²»¿ÉÓõÈÇé¿ö£¬µ¼Ö¶ÔÕâЩ·þÎñµÄµ÷ÓÃʧ°Ü£¬¿ÉÄÜÐèÒªÒ»¶Îʱ¼ä²ÅÄÜÐÞ¸´£¬ÕâÖÖ¶ÔÇëÇóµÄ×èÈû¿ÉÄÜ»áÕ¼Óñ¦¹óµÄϵͳ×ÊÔ´£¬È磺Äڴ棬Ị̈߳¬Êý¾Ý¿âÁ¬½ÓµÈµÈ£¬×µÄÇé¿öÏ»ᵼÖÂÕâЩ×ÊÔ´±»ÏûºÄ´ù¾¡£¬Ê¹µÃϵͳÀï²»Ïà¹ØµÄ²¿·ÖËùʹÓõÄ×ÊÔ´Ò²ºÄ¾¡´Ó¶øÍÏÀÛÕû¸öϵͳ¡£ÔÚÕâÖÖÇé¿öÏ£¬µ÷ÓòÙ×÷Äܹ»Á¢¼´·µ»Ø´íÎó¶ø²»Êǵȴý³¬Ê±µÄ·¢Éú»òÕßÖØÊÔ¿ÉÄÜÊÇÒ»ÖÖ¸üºÃµÄÑ¡Ôñ£¬Ö»Óе±±»µ÷ÓõķþÎñÓпÉÄܳɹ¦Ê±ÎÒÃÇÔÙÈ¥³¢ÊÔ¡£

ÈÛ¶ÏÆ÷ģʽ¿ÉÒÔ·ÀÖ¹ÎÒÃǵÄϵͳ²»¶ÏµØ³¢ÊÔÖ´ÐпÉÄÜ»áʧ°ÜµÄµ÷Óã¬Ê¹µÃÎÒÃǵÄϵͳ¼ÌÐøÖ´Ðжø²»ÓõȴýÐÞÕý´íÎ󣬻òÕßÀË·ÑCPUʱ¼äÈ¥µÈµ½³¤Ê±¼äµÄ³¬Ê±²úÉú¡£ÈÛ¶ÏÆ÷ģʽҲ¿ÉÒÔʹÎÒÃÇϵͳÄܹ»¼ì²â´íÎóÊÇ·ñÒѾ­ÐÞÕý£¬Èç¹ûÒѾ­ÐÞÕý£¬ÏµÍ³»áÔٴγ¢ÊÔµ÷ÓòÙ×÷¡£ÏÂͼÊǸöʹÓÃÈÛ¶ÏÆ÷ģʽµÄµ÷ÓÃÁ÷³Ì£º

ÈÛ¶ÏÆ÷ģʽ

¿ÉÒÔ´ÓͼÖп´³ö£¬µ±³¬Ê±³öÏֵĴÎÊý´ïµ½Ò»¶¨Ìõ¼þºó£¬ÈÛ¶ÏÆ÷»á´¥·¢´ò¿ª×´Ì¬£¬¿Í»§¶ËµÄÏ´ε÷Óý«Ö±½Ó·µ»Ø£¬²»Óõȴý³¬Ê±²úÉú¡£

ÔÚÈÛ¶ÏÆ÷ÄÚ²¿£¬ÍùÍùÓÐÒÔϼ¸ÖÖ״̬£º

ÈÛ¶ÏÆ÷ģʽ

1£©±ÕºÏ£¨closed£©×´Ì¬£º¸Ã״̬ÏÂÄܹ»¶ÔÄ¿±ê·þÎñ»ò·½·¨½øÐÐÕý³£µÄµ÷Óá£ÈÛ¶ÏÆ÷Ààά»¤ÁËÒ»¸öʱ¼ä´°¿ÚÄÚµ÷ÓÃʧ°ÜµÄ´ÎÊý£¬Èç¹ûij´Îµ÷ÓÃʧ°Ü£¬Ôòʧ°Ü´ÎÊý¼Ó1¡£Èç¹û×î½üʧ°Ü´ÎÊý³¬¹ýÁËÔÚ¸ø¶¨µÄʱ¼ä´°¿ÚÄÚÔÊÐíʧ°ÜµÄãÐÖµ(¿ÉÒÔÊÇÊýÁ¿Ò²¿ÉÒÔÊDZÈÀý)£¬ÔòÈÛ¶ÏÆ÷ÀàÇл»µ½¶Ï¿ª(Open)״̬¡£´ËʱÈÛ¶ÏÆ÷ÉèÖÃÁËÒ»¸ö¼ÆÊ±Æ÷£¬µ±Ê±ÖÓ³¬¹ýÁ˸Ãʱ¼ä£¬ÔòÇл»µ½°ë¶Ï¿ª£¨Half-Open£©×´Ì¬£¬¸Ã˯Ãßʱ¼äµÄÉ趨ÊǸøÁËϵͳһ´Î»ú»áÀ´ÐÞÕýµ¼Öµ÷ÓÃʧ°ÜµÄ´íÎó¡£

2£©¶Ï¿ª(Open)״̬£ºÔÚ¸Ã״̬Ï£¬¶ÔÄ¿±ê·þÎñ»ò·½·¨µÄÇëÇó»áÁ¢¼´·µ»Ø´íÎóÏìÓ¦£¬Èç¹ûÉèÖÃÁËfallback·½·¨£¬Ôò»á½øÈëfallbackµÄÁ÷³Ì¡£

3£©°ë¶Ï¿ª£¨Half-Open£©×´Ì¬£ºÔÊÐí¶ÔÄ¿±ê·þÎñ»ò·½·¨µÄÒ»¶¨ÊýÁ¿µÄÇëÇó¿ÉÒÔÈ¥µ÷Ó÷þÎñ¡£Èç¹ûÕâЩÇëÇó¶Ô·þÎñµÄµ÷Óóɹ¦£¬ÄÇô¿ÉÒÔÈÏΪ֮ǰµ¼Öµ÷ÓÃʧ°ÜµÄ´íÎóÒѾ­ÐÞÕý£¬´ËʱÈÛ¶ÏÆ÷Çл»µ½±ÕºÏ״̬£¨²¢ÇÒ½«´íÎó¼ÆÊýÆ÷ÖØÖã©£»Èç¹ûÕâÒ»¶¨ÊýÁ¿µÄÇëÇóÓе÷ÓÃʧ°ÜµÄÇé¿ö£¬ÔòÈÏΪµ¼ÖÂ֮ǰµ÷ÓÃʧ°ÜµÄÎÊÌâÈÔÈ»´æÔÚ£¬ÈÛ¶ÏÆ÷Çлص½¶Ï¿ª·½Ê½£¬È»ºó¿ªÊ¼ÖØÖüÆÊ±Æ÷À´¸øÏµÍ³Ò»¶¨µÄʱ¼äÀ´ÐÞÕý´íÎó¡£°ë¶Ï¿ª×´Ì¬Äܹ»ÓÐЧ·ÀÖ¹ÕýÔÚ»Ö¸´ÖеķþÎñ±»Í»È»¶øÀ´µÄ´óÁ¿ÇëÇóÔÙ´ÎÍϿ塣

ÔÚÎÒÃǵŤ³Ìʵ¼ùÖУ¬ÈÛ¶ÏÆ÷ģʽÍùÍùÓ¦ÓÃÓÚ·þÎñµÄ×Ô¶¯½µ¼¶£¬ÔÚʵÏÖÉÏÖ÷Òª»ùÓÚNetflix¿ªÔ´µÄ×é¼þHystrixÀ´ÊµÏÖ£¬ÏÂͼºÍ´úÂë·Ö±ðÊÇHystrixÖÐÈÛ¶ÏÆ÷µÄÔ­ÀíºÍ¶¨Ò壬¸ü¶àÁ˽â¿ÉÒԲ鿴HystrixµÄÔ´Â룺

ģʽ×éºÏ

public interface HystrixCircuitBreaker {

/**
* Every {@link HystrixCommand} requests asks this if it is allowed to proceed or not.
* <p>
* This takes into account the half-open logic which allows some requests through when determining if it should be closed again.
*
* @return boolean whether a request should be permitted
*/
public boolean allowRequest();

/**
* Whether the circuit is currently open (tripped).
*
* @return boolean state of circuit breaker
*/
public boolean isOpen();

/**
* Invoked on successful executions from {@link HystrixCommand} as part of feedback mechanism when in a half-open state.
*/
public void markSuccess();
}

²Õ±Ú¸ôÀë(Bulkhead Isolation)

ÔÚÔì´¬ÐÐÒµ£¬ÍùÍùʹÓôËÀàģʽ¶Ô´¬²Õ½øÐиôÀ룬ÀûÓòձڽ«²»Í¬µÄ´¬²Õ¸ôÀëÆðÀ´£¬ÕâÑùÈç¹ûÒ»¸ö´¬²ÕÆÆÁ˽øË®£¬Ö»Ëðʧһ¸ö´¬²Õ£¬ÆäËü´¬²Õ¿ÉÒÔ²»ÊÜÓ°Ï죬¶ø½è¼øÔì´¬ÐÐÒµµÄ¾­Ñ飬ÕâÖÖģʽҲÔÚÈí¼þÐÐÒµµÃµ½Ê¹Óá£

Ï̸߳ôÀë(Thread Isolation)¾ÍÊÇÕâÖÖģʽµÄ³£¼ûµÄÒ»¸ö³¡¾°¡£ÀýÈ磬ϵͳAµ÷ÓÃÁËServiceB/ServiceC/ServiceDÈý¸öÔ¶³Ì·þÎñ£¬ÇÒ²¿ÊðAµÄÈÝÆ÷Ò»¹²ÓÐ120¸ö¹¤×÷Ị̈߳¬²ÉÓÃÏ̸߳ôÀë»úÖÆ£¬¿ÉÒÔ¸ø¶ÔServiceB/ServiceC/ServiceDµÄµ÷Óø÷·ÖÅä40¸öÏ̡߳£µ±ServiceBÂýÁË£¬¸øServiceB·ÖÅäµÄ40¸öÏß³ÌÒòÂý¶ø×èÈû²¢×îÖպľ¡£¬Ï̸߳ôÀë¿ÉÒÔ±£Ö¤¸øServiceC/ServiceD·ÖÅäµÄ80¸öÏ߳̿ÉÒÔ²»ÊÜÓ°Ïì¡£Èç¹ûûÓÐÕâÖÖ¸ôÀë»úÖÆ£¬µ±ServiceBÂýµÄʱºò£¬120¸ö¹¤×÷Ï̻߳áºÜ¿ìÈ«²¿±»¶ÔServiceBµÄµ÷ÓóԹ⣬Õû¸öϵͳ»áÈ«²¿ÂýÏÂÀ´£¬ÉõÖÁ³öÏÖϵͳֹͣÏìÓ¦µÄÇé¿ö¡£

ÕâÖÖCaseÔÚÎÒÃÇʵ¼ùÖо­³£Óöµ½£¬Èçij½Ó¿ÚÓÉÓÚÊý¾Ý¿âÂý²éѯ£¬ÍⲿRPCµ÷Óó¬Ê±µ¼ÖÂÕû¸öϵͳµÄÏß³ÌÊý¹ý¸ß£¬Á¬½ÓÊýºÄ¾¡µÈ¡£ÎÒÃÇ¿ÉÒÔʹÓòձڸôÀëģʽ£¬ÎªÕâÖÖÒÀÀµ·þÎñµ÷ÓÃά»¤Ò»¸öСµÄÏ̳߳أ¬µ±Ò»¸öÒÀÀµ·þÎñÓÉÓÚÏìÓ¦Âýµ¼ÖÂÏ̳߳ØÈÎÎñÂúµÄʱºò£¬²»»áÓ°Ïìµ½ÆäËûÒÀÀµ·þÎñµÄµ÷Óã¬ËüµÄȱµã¾ÍÊÇ»áÔö¼ÓÏß³ÌÊý¡£

²Õ±Ú¸ôÀëģʽ

ÎÞÂÛÊdz¬Ê±/ÖØÊÔ£¬ÈÛ¶ÏÆ÷£¬»¹ÊDzձڸôÀëģʽ£¬ËüÃÇÔÚʹÓùý³ÌÖж¼»á³öÏÖÒì³£Çé¿ö£¬Òì³£Çé¿öµÄ´¦Àí·½Ê½¼ä½ÓÓ°Ïìµ½Óû§µÄÌåÑ飬Õë¶ÔÒì³£Çé¿öµÄ´¦ÀíÒ²ÓÐÒ»ÖÖģʽ֧³Å£¬Õâ¾ÍÊÇ»ØÍË(fallback)ģʽ¡£

»ØÍË(Fallback)

ÔÚ³¬Ê±£¬ÖØÊÔʧ°Ü£¬ÈÛ¶Ï»òÕßÏÞÁ÷·¢ÉúµÄʱºò£¬ÎªÁ˼°Ê±»Ö¸´·þÎñ»òÕß²»Ó°Ïìµ½Óû§ÌåÑ飬ÐèÒªÌṩ»ØÍ˵ĻúÖÆ£¬³£¼ûµÄ»ØÍ˲ßÂÔÓУº

×Ô¶¨Òå´¦Àí£ºÔÚÕâÖÖ³¡¾°Ï£¬¿ÉÒÔʹÓÃĬÈÏÊý¾Ý£¬±¾µØÊý¾Ý£¬»º´æÊý¾ÝÀ´ÁÙʱ֧³Å£¬Ò²¿ÉÒÔ½«ÇëÇó·ÅÈë¶ÓÁУ¬»òÕßʹÓñ¸Ó÷þÎñ»ñÈ¡Êý¾ÝµÈ£¬ÊÊÓÃÓÚÒµÎñµÄ¹Ø¼üÁ÷³ÌÓëÑÏÖØÓ°ÏìÓû§ÌåÑéµÄ³¡¾°£¬ÈçÉ̼Ò/²úÆ·ÐÅÏ¢µÈºËÐÄ·þÎñ¡£

¹ÊÕϳÁĬ£¨fail-silent£©£ºÖ±½Ó·µ»Ø¿ÕÖµ»òȱʡֵ£¬ÊÊÓÃÓڿɽµ¼¶¹¦Äܵij¡¾°£¬Èç²úÆ·ÍÆ¼öÖ®ÀàµÄ¹¦ÄÜ£¬Êý¾ÝΪ¿ÕÒ²²»Ì«Ó°ÏìÓû§ÌåÑé¡£

¿ìËÙʧ°Ü£¨fail-fast£©£ºÖ±½ÓÅ׳öÒì³££¬ÊÊÓÃÓÚÊý¾Ý·ÇÇ¿ÒÀÀµµÄ³¡¾°£¬Èç·ÇºËÐÄ·þÎñ³¬Ê±µÄ´¦Àí¡£

Ó¦ÓÃʵÀý

ÔÚʵ¼ÊµÄ¹¤³Ìʵ¼ùÖУ¬ÕâËÄÖÖģʽ¼È¿ÉÒÔµ¥¶ÀʹÓã¬Ò²¿ÉÒÔ×éºÏʹÓã¬ÎªÁËÈöÁÕ߸üºÃµÄÀí½âÕâЩģʽµÄÓ¦Óã¬ÏÂÃæÒÔNetflixµÄ¿ªÔ´×é¼þHystrixµÄÁ÷³ÌΪÀý˵Ã÷¡£

ģʽ×éºÏ

ͼÖÐÁ÷³ÌµÄ˵Ã÷:

1¡¢½«Ô¶³Ì·þÎñµ÷ÓÃÂß¼­·â×°½øÒ»¸öHystrixCommand¡£

2¡¢¶ÔÓÚÿ´Î·þÎñµ÷ÓÿÉÒÔʹÓÃͬ²½»òÒì²½»úÖÆ£¬¶ÔÓ¦Ö´ÐÐexecute()»òqueue()¡£

3¡¢ÅжÏÈÛ¶ÏÆ÷(circuit-breaker)ÊÇ·ñ´ò¿ª»òÕß°ë´ò¿ª×´Ì¬£¬Èç¹û´ò¿ªÌøµ½²½Öè8£¬½øÐлØÍ˲ßÂÔ£¬Èç¹û¹Ø±Õ½øÈë²½Öè4¡£

4¡¢ÅжÏÏ̳߳Ø/¶ÓÁÐ/ÐźÅÁ¿£¨Ê¹ÓÃÁ˲ձڸôÀëģʽ£©ÊÇ·ñÅÜÂú£¬Èç¹ûÅÜÂú½øÈë»ØÍ˲½Öè8£¬·ñÔò¼ÌÐøºóÐø²½Öè5¡£

5¡¢run·½·¨ÖÐÖ´ÐÐÁËʵ¼ÊµÄ·þÎñµ÷Óá£

a. ·þÎñµ÷Ó÷¢Éú³¬Ê±Ê±£¬½øÈë²½Öè8¡£

6¡¢ÅжÏrun·½·¨ÖеĴúÂëÊÇ·ñÖ´Ðгɹ¦¡£

a. Ö´Ðгɹ¦·µ»Ø½á¹û¡£

b. Ö´ÐÐÖгöÏÖ´íÎóÔò½øÈë²½Öè8¡£

7¡¢ËùÓеÄÔËÐÐ״̬(³É¹¦£¬Ê§°Ü£¬¾Ü¾ø£¬³¬Ê±)Éϱ¨¸øÈÛ¶ÏÆ÷£¬ÓÃÓÚͳ¼Æ´Ó¶øÓ°ÏìÈÛ¶ÏÆ÷״̬¡£

8¡¢½øÈëgetFallback()»ØÍËÂß¼­¡£

a. ûÓÐʵÏÖgetFallback()»ØÍËÂß¼­µÄµ÷Óý«Ö±½ÓÅ׳öÒì³£¡£

b. »ØÍËÂß¼­µ÷Óóɹ¦Ö±½Ó·µ»Ø¡£

c. »ØÍËÂß¼­µ÷ÓÃʧ°ÜÅ׳öÒì³£¡£

9¡¢·µ»ØÖ´Ðгɹ¦½á¹û¡£

×ܽá

·þÎñÈÝ´íģʽÔÚÃÀÍŵãÆÀϵͳµÄÎȶ¨ÐÔ±£ÕÏ·½ÃæÓ¦Óúܶ࣬ѧϰģʽÓÐÖúÓÚÐÂÈËÖ±½ÓÀûÓÃÊìÁ·Èí¼þ¹¤³ÌʦµÄ¾­Ñ飬¶ÔÓÚÌáÉýϵͳµÄÎȶ¨ÐÔÓкܴóµÄ°ïÖú¡£·þÎñÈÝ´íµÄÄ¿µÄÖ÷ÒªÊÇΪÁË·À΢¶Å½¥£¬³ý´ËÖ®Íâ´íÎóµÄ¼°Ê±·¢ÏÖºÍ¼à¿ØÆäʵͬµÈÖØÒª¡£Ëæ×ż¼ÊõµÄÑÝ»¯£¬ÐµÄģʽÔÚ²»¶ÏµÄѧϰÓëʵ¼ùÖгÁµí³öÀ´£¬ÃÀÍŵãÆÀ¶È¼Ù¼¼ÊõÍŶÓÔÚ¹¹½¨Ò»¸ö¸ß¿ÉÓøßÐÔÄܵÄϵͳĿ±êÖ®Í⣬ÈÃϵͳԽÀ´Ô½Óе¯ÐÔ£¨Resilience£©Ò²ÊÇÎÒÃÇеÄ×·Çó¡£

   
5519 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù

×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Ïà¹ØÎÄÕÂ


ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS

Ïà¹ØÅàѵ¿Î³Ì


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù

³É¹¦°¸Àý


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù