Èç¹û´ó¼ÒÓÐÓ¡ÏóµÄ»°£¬ÓÈÆäÊÇÏÄÌ죬Èç¹û¼ÒÀïÓÃµç¸ºÔØ¹ý´ó£¬±ÈÈ翪Á˺ܶà¼ÒÓõçÆ÷£¬¾Í»á¡±×Ô¶¯ÌøÕ¢¡±£¬´Ëʱµç·¾Í»á¶Ï¿ª¡£ÔÚÒÔǰ¸ü¹ÅÀϵÄÒ»ÖÖ·½Ê½ÊÇ¡±±£ÏÕË¿¡±£¬µ±¸ºÔعý´ó£¬»òÕߵ緷¢Éú¹ÊÕÏ»òÒ쳣ʱ£¬µçÁ÷»á²»¶ÏÉý¸ß£¬Îª·ÀÖ¹Éý¸ßµÄµçÁ÷ÓпÉÄÜË𻵵ç·ÖеÄÄ³Ð©ÖØÒªÆ÷¼þ»ò¹óÖØÆ÷¼þ£¬ÉÕ»Ùµç·ÉõÖÁÔì³É»ðÔÖ¡£±£ÏÕË¿»áÔÚµçÁ÷Òì³£Éý¸ßµ½Ò»¶¨µÄ¸ß¶ÈºÍÈȶȵÄʱºò£¬×ÔÉíÈÛ¶ÏÇжϵçÁ÷£¬´Ó¶øÆðµ½±£»¤µç·°²È«ÔËÐеÄ×÷Óá£
ͬÑù£¬ÔÚ´óÐ͵ÄÈí¼þϵͳÖУ¬Èç¹ûµ÷ÓõÄÔ¶³Ì·þÎñ»òÕß×ÊÔ´ÓÉÓÚijÖÖÔÒòÎÞ·¨Ê¹ÓÃʱ£¬Èç¹ûûÓÐÕâÖÖ¹ýÔØ±£»¤£¬¾Í»áµ¼ÖÂÇëÇóµÄ×ÊÔ´×èÈûÔÚ·þÎñÆ÷Éϵȴý´Ó¶øºÄ¾¡ÏµÍ³»òÕß·þÎñÆ÷×ÊÔ´¡£ºÜ¶àʱºò¸Õ¿ªÊ¼¿ÉÄÜÖ»ÊÇϵͳ³öÏÖÁ˾ֲ¿µÄ¡¢Ð¡¹æÄ£µÄ¹ÊÕÏ£¬È»¶øÓÉÓÚÖÖÖÖÔÒò£¬¹ÊÕÏÓ°ÏìµÄ·¶Î§Ô½À´Ô½´ó£¬×îÖÕµ¼ÖÂÁËÈ«¾ÖÐԵĺó¹û¡£Èí¼þϵͳÖеÄÕâÖÖ¹ýÔØ±£»¤¾ÍÊDZ¾ÎĽ«ÒªÌ¸µ½µÄÈÛ¶ÏÆ÷ģʽ(Circuit
Breaker)
Ò» ÎÊÌâµÄ²úÉú
ÔÚ´óÐ͵ķֲ¼Ê½ÏµÍ³ÖУ¬Í¨³£ÐèÒªµ÷Óûò²Ù×÷Ô¶³ÌµÄ·þÎñ»òÕß×ÊÔ´£¬ÕâЩԶ³ÌµÄ·þÎñ»òÕß×ÊÔ´ÓÉÓÚµ÷ÓÃÕß²»¿ÉÒԿصÄÔÒò±ÈÈçÍøÂçÁ¬½Ó»ºÂý£¬×ÊÔ´±»Õ¼ÓûòÕßÔÝʱ²»¿ÉÓõÈÔÒò£¬µ¼Ö¶ÔÕâЩԶ³Ì×ÊÔ´µÄµ÷ÓÃʧ°Ü¡£ÕâЩ´íÎóͨ³£ÔÚÉÔºóµÄÒ»¶Îʱ¼äÄÚ¿ÉÒÔ»Ö¸´Õý³£¡£
µ«ÊÇ£¬ÔÚijЩÇé¿öÏ£¬ÓÉÓÚһЩÎÞ·¨Ô¤ÖªµÄÔÒòµ¼Ö½á¹ûºÜÄÑÔ¤ÁÏ£¬Ô¶³ÌµÄ·½·¨»òÕß×ÊÔ´¿ÉÄÜÐèÒªºÜ³¤µÄÒ»¶Îʱ¼ä²ÅÄÜÐÞ¸´¡£ÕâÖÖ´íÎóÑÏÖØµ½ÏµÍ³µÄ²¿·ÖʧȥÏìÓ¦ÉõÖÁµ¼ÖÂÕû¸ö·þÎñµÄÍêÈ«²»¿ÉÓá£ÔÚÕâÖÖÇé¿öÏ£¬²ÉÓò»¶ÏµØÖØÊÔ¿ÉÄܽâ¾ö²»ÁËÎÊÌ⣬Ïà·´£¬Ó¦ÓóÌÐòÔÚÕâ¸öʱºòÓ¦¸ÃÁ¢¼´·µ»Ø²¢ÇÒ±¨¸æ´íÎó¡£
ͨ³££¬Èç¹ûÒ»¸ö·þÎñÆ÷·Ç³£·±Ã¦£¬ÄÇôϵͳÖеIJ¿·Öʧ°Ü¿ÉÄܻᵼÖ ¡°Á¬ËøÊ§Ð§¡±£¨cascading failure£©¡£±ÈÈ磬ij¸ö²Ù×÷¿ÉÄÜ»áµ÷ÓÃÒ»¸öÔ¶³ÌµÄWebService£¬Õâ¸öservice»áÉèÖÃÒ»¸ö³¬Ê±µÄʱ¼ä£¬Èç¹ûÏìӦʱ¼ä³¬¹ýÁ˸Ãʱ¼ä¾Í»áÅ׳öÒ»¸öÒì³£¡£µ«ÊÇÕâÖÖ²ßÂԻᵼÖ²¢·¢µÄÇëÇóµ÷ÓÃͬÑùµÄ²Ù×÷»á×èÈû£¬Ò»Ö±µÈµ½³¬Ê±Ê±¼äµÄµ½ÆÚ¡£ÕâÖÖ¶ÔÇëÇóµÄ×èÈû¿ÉÄÜ»áÕ¼Óñ¦¹óµÄϵͳ×ÊÔ´£¬ÈçÄڴ棬Ị̈߳¬Êý¾Ý¿âÁ¬½ÓµÈµÈ£¬×îºóÕâЩ×ÊÔ´¾Í»áÏûºÄ´ù¾¡£¬Ê¹µÃÆäËûϵͳ²»Ïà¹ØµÄ²¿·ÖËùʹÓõÄ×ÊÔ´Ò²ºÄ¾¡´Ó¶øÍÏÀÛÕû¸öϵͳ¡£ÔÚÕâÖÖÇé¿öÏ£¬²Ù×÷Á¢¼´·µ»Ø´íÎó¶ø²»Êǵȴý³¬Ê±µÄ·¢Éú¿ÉÄÜÊÇÒ»ÖÖ¸üºÃµÄÑ¡Ôñ¡£Ö»Óе±µ÷Ó÷þÎñÓпÉÄܳɹ¦Ê±ÎÒÃÇÔÙÈ¥³¢ÊÔ¡£
¶þ ½â¾ö·½·¨
ÈÛ¶ÏÆ÷ģʽ¿ÉÒÔ·ÀÖ¹Ó¦ÓóÌÐò²»¶ÏµØ³¢ÊÔÖ´ÐпÉÄÜ»áʧ°ÜµÄ²Ù×÷£¬Ê¹µÃÓ¦ÓóÌÐò¼ÌÐøÖ´Ðжø²»ÓõȴýÐÞÕý´íÎ󣬻òÕßÀË·ÑCPUʱ¼äÈ¥µÈµ½³¤Ê±¼äµÄ³¬Ê±²úÉú¡£ÈÛ¶ÏÆ÷ģʽҲ¿ÉÒÔʹӦÓóÌÐòÄܹ»Õï¶Ï´íÎóÊÇ·ñÒѾÐÞÕý£¬Èç¹ûÒѾÐÞÕý£¬Ó¦ÓóÌÐò»áÔٴγ¢ÊÔµ÷ÓòÙ×÷¡£
ÈÛ¶ÏÆ÷ģʽ¾ÍÏñÊÇÄÇЩÈÝÒ×µ¼Ö´íÎóµÄ²Ù×÷µÄÒ»ÖÖ´úÀí¡£ÕâÖÖ´úÀíÄܹ»¼Ç¼×î½üµ÷Ó÷¢Éú´íÎóµÄ´ÎÊý£¬È»ºó¾ö¶¨Ê¹ÓÃÔÊÐí²Ù×÷¼ÌÐø£¬»òÕßÁ¢¼´·µ»Ø´íÎó¡£

ÈÛ¶ÏÆ÷¿ÉÒÔʹÓÃ״̬»úÀ´ÊµÏÖ£¬ÄÚ²¿Ä£ÄâÒÔϼ¸ÖÖ״̬¡£
1.±ÕºÏ£¨closed£©×´Ì¬£º ¶ÔÓ¦ÓóÌÐòµÄÇëÇóÄܹ»Ö±½ÓÒýÆð·½·¨µÄµ÷ÓᣴúÀíÀàά»¤ÁË×î½üµ÷ÓÃʧ°ÜµÄ´ÎÊý£¬Èç¹ûij´Îµ÷ÓÃʧ°Ü£¬Ôòʹʧ°Ü´ÎÊý¼Ó1¡£Èç¹û×î½üʧ°Ü´ÎÊý³¬¹ýÁËÔÚ¸ø¶¨Ê±¼äÄÚÔÊÐíʧ°ÜµÄãÐÖµ£¬Ôò´úÀíÀàÇл»µ½¶Ï¿ª(Open)״̬¡£´Ëʱ´úÀí¿ªÆôÁËÒ»¸ö³¬Ê±Ê±ÖÓ£¬µ±¸ÃʱÖÓ³¬¹ýÁ˸Ãʱ¼ä£¬ÔòÇл»µ½°ë¶Ï¿ª£¨Half-Open£©×´Ì¬¡£¸Ã³¬Ê±Ê±¼äµÄÉ趨ÊǸøÁËϵͳһ´Î»ú»áÀ´ÐÞÕýµ¼Öµ÷ÓÃʧ°ÜµÄ´íÎó¡£
2.¶Ï¿ª(Open)״̬£ºÔÚ¸Ã״̬Ï£¬¶ÔÓ¦ÓóÌÐòµÄÇëÇó»áÁ¢¼´·µ»Ø´íÎóÏìÓ¦¡£
3.°ë¶Ï¿ª£¨Half-Open£©×´Ì¬£ºÔÊÐí¶ÔÓ¦ÓóÌÐòµÄÒ»¶¨ÊýÁ¿µÄÇëÇó¿ÉÒÔÈ¥µ÷Ó÷þÎñ¡£Èç¹ûÕâЩÇëÇó¶Ô·þÎñµÄµ÷Óóɹ¦£¬ÄÇô¿ÉÒÔÈÏΪ֮ǰµ¼Öµ÷ÓÃʧ°ÜµÄ´íÎóÒѾÐÞÕý£¬´ËʱÈÛ¶ÏÆ÷Çл»µ½±ÕºÏ״̬(²¢ÇÒ½«´íÎó¼ÆÊýÆ÷ÖØÖÃ)£»Èç¹ûÕâÒ»¶¨ÊýÁ¿µÄÇëÇóÓе÷ÓÃʧ°ÜµÄÇé¿ö£¬ÔòÈÏΪµ¼ÖÂ֮ǰµ÷ÓÃʧ°ÜµÄÎÊÌâÈÔÈ»´æÔÚ£¬ÈÛ¶ÏÆ÷Çлص½¶Ï¿ª·½Ê½£¬È»ºó¿ªÊ¼ÖØÖüÆÊ±Æ÷À´¸øÏµÍ³Ò»¶¨µÄʱ¼äÀ´ÐÞÕý´íÎó¡£°ë¶Ï¿ª×´Ì¬Äܹ»ÓÐЧ·ÀÖ¹ÕýÔÚ»Ö¸´ÖеķþÎñ±»Í»È»¶øÀ´µÄ´óÁ¿ÇëÇóÔÙ´ÎÍϿ塣
¸÷¸ö״̬֮¼äµÄת»»ÈçÏÂͼ£º

ÔÚClose״̬Ï£¬´íÎó¼ÆÊýÆ÷ÊÇ»ùÓÚʱ¼äµÄ¡£ÔÚÌØ¶¨µÄʱ¼ä¼ä¸ôÄÚ»á×Ô¶¯ÖØÖá£ÕâÄܹ»·ÀÖ¹ÓÉÓÚij´ÎµÄżȻ´íÎóµ¼ÖÂÈÛ¶ÏÆ÷½øÈë¶Ï¿ª×´Ì¬¡£´¥·¢ÈÛ¶ÏÆ÷½øÈë¶Ï¿ª×´Ì¬µÄʧ°ÜãÐÖµÖ»ÓÐÔÚÌØ¶¨µÄʱ¼ä¼ä¸ôÄÚ£¬´íÎó´ÎÊý´ïµ½Ö¸¶¨´íÎó´ÎÊýµÄãÐÖµ²Å»á²úÉú¡£ÔÚHalf-Open״̬ÖÐʹÓõÄÁ¬Ðø³É¹¦´ÎÊý¼ÆÊýÆ÷¼Ç¼µ÷Óõijɹ¦´ÎÊý¡£µ±Á¬Ðøµ÷Óóɹ¦´ÎÊý´ïµ½Ä³¸öÖ¸¶¨ÖµÊ±£¬Çл»µ½±ÕºÏ״̬£¬Èç¹ûij´Îµ÷ÓÃʧ°Ü£¬Á¢¼´Çл»µ½¶Ï¿ª×´Ì¬£¬Á¬Ðø³É¹¦µ÷ÓôÎÊý¼ÆÊ±Æ÷ÔÚÏ´νøÈë°ë¶Ï¿ª×´Ì¬Ê±¹éÁã¡£
ʵÏÖÈÛ¶ÏÆ÷ģʽʹµÃϵͳ¸ü¼ÓÎȶ¨ºÍÓе¯ÐÔ£¬ÔÚϵͳ´Ó´íÎóÖлָ´µÄʱºòÌṩÎȶ¨ÐÔ£¬²¢ÇÒ¼õÉÙÁË´íÎó¶ÔϵͳÐÔÄܵÄÓ°Ïì¡£Ëüͨ¹ý¿ìËٵľܾøÄÇЩÊÔͼÓпÉÄܵ÷ÓûᵼÖ´íÎóµÄ·þÎñ£¬¶ø²»»áÈ¥µÈ´ý²Ù×÷³¬Ê±»òÕßÓÀÔ¶²»»á²»·µ»Ø½á¹ûÀ´Ìá¸ßϵͳµÄÏìӦʼþ¡£Èç¹ûÈÛ¶ÏÆ÷Éè¼ÆÄ£Ê½ÔÚÿ´Î״̬Çл»µÄʱºò»á·¢³öÒ»¸öʼþ£¬ÕâÖÖÐÅÏ¢¿ÉÒÔÓÃÀ´¼à¿Ø·þÎñµÄÔËÐÐ״̬£¬Äܹ»Í¨Öª¹ÜÀíÔ±ÔÚÈÛ¶ÏÆ÷Çл»µ½¶Ï¿ª×´Ì¬Ê±½øÐд¦Àí¡£
¿ÉÒÔ¶ÔÈÛ¶ÏÆ÷ģʽ½øÐж¨ÖÆÒÔÊÊӦһЩ¿ÉÄܻᵼÖÂÔ¶³Ì·þÎñʧ°ÜµÄÌØ¶¨³¡¾°¡£±ÈÈ磬¿ÉÒÔÔÚÈÛ¶ÏÆ÷ÖжԳ¬Ê±Ê±¼äʹÓò»¶ÏÔö³¤µÄ²ßÂÔ¡£ÔÚÈÛ¶ÏÆ÷¿ªÊ¼½øÈë¶Ï¿ª×´Ì¬µÄʱºò£¬¿ÉÒÔÉèÖó¬Ê±Ê±¼äΪ¼¸ÃëÖÓ£¬È»ºóÈç¹û´íÎóûÓб»½â¾ö£¬È»ºó½«¸Ã³¬Ê±Ê±¼äÉèÖÃΪ¼¸·ÖÖÓ£¬ÒÀ´ÎÀàÍÆ¡£ÔÚһЩÇé¿öÏ£¬ÔÚ¶Ï¿ª×´Ì¬ÏÂÎÒÃÇ¿ÉÒÔ·µ»ØÒ»Ð©´íÎóµÄĬÈÏÖµ£¬¶ø²»ÊÇÅ׳öÒì³£¡£
Èý Òª¿¼ÂǵÄÒòËØ
ÔÚʵÏÖÈÛ¶ÏÆ÷ģʽµÄʱºò£¬ÒÔÏÂÕâЩÒòËØÐè¿ÉÄÜÐèÒª¿¼ÂÇ£º
1.Òì³£´¦Àí£ºµ÷ÓÃÊÜÈÛ¶ÏÆ÷±£»¤µÄ·þÎñµÄʱºò£¬ÎÒÃDZØÐëÒª´¦Àíµ±·þÎñ²»¿ÉÓÃʱµÄÒì³£Çé¿ö¡£ÕâЩÒì³£´¦Àíͨ³£ÐèÒªÊÓ¾ßÌåµÄÒµÎñÇé¿ö¶ø¶¨¡£±ÈÈ磬Èç¹ûÓ¦ÓóÌÐòÖ»ÊÇÔÝʱµÄ¹¦Äܽµ¼¶£¬¿ÉÄÜÐèÒªÇл»µ½ÆäËüµÄ¿ÉÌæ»»µÄ·þÎñÉÏÀ´Ö´ÐÐÏàͬµÄÈÎÎñ»òÕß»ñÈ¡ÏàͬµÄÊý¾Ý£¬»òÕ߸øÓû§±¨¸æ´íÎóÈ»ºóÌáʾËûÃÇÉÔºóÖØÊÔ¡£
2.Òì³£µÄÀàÐÍ£ºÇëÇóʧ°ÜµÄÔÒò¿ÉÄÜÓкܶàÖÖ¡£Ò»Ð©ÔÒò¿ÉÄÜ»á±ÈÆäËüÔÒò¸üÑÏÖØ¡£±ÈÈ磬ÇëÇó»áʧ°Ü¿ÉÄÜÊÇÓÉÓÚÔ¶³ÌµÄ·þÎñ±ÀÀ££¬Õâ¿ÉÄÜÐèÒª»¨·ÑÊý·ÖÖÓÀ´»Ö¸´£»Ò²¿ÉÄÜÊÇÓÉÓÚ·þÎñÆ÷ÔÝʱ¸ºÔعýÖØµ¼Ö³¬Ê±¡£ÈÛ¶ÏÆ÷Ó¦¸ÃÄܹ»¼ì²é´íÎóµÄÀàÐÍ£¬´Ó¶ø¸ù¾Ý¾ßÌåµÄ´íÎóÇé¿öÀ´µ÷Õû²ßÂÔ¡£±ÈÈ磬¿ÉÄÜÐèÒªºÜ¶à´Î³¬Ê±Òì³£²Å¿ÉÒԶ϶¨ÐèÒªÇл»µ½¶Ï¿ª×´Ì¬£¬¶øÖ»ÐèÒª¼¸´Î´íÎóÌáʾ¾Í¿ÉÒÔÅжϷþÎñ²»¿ÉÓöø¿ìËÙÇл»µ½¶Ï¿ª×´Ì¬¡£
3.ÈÕÖ¾£ºÈÛ¶ÏÆ÷Ó¦¸ÃÄܹ»¼Ç¼ËùÓÐʧ°ÜµÄÇëÇó£¬ÒÔ¼°Ò»Ð©¿ÉÄ᳢ܻÊԳɹ¦µÄÇëÇó£¬Ê¹µÃµÄ¹ÜÀíÔ±Äܹ»¼à¿ØÊ¹ÓÃÈÛ¶ÏÆ÷±£»¤µÄ·þÎñµÄÖ´ÐÐÇé¿ö¡£
4.²âÊÔ·þÎñÊÇ·ñ¿ÉÓãºÔÚ¶Ï¿ª×´Ì¬Ï£¬ÈÛ¶ÏÆ÷¿ÉÒÔ²ÉÓö¨ÆÚµÄpingÔ¶³ÌµÄ·þÎñ»òÕß×ÊÔ´£¬À´ÅжÏÊÇ·ñ·þÎñÊÇ·ñ»Ö¸´£¬¶ø²»ÊÇʹÓüÆÊ±Æ÷À´×Ô¶¯Çл»µ½°ë¶Ï¿ª×´Ì¬¡£ÕâÖÖping²Ù×÷¿ÉÒÔÄ£Äâ֮ǰÄÇЩʧ°ÜµÄÇëÇ󣬻òÕß¿ÉÒÔʹÓÃͨ¹ýµ÷ÓÃÔ¶³Ì·þÎñÌṩµÄ¼ì²é·þÎñÊÇ·ñ¿ÉÓõķ½·¨À´Åжϡ£
5.ÊÖ¶¯ÖØÖãºÔÚϵͳÖжÔÓÚʧ°Ü²Ù×÷µÄ»Ö¸´Ê±¼äÊǺÜÄÑÈ·¶¨µÄ£¬Ìṩһ¸öÊÖ¶¯ÖØÖù¦ÄÜÄܹ»Ê¹µÃ¹ÜÀíÔ±¿ÉÒÔÊÖ¶¯µÄÇ¿ÖÆ½«ÈÛ¶ÏÆ÷Çл»µ½±ÕºÏ״̬¡£Í¬ÑùµÄ£¬Èç¹ûÊÜÈÛ¶ÏÆ÷±£»¤µÄ·þÎñÔÝʱ²»¿ÉÓõϰ£¬¹ÜÀíÔ±Äܹ»Ç¿ÖƵĽ«ÈÛ¶ÏÆ÷ÉèÖÃΪ¶Ï¿ª×´Ì¬¡£
6.²¢·¢ÎÊÌ⣺ÏàͬµÄÈÛ¶ÏÆ÷ÓпÉÄܱ»´óÁ¿²¢·¢ÇëÇóͬʱ·ÃÎÊ¡£ÈÛ¶ÏÆ÷µÄʵÏÖ²»Ó¦¸Ã×èÈû²¢·¢µÄÇëÇó»òÕßÔö¼Óÿ´ÎÇëÇóµ÷Óõĸºµ£¡£
7.×ÊÔ´µÄ²îÒìÐÔ£ºÊ¹Óõ¥¸öÈÛ¶ÏÆ÷ʱ£¬Ò»¸ö×ÊÔ´Èç¹û??Óзֲ¼ÔÚ¶à¸öµØ·½¾ÍÐèҪСÐÄ¡£±ÈÈ磬һ¸öÊý¾Ý¿ÉÄÜ´æ´¢ÔÚ¶à¸ö´ÅÅÌ·ÖÇøÉÏ(shard)£¬Ä³¸ö·ÖÇø¿ÉÒÔÕý³£·ÃÎÊ£¬¶øÁíÒ»¸ö¿ÉÄÜ´æÔÚÔÝʱÐÔµÄÎÊÌâ¡£ÔÚÕâÖÖÇé¿öÏ£¬²»Í¬µÄ´íÎóÏìÓ¦Èç¹û»ìΪһ̸£¬ÄÇôӦÓóÌÐò·ÃÎʵÄÕâЩ´æÔÚÎÊÌâµÄ·ÖÇøµÄʧ°ÜµÄ¿ÉÄÜÐԾͻá¸ß£¬¶øÄÇЩ±»ÈÏΪÊÇÕý³£µÄ·ÖÇø£¬¾ÍÓпÉÄܱ»×èÈû¡£
8.¼Ó¿ìÈÛ¶ÏÆ÷µÄÈ۶ϲÙ×÷:ÓÐʱºò£¬·þÎñ·µ»ØµÄ´íÎóÐÅÏ¢×ã¹»ÈÃÈÛ¶ÏÆ÷Á¢¼´Ö´ÐÐÈ۶ϲÙ×÷²¢ÇÒ±£³ÖÒ»¶Îʱ¼ä¡£±ÈÈ磬Èç¹û´ÓÒ»¸ö·Ö²¼Ê½×ÊÔ´·µ»ØµÄÏìÓ¦Ìáʾ¸ºÔس¬ÖØ£¬ÄÇô¿ÉÒԶ϶¨³ö²»½¨ÒéÁ¢¼´ÖØÊÔ£¬¶øÊÇÓ¦¸ÃµÈ´ý¼¸·ÖÖÓºóÔÙÖØÊÔ¡££¨HTTPÐÒ鶨ÒåÁË¡±HTTP
503 Service Unavailable¡±À´±íʾÇëÇóµÄ·þÎñµ±Ç°²»¿ÉÓã¬Ëû¿ÉÒÔ°üº¬ÆäËûÐÅÏ¢±ÈÈ磬³¬Ê±µÈ£©
9.ÖØ¸´Ê§°ÜÇëÇ󣺵±ÈÛ¶ÏÆ÷ÔÚ¶Ï¿ª×´Ì¬µÄʱºò£¬ÈÛ¶ÏÆ÷¿ÉÒԼǼÿһ´ÎÇëÇóµÄϸ½Ú£¬¶ø²»Êǽö½ö·µ»ØÊ§°ÜÐÅÏ¢£¬ÕâÑùµ±Ô¶³Ì·þÎñ»Ö¸´µÄʱºò£¬¿ÉÒÔ½«ÕâЩʧ°ÜµÄÇëÇóÔÙÖØÐÂÇëÇóÒ»´Î¡£
ËÄ Ê¹Óó¡¾°
Ó¦¸ÃʹÓøÃģʽÀ´£º
·ÀÖ¹Ó¦ÓóÌÐòÖ±½Óµ÷ÓÃÄÇЩºÜ¿ÉÄÜ»áµ÷ÓÃʧ°ÜµÄÔ¶³Ì·þÎñ»ò¹²Ïí×ÊÔ´¡£
²»Êʺϵij¡¾°£º
¶ÔÓÚÓ¦ÓóÌÐòÖеÄÖ±½Ó·ÃÎʱ¾µØË½ÓÐ×ÊÔ´£¬±ÈÈçÄÚ´æÖеÄÊý¾Ý½á¹¹£¬Èç¹ûʹÓÃÈÛ¶ÏÆ÷ģʽֻ»áÔö¼Óϵͳ¶îÍ⿪Ïú¡£
²»ÊʺÏ×÷ΪӦÓóÌÐòÖÐÒµÎñÂß¼µÄÒì³£´¦ÀíÌæ´úÆ·
Îå ʵÏÖ
¸ù¾ÝÉÏÃæµÄ״̬Çл»Í¼£¬ÎÒÃǺÜÈÝÒ×ʵÏÖÒ»¸ö»ù±¾µÄÈÛ¶ÏÆ÷£¬Ö»ÐèÒªÔÚÄÚ²¿Î¬»¤Ò»¸ö״̬»ú£¬²¢¶¨ÒåºÃ×´Ì¬×ªÒÆµÄ¹æÔò£¬¿ÉÒÔʹÓÃStateģʽÀ´ÊµÏÖ¡£Ê×ÏÈ£¬ÎÒÃǶ¨ÒåÒ»¸ö±íÊ¾×´Ì¬×ªÒÆ²Ù×÷µÄ³éÏóÀàCircuitBreakerState£º
public abstract class CircuitBreakerState { protected CircuitBreakerState(CircuitBreaker circuitBreaker) { this.circuitBreaker = circuitBreaker; }
/// <summary>
/// µ÷ÓÃÊܱ£»¤·½·¨Ö®Ç°´¦ÀíµÄ²Ù×÷
/// </summary>
public virtual void ProtectedCodeIsAboutToBeCalled()
{
//Èç¹ûÊǶϿª×´Ì¬£¬Ö±½Ó·µ»Ø
//È»ºó×øµÈ³¬Ê±×ª»»µ½°ë¶Ï¿ª×´Ì¬
if (circuitBreaker.IsOpen)
{
throw new OpenCircuitException();
}
}
/// <summary>
/// ÊÜÈÛ¶ÏÆ÷±£»¤µÄ·½·¨µ÷Óóɹ¦Ö®ºóµÄ²Ù×÷
/// </summary>
public virtual void ProtectedCodeHasBeenCalled()
{
circuitBreaker.IncreaseSuccessCount();
}
/// <summary>
///ÊÜÈÛ¶ÏÆ÷±£»¤µÄ·½·¨µ÷Ó÷¢ÉúÒì³£²Ù×÷ºóµÄ²Ù×÷
/// </summary>
/// <param name="e"></param>
public virtual void ActUponException(Exception
e)
{
//Ôö¼Óʧ°Ü´ÎÊý¼ÆÊýÆ÷£¬²¢ÇÒ±£´æ´íÎóÐÅÏ¢
circuitBreaker.IncreaseFailureCount(e);
//ÖØÖÃÁ¬Ðø³É¹¦´ÎÊý
circuitBreaker.ResetConsecutiveSuccessCount();
}
protected readonly CircuitBreaker circuitBreaker;
} |
³éÏóÀàÖУ¬×´Ì¬»úCircuitBreakerͨ¹ý¹¹Ô캯Êý×¢È룻µ±·¢Éú´íÎóʱ£¬ÎÒÃÇÔö¼Ó´íÎó¼ÆÊýÆ÷£¬²¢ÇÒÖØÖÃÁ¬Ðø³É¹¦¼ÆÊýÆ÷£¬ÔÚÔö¼Ó´íÎó¼ÆÊýÆ÷²Ù×÷ÖУ¬Í¬Ê±Ò²¼Ç¼Á˳ö´íµÄÒì³£ÐÅÏ¢¡£
È»ºóÔÚ·Ö±ðʵÏÖ±íʾÈÛ¶ÏÆ÷Èý¸ö״̬µÄÀà¡£Ê×ÏÈʵÏÖ±ÕºÏ״̬CloseState£º
public class ClosedState : CircuitBreakerState { public ClosedState(CircuitBreaker circuitBreaker) : base(circuitBreaker) { //ÖØÖÃʧ°Ü¼ÆÊýÆ÷ circuitBreaker.ResetFailureCount(); }
public override void ActUponException(Exception
e)
{
base.ActUponException(e);
//Èç¹ûʧ°Ü´ÎÊý´ïµ½ãÐÖµ£¬ÔòÇл»µ½¶Ï¿ª×´Ì¬
if (circuitBreaker.FailureThresholdReached())
{
circuitBreaker.MoveToOpenState();
}
}
} |
ÔÚ±ÕºÏ״̬Ï£¬Èç¹û·¢Éú´íÎ󣬲¢ÇÒ´íÎó´ÎÊý´ïµ½ãÐÖµ£¬Ôò״̬»úÇл»µ½¶Ï¿ª×´Ì¬¡£¶Ï¿ª×´Ì¬OpenStateµÄʵÏÖÈçÏ£º
public class OpenState : CircuitBreakerState { private readonly Timer timer;
public OpenState(CircuitBreaker circuitBreaker)
: base(circuitBreaker)
{
timer = new Timer(circuitBreaker.Timeout.TotalMilliseconds);
timer.Elapsed += TimeoutHasBeenReached;
timer.AutoReset = false;
timer.Start();
}
//¶Ï¿ª³¬¹ýÉ趨µÄãÐÖµ£¬×Ô¶¯Çл»µ½°ë¶Ï¿ª×´Ì¬
private void TimeoutHasBeenReached(object sender,
ElapsedEventArgs e)
{
circuitBreaker.MoveToHalfOpenState();
}
public override void ProtectedCodeIsAboutToBeCalled()
{
base.ProtectedCodeIsAboutToBeCalled();
throw new OpenCircuitException();
}
} |
¶Ï¿ª×´Ì¬ÄÚ²¿Î¬»¤Ò»¸ö¼ÆÊýÆ÷£¬Èç¹û¶Ï¿ª´ïµ½Ò»¶¨µÄʱ¼ä£¬Ôò×Ô¶¯Çл»µ½°æ¶Ï¿ª×´Ì¬£¬²¢ÇÒ£¬ÔÚ¶Ï¿ª×´Ì¬Ï£¬Èç¹ûÐèÒªÖ´ÐвÙ×÷£¬ÔòÖ±½ÓÅ׳öÒì³£¡£
×îºó°ë¶Ï¿ªHalf-Open״̬ʵÏÖÈçÏ£º
public class HalfOpenState : CircuitBreakerState { public HalfOpenState(CircuitBreaker circuitBreaker) : base(circuitBreaker) { //ÖØÖÃÁ¬Ðø³É¹¦¼ÆÊý circuitBreaker.ResetConsecutiveSuccessCount(); }
public override void ActUponException(Exception
e)
{
base.ActUponException(e);
//Ö»ÒªÓÐʧ°Ü£¬Á¢¼´Çл»µ½¶Ï¿ªÄ£Ê½
circuitBreaker.MoveToOpenState();
}
public override void ProtectedCodeHasBeenCalled()
{
base.ProtectedCodeHasBeenCalled();
//Èç¹ûÁ¬Ðø³É¹¦´ÎÊý´ïµ½ãÐÖµ£¬Çл»µ½±ÕºÏ״̬
if (circuitBreaker.ConsecutiveSuccessThresholdReached())
{
circuitBreaker.MoveToClosedState();
}
}
} |
Çл»µ½°ë¶Ï¿ª×´Ì¬Ê±£¬½«Á¬Ðø³É¹¦µ÷ÓüÆÊýÖØÖÃΪ0£¬µ±Ö´Ðгɹ¦µÄʱºò£¬×ÔÔö¸Ä×ֶΣ¬µ±´ïµ½Á¬¶Áµ÷Óóɹ¦´ÎÊýµÄãÐֵʱ£¬Çл»µ½±ÕºÏ״̬¡£Èç¹ûµ÷ÓÃʧ°Ü£¬Á¢¼´Çл»µ½¶Ï¿ªÄ£Ê½¡£
ÓÐÁËÒÔÉÏÈýÖÖ״̬Çл»Ö®ºó£¬ÎÒÃÇҪʵÏÖCircuitBreakerÀàÁË:
public class CircuitBreaker { private readonly object monitor = new object(); private CircuitBreakerState state; public int FailureCount { get; private set; } public int ConsecutiveSuccessCount { get; private set; } public int FailureThreshold { get; private set; } public int ConsecutiveSuccessThreshold { get; private set; } public TimeSpan Timeout { get; private set; } public Exception LastException { get; private set; }
public bool IsClosed
{
get { return state is ClosedState; }
}
public bool IsOpen
{
get { return state is OpenState; }
}
public bool IsHalfOpen
{
get { return state is HalfOpenState; }
}
internal void MoveToClosedState()
{
state = new ClosedState(this);
}
internal void MoveToOpenState()
{
state = new OpenState(this);
}
internal void MoveToHalfOpenState()
{
state = new HalfOpenState(this);
}
internal void IncreaseFailureCount(Exception
ex)
{
LastException = ex;
FailureCount++;
}
internal void ResetFailureCount()
{
FailureCount = 0;
}
internal bool FailureThresholdReached()
{
return FailureCount >= FailureThreshold;
}
internal void IncreaseSuccessCount()
{
ConsecutiveSuccessCount++;
}
internal void ResetConsecutiveSuccessCount()
{
ConsecutiveSuccessCount = 0;
}
internal bool ConsecutiveSuccessThresholdReached()
{
return ConsecutiveSuccessCount >= ConsecutiveSuccessThreshold;
}
} |
ÔÚ¸ÃÀàÖÐÊ×ÏÈ£º
1.¶¨ÒåÁËһЩ¼Ç¼״̬µÄ±äÁ¿£¬ÈçFailureCount£¬ConsecutiveSuccessCount
¼Ç¼ʧ°Ü´ÎÊý£¬Á¬Ðø³É¹¦´ÎÊý£¬ÒÔ¼°FailureThreshold£¬ConsecutiveSuccessThreshold¼Ç¼×î´óµ÷ÓÃʧ°Ü´ÎÊý£¬Á¬Ðøµ÷Óóɹ¦´ÎÊý¡£ÕâЩ¶ÔÏó¶ÔÍⲿÀ´ËµÊÇÖ»¶ÁµÄ¡£
2.¶¨ÒåÁËÒ»¸ö CircuitBreakerStateÀàÐ͵Ästate±äÁ¿£¬ÒÔ±íʾµ±Ç°ÏµÍ³µÄ״̬¡£
3.¶¨ÒåÁËһЩÁлñÈ¡µ±Ç°×´Ì¬µÄ·½·¨IsOpen,IsClose,IsHalfOpen,ÒÔ¼°±íÊ¾×´Ì¬×ªÒÆµÄ·½·¨MoveToOpenState£¬MoveToClosedStateµÈ£¬ÕâЩ·½·¨±È½Ï¼òµ¥£¬¸ù¾ÝÃû×Ö¼´¿É¿´³öÓÃÒâ¡£
È»ºó£¬¿ÉÒÔͨ¹ý¹¹Ô캯Êý½«ÔÚClose״̬ÏÂ×î´óʧ°Ü´ÎÊý£¬HalfOpen״̬ÏÂʹÓõÄ×î´óÁ¬Ðø³É¹¦´ÎÊý£¬ÒÔ¼°Open״̬ϵij¬Ê±Ê±¼äͨ¹ý¹¹Ô캯Êý´«½øÀ´£º
public CircuitBreaker(int failedthreshold, int consecutiveSuccessThreshold, TimeSpan timeout) { if (failedthreshold < 1 || consecutiveSuccessThreshold < 1) { throw new ArgumentOutOfRangeException("threshold", "Threshold should be greater than 0"); }
if (timeout.TotalMilliseconds < 1)
{
throw new ArgumentOutOfRangeException("timeout",
"Timeout should be greater than 0");
}
FailureThreshold = failedthreshold;
ConsecutiveSuccessThreshold = consecutiveSuccessThreshold;
Timeout = timeout;
MoveToClosedState();
} |
ÔÚ³õʼ״̬Ï£¬ÈÛ¶ÏÆ÷Çл»µ½±ÕºÏ״̬¡£
È»ºó£¬¿ÉÒÔͨ¹ýAttempCallµ÷Ó㬴«ÈëÆÚÍûÖ´ÐеĴúÀí·½·¨£¬¸Ã·½·¨µÄÖ´ÐÐÊÜÈÛ¶ÏÆ÷±£»¤¡£ÕâÀïʹÓÃÁËËøÀ´´¦Àí²¢·¢ÎÊÌâ¡£
public void AttemptCall(Action protectedCode) { using (TimedLock.Lock(monitor)) { state.ProtectedCodeIsAboutToBeCalled(); }
try
{
protectedCode();
}
catch (Exception e)
{
using (TimedLock.Lock(monitor))
{
state.ActUponException(e);
}
throw;
}
using (TimedLock.Lock(monitor))
{
state.ProtectedCodeHasBeenCalled();
}
} |
×îºó£¬ÌṩCloseºÍOpenÁ½¸ö·½·¨À´ÊÖ¶¯Çл»µ±Ç°×´Ì¬¡£
public void Close() { using (TimedLock.Lock(monitor)) { MoveToClosedState(); } }
public void Open()
{
using (TimedLock.Lock(monitor))
{
MoveToOpenState();
}
} |
Áù ²âÊÔ
ÒÔÉϵÄÈÛ¶Ïģʽ£¬ÎÒÃÇ¿ÉÒÔ¶ÔÆä½¨Á¢µ¥Ôª²âÊÔ¡£
Ê×ÏÈÎÒÃDZàд¼¸¸ö°ïÖúÀàÒÔÄ£ÄâÁ¬ÐøÖ´ÐдÎÊý£º
private static void CallXAmountOfTimes(Action codeToCall, int timesToCall) { for (int i = 0; i < timesToCall; i++) { codeToCall(); } } |
ÒÔÏÂÀàÓÃÀ´Å׳öÌØ¶¨Òì³££º
private static void AssertThatExceptionIsThrown<T>(Action code) where T : Exception { try { code(); } catch (T) { return; }
Assert.Fail("Expected exception of type
{0} was not thrown", typeof(T).FullName);
} |
È»ºó£¬Ê¹ÓÃNUnit£¬¿ÉÒÔ½¨Á¢ÈçÏÂCase£º
[Test] public void ClosesIfProtectedCodeSucceedsInHalfOpenState() { var stub = new Stub(10); //¶¨ÒåÈÛ¶ÏÆ÷£¬Ê§°Ü10´Î½øÈë¶Ï¿ª×´Ì¬ //5Ãëºó½øÈë°ë¶Ï¿ª×´Ì¬ //ÔÚ°ë¶Ï¿ª×´Ì¬Ï£¬Á¬Ðø³É¹¦15´Î£¬½øÈë±ÕºÏ״̬ var circuitBreaker = new CircuitBreaker(10, 15, TimeSpan.FromMilliseconds(5000)); Assert.That(circuitBreaker.IsClosed); //ʧ°Ü10´Îµ÷Óà CallXAmountOfTimes(() => AssertThatExceptionIsThrown<ApplicationException>(()
=> circuitBreaker.AttemptCall(stub.DoStuff)), 10);
Assert.AreEqual(10, circuitBreaker.FailureCount);
Assert.That(circuitBreaker.IsOpen);
//µÈ´ý´ÓOpenתµ½HalfOpen
Thread.Sleep(6000);
Assert.That(circuitBreaker.IsHalfOpen);
//³É¹¦µ÷ÓÃ15´Î
CallXAmountOfTimes(()=>circuitBreaker.AttemptCall(stub.DoStuff),
15);
Assert.AreEqual(15, circuitBreaker.ConsecutiveSuccessCount);
Assert.AreEqual(0, circuitBreaker.FailureCount);
Assert.That(circuitBreaker.IsClosed);
} |
Õâ¸öCaseÄ£ÄâÁËÈÛ¶ÏÆ÷ÖÐ״̬µÄת»»¡£Ê×Ïȳõʼ»¯Ê±£¬ÈÛ¶ÏÆ÷´¦ÓÚ±ÕºÏ״̬£¬È»ºóÁ¬Ðø10´Îµ÷ÓÃÅ׳öÒì³££¬ÕâʱÈÛ¶ÏÆ÷½øÈ¥Á˶Ͽª×´Ì¬£¬È»ºóÈÃÏ̵߳ȴý6Ã룬´ËʱÔÚµÚ5ÃëµÄʱºò£¬×´Ì¬Çл»µ½Á˰ë¶Ï¿ª×´Ì¬¡£È»ºóÁ¬Ðø15´Î³É¹¦µ÷Ó㬴Ëʱ״̬ÓÖÇл»µ½Á˱պÏ״̬¡£
Æß ½áÂÛ
ÔÚÓ¦ÓÃϵͳÖУ¬ÎÒÃÇͨ³£»áÈ¥µ÷ÓÃÔ¶³ÌµÄ·þÎñ»òÕß×ÊÔ´(ÕâЩ·þÎñ»ò×ÊԴͨ³£ÊÇÀ´×ÔµÚÈý·½)£¬¶ÔÕâЩԶ³Ì·þÎñ»òÕß×ÊÔ´µÄµ÷ÓÃͨ³£»áµ¼ÖÂʧ°Ü£¬»òÕß¹ÒÆðûÓÐÏìÓ¦£¬Ö±µ½³¬Ê±µÄ²úÉú¡£ÔÚһЩ¼«¶ËÇé¿öÏ£¬´óÁ¿µÄÇëÇó»á×èÈûÔÚ¶ÔÕâЩÒì³£µÄÔ¶³Ì·þÎñµÄµ÷ÓÃÉÏ£¬»áµ¼ÖÂһЩ¹Ø¼üÐÔµÄϵͳ×ÊÔ´ºÄ¾¡£¬´Ó¶øµ¼Ö¼¶ÁªµÄʧ°Ü£¬´Ó¶øÍÏ¿åÕû¸öϵͳ¡£ÈÛ¶ÏÆ÷ģʽÔÚÄÚ²¿²ÉÓÃ״̬»úµÄÐÎʽ£¬Ê¹µÃ¶ÔÕâЩ¿ÉÄܻᵼÖÂÇëÇóʧ°ÜµÄÔ¶³Ì·þÎñ½øÐÐÁ˰ü×°£¬µ±Ô¶³Ì·þÎñ·¢ÉúÒ쳣ʱ£¬¿ÉÒÔÁ¢¼´¶Ô½øÀ´µÄÇëÇ󷵻شíÎóÏìÓ¦£¬²¢¸æÖªÏµÍ³¹ÜÀíÔ±£¬½«´íÎó¿ØÖÆÔÚ¾Ö²¿·¶Î§ÄÚ£¬´Ó¶øÌá¸ßϵͳµÄÎȶ¨ÐԺͿɿ¿ÐÔ¡£
±¾ÎÄÊ×ÏȽéÉÜÁËÈÛ¶ÏÆ÷ģʽʹÓõij¡¾°£¬Äܹ»½â¾öµÄÎÊÌ⣬ÒÔ¼°ÐèÒª¿¼ÂǵÄÒòËØ£¬×îºóʹÓôúÂëչʾÁËÈçºÎʵÏÖÒ»¸ö¼òµ¥µÄÈÛ¶ÏÆ÷£¬²¢ÇÒ¸ø³öÁ˲âÊÔÓÃÀý£¬Ï£ÍûÕâЩ¶ÔÄúÓаïÖú£¬ÓÈÆäÊÇÔÚµ±ÄúµÄϵͳµ÷ÓÃÁËÍⲿµÄÔ¶³Ì·þÎñ»òÕß×ÊÔ´£¬Í¬Ê±·ÃÎÊÁ¿ÓֺܴóµÄÇé¿ö϶ÔÌá¸ßϵͳµÄÎȶ¨ÐԺͿɿ¿ÐÔÓÐËù°ïÖú¡£
|