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