ﻗﺼــﺪ ﺩﺍﺭﻡ ﻧﮕﺎﻫﻲ ﺑﻪ Circuit breaker pattern ﺑﻨﺪﺍﺯﻳﻢ ﻛﻪ ﺩﺭ ﻛﺘﺎﺏ Release It! Design and Deploy
Production-Ready Software ﻣﻄﺎﻟﻌﻪ ﻛﺮﺩﻡ ﺍﺯ ﻧﻈﺮﻡ ﺧﻮﺩﻡ ﻳﻜﻲ ﺍﺯ ﺑﻬﺘﺮﻳﻦ ﻛﺘﺎﺑﻬﺎﻱ ﺑﻮﺩ ﻛﻪ ﺧﻮﻧﺪﻡ ﻭ ﺑﺴــﻴﺎﺭ ﺟﺬﺍﺏ
ﺑﻮﺩ.ﺍﻣﺎ ﻗﺒﻞ ﺍﺯ ﺍﻳﻨﻜﻪ ﺑﻪ ﺑﺮﺭ ﺳﻲ ﺍﻳﻦ pattern ﺑﭙﺮﺩﺍﺯﻳﻢ ﺑﺎﻳﺪ ﺍﺑﺘﺪﺍ ﺑﻪ ﺗﺎﺭﻳﺨﭽﻪ ﻭ ﺩﺍ ﺳﺘﺎﻧﻲ ﻛﻪ ﺍﻳﻦ pattern ﺩﺍﺭﺩ ﺑﭙﺮﺩﺍﺯﻳﻢ ﺗﺎ
ﺩﺭﻙ ﺑﻬﺘﺮﻱ ﺍﺯ ﺍﻳﻦ pattern ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ.ﺍﮔﺮ ﺑﺨﻮﺍﻫﻴﻢ ﺑﻪ ﻃﻮﺭ ﻋﻤﻴﻖ ﺑﺮﺭﺳﻲ ﻛﻨﻴﻢ ﺑﺎﻳﺪ ﺳﺮﻱ ﺑﻪ ﺭﺷﺘﻪ ﺑﺮﻕ ﺑﺰﻧﻴﻢ ﻭ ﺭﻳﺸﻪ
ﻭ ﺩﻻﻳﻞ ﺍﻳﻦ pattern ﺭﺍ ﺍﺯ ﺍﻳﻦ ﺭﺷﺘﻪ ﺟﺴﺘﺠﻮ ﻛﻨﻴﻢ.
ﭘﺲ ﺑﺎﻳﺪ ﺍﺯ ﺯﻣﺎﻧﻲ ﺁﻏﺎﺯ ﻛﻨﻴﻢ ﻛﻪ ﭘﺎﻱ ﺑﺮﻕ ﺑﻪ ﻣﻤﻠﻜﺖ ﻣﺎ ﺑﺎﺯ ﺷﺪ
ﺷﺶ ﺳﺎﻝ ﺑﻌﺪ ﺍﺯ ﺍﻳﻨﻜﻪ ﺍﺩﻳﺴﻮﻥ ﺑﺮﻕ ﺭﻭ ﺍﺧﺘﺮﺍﻉ ﻛﺮﺩ ﺗﻮﻱ ﺳﺎﻝ 1302 ﺍﻭﻟﻴﻦ ﻻﻣﭗ ﺩﺭ ﻛﺎﺥ ﮔﻠﺴﺘﺎﻥ ﻧﺎﺻﺮﺍﻟﺪﻳﻦ ﺷﺎﻩ
ﺭﻭ ﺷﻦ ﺷﺪ ﻭ ﺩﻭ ﺳﺎﻝ ﺑﻌﺪ ﺩﺭ ﺗﻜﻴﻪ ﺩﻭﻟﺖ ﻣﺮﺍ ﺳﻢ ﻋﺰﺍﺩﺍﺭﻱ ﻭ ﺗﻌﺰﻳﻪ ﮔﺮﺩﺍﻧﻲ ﺳﻴﺪﺍﻟ ﺸﻬﺪﺍء ﺭﺍ ﻧﻴﺰ ﺑﺎ ﻧﻮﺭ ﺧﻮﺩ ﺭﻭﻧﻖ ﺩﺍﺩ. ﺍﻳﻦ
ﻣﻮﻟﺪ ﺑﻪ ﺩﺳﺘﻮﺭ ﻧﺎﺻﺮﺍﻟﺪﻳﻦ ﺷﺎﻩ ﻗﺎﺟﺎﺭ ﺗﻮﺳﻂ ﻣﺤﻤﺪ ﺣﺴﻦ ﺍﻣﻴﻦ ﺍﻟﻀﺮﺏ ﺑﻪ ﺍﻳﺮﺍﻥ ﻭﺍﺭﺩ ﺷﺪﻩ ﺑﻮﺩ .
ﺍﺯ ﺍﻳﻦ ﺳﺎﻝ ﺑﻌﺪ ﺭﻓﺘﻪ ﺭﻓﺘﻪ ﺑﺨﺶ ﺧﺼﻮﺻﻲ ﻭ ﻣﺮﺩﻡ ﺍﺯ ﻣﺰﺍﺑﺎﻳﻲ ﺑﺮﻕ ﺁﮔﺎﻩ ﺷﺪﻥ ﻭ ﺗﺎﺳﻴﺴﺎﺗﻲ ﺑﺮﺍﻱ ﺗﻮﻟﻴﺪ ﺑﺮﻕ ﺩﺭ ﻛﺸﻮﺭ ﺑﺮﺍﻱ
ﺗﻮﻟﻴﺪ ﻭ ﻓﺮﻭﺵ ﺑﺮﻕ ﭘﺮﺩﺍﺧﺘﻨﺪ ﻛﻪ ﺍﻟﺒﺘﻪ ﺁﻥ ﺯﻣﺎﻥ ﺍﻳﻦ ﺗﺎﺳﻴﺴﺎﺕ ﺑﻪ ﺻﻮﺭﺕ ﻣﺠﺰﺍء ﺍﺯ ﻫﻢ ﻛﺎﺭ ﻣﻴﻜﺮﺩﻧﻨﺪ ﻭ ﺁﻥ ﺯﻣﺎﻥ ﻫﻨﻮﺯ ﻧﻴﺎﺯ
ﺑﻪ ﺷﺒﻜﻪ ﺷﺪﻥ ﺍﻳﻦ ﺗﺎﺳﻴﺴﺎﺕ ﺍﺣﺴﺎﺱ ﻧﻤﻲ ﺷﻮﺩ.ﺑﺎﻻﺧﺮﻩ ﺑﺮﻕ ﭘﺎ ﺑﻪ ﺧﺎﻧﻪ ﺧﺎﻣﻮﺵ ﻣﺮﺩﻡ ﮔﺬﺍﺷﺖ ﻭ ﺭﻭﺷﻨﺎﻳﻲ ﺑﺨﺶ ﺧﺎﻧﻪ ﻣﺮﺩﻡ ﺷﺪﻩ ﺩﺭ ﺳﺮﺍسر ﺟﻬﺎﻥ.
ﺍﻣﺎ ﻣﺸﻜﻼﺕ ﺩﺍﺷﺘﻦ ﺑﺮﻕ
ﺯﻣﺎﻧﻲ که اﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻭ ﺳﺎﻳﻞ ﺑﺮقی ﺍﻓﺰﺍﻳﺶ ﭘﻴﺪﺍ ﻛﻨﺪ ﺟﺮﻳﺎﻥ ﺯﻳﺎﺩﻱ ﺍﺯ ﺳﻴﻢ ﻫﺎﻱ ﺑﺮﻕ ﻋﺒﻮﺭ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺩﺭ ﻣﻮﺍﺟﻪ ﺑﺎ ﻣﻘﺎﻭﻣﺖ ﺳﻴﻢ
ﺑﺎﻋﺚ ﮔﺮﻡ ﺷــﺪﻥ ﻭ ﺩﺭ ﻧﻬﺎﻳﺖ ﺳــﻮﺧﺘﻦ ﺳــﻴﻢ ﻫﺎ ﻣﻨﺠﺮ ﻣﻲ ﺷــﻮﺩ ﮔﺎﻫﻲ ﻣﻤﻜﻦ ﺑﻮﺩ ﻛﻪ ﺧﺎﻧﻪ ﻫﺎ ﻧﻴﺰ ﺁﺗﺶ ﺑﮕﻴﺮﻧﺪ.،ﺑﻨﺎﺑﺮﺍﻳﻦ
ﺩﺍﻧ ﺸﻤﻨﺪﺍﻥ ﺍﻳﻦ ﺣﻮﺿﻪ ﻗﻄﻌﻪ ﺍﻱ ﺍﺧﺘﺮﺍﻉ ﻛﺮﺩﻥ ﻛﻪ ﻛﻪ ﺍﮔﺮ ﺟﺮﻳﺎﻥ ﻋﺒﻮﺭﻱ ﺍﺯ ﻣﺪﺍﺭ ﺯﻳﺎﺩ ﺑ ﺸﻮﺩ ﻣﺪﺍﺭ ﺭﺍ ﺑﺎﺯ ﻛﻨﺪ ﻭ ﺍﺟﺎﺯﻩ ﻋﺒﻮﺭ
ﺟﺮﻳﺎﻥ ﺭﺍ ﻗﻄﻊ ﻛﻨﺪ ﻗﻄﻌﻪ ﺍﻱ ﻛﻪ ﺍﺧﺘﺮﺍﻉ ﺷﺪ ﻓﻴﻮﺯ ﻧﺎﻡ ﮔﺮﻓﺖ.
ﻓﻴﻮﺯ
ﺍﺟﺎﺯ ﺑﺪﻳﻦ ﺍﺯ ﺗﻌﺮﻳﻒ ﻭﻳﻜﻲ ﭘﺪﻳﺎ ﺍﺳﺘﻔﺎﺩﻩ ﻛﻨﻴﻢ:
ﺩﺭ ﺍﻟﻜﺘﺮﻭﻧﻴﻚ ﻭ ﻣﻬﻨﺪﺳـﻲ ﺑﺮﻕ ، ﻓﻴﻮﺯ ﻭﺳـﻴﻠﻪﺍﻱ ﺍﺳـﺖ ﻛﻪ ﻣﺪﺍﺭﻫﺎﻱ ﺍﻟﻜﺘﺮﻳﻜﻲ ﺭﺍ ﺩﺭ ﺑﺮﺍﺑﺮ ﺟﺮﻳﺎﻥ ﻏﻴﺮﻣﺠﺎﺯ ﺍﻟﻜﺘﺮﻳﻜﻲ ﻣﺤﺎﻓﻈﺖ
ﻣﻲﻛﻨﺪ. ﺍﮔﺮ ﺟﺮﻳﺎﻧﻲ ﺑﻴﺶ ﺍﺯ ﺟﺮﻳﺎﻥ ﻧﺎﻣﻲ ﺍﺯ ﻓﻴﻮﺯ ﺑﮕﺬﺭﺩ ﻓﻴﻮﺯ ﻣﻲ ﺳﻮﺯﺩ ﻭ ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﺟﺮﻳﺎﻥ ﺍﻟﻜﺘﺮﻳﻜﻲ ، ﻗﻄﻊ ﺧﻮﺍﻫﺪ ﺷﺪ. ﺑﻪ
ﻋﺒﺎﺭﺕ ﺳــﺎﺩﻩ، ﻓﻴﻮﺯ ﻭﺳــﻴﻠﻪﺍﻱ ﺣﻔﺎﻇﺘﻲ ﺍﺳــﺖ ﻛﻪ ﺩﺭ ﺗﺠﻬﻴﺰﺍﺕ ﻭ ﻣﺪﺍﺭﺍﺕ ﺍﻟﻜﺘﺮﻳﻜﻲ ﺑﻪ ﻛﺎﺭ ﻣﻲﺭﻭﺩ ﺗﺎ ﺩﺭ ﻣﻮﺍﻗﻌﻲ ﻛﻪ ﺟﺮﻳﺎﻧﻲ
ﺑﻴﺸﺘﺮ ﺍﺯ ﺣﺪ ﻣﺠﺎﺯ ﺍﺯ ﻭﺳﻴﻠﻪ ﻋﺒﻮﺭ ﻣﻲﻛﻨﺪ، ﺑﺎ ﺳﻮﺧﺘﻦ ﻓﻴﻮﺯ ﻣﺪﺍﺭ ﻗﻄﻊ ﺷﻮﺩ ﺗﺎ ﺗﺠﻬﻴﺰﺍﺕ ﺩﻳﮕﺮ ﺁﺳﻴﺒﻲ ﻧﺒﻴﻨﻨﺪ. ﺍﻳﻦ ﻭﺳﻴﻠﻪ ﺍﻭﻟﻴﻦ
ﺑﺎﺭ ﺗﻮﺳﻂ ﺗﻮﻣﺎﺱ ﺍﺩﻳﺴﻮﻥ ﺩﺭ ﺳﺎﻝ ۱۸۹۰ ﻣﻴﻼﺩﻱ ﺛﺒﺖ ﺍﺧﺘﺮﺍﻉ ﺷﺪﻩﺍﺳﺖ.
ﺍﻣﺎ ﻣﺸﻜﻼﺕ ﻓﻴﻮﺯ:
1. ﭼﻮﻥ ﻭﻟﺘﺎﮊ ﺑﺮﻕ ﺩﺭ ﻫﺮ ﻛﺸﻮﺭ ﻣﺘﻔﺎﻭﺕ ﺑﻮﺩ ﻓﻴﻮﺯﻫﺎ ﺷﻤﺎﺭﻩ ﻫﺎﻱ ﻣﺨﺘﻠﻔﻲ ﺩﺍﺷﺘﻦ ﻭ ﺑﻬﻢ
ﻧﻤﻲ ﺧﻮﺭﺩﻧﺪ
2. ﺍﮔﺮ ﻣﻲ ﺳﻮﺧﺘﻦ ﺑﺎﻳﺪ ﺁﻧﻬﺎ ﺭﺍ ﻋﻮﺽ ﻣﻲ ﻛﺮﺩﻳﻢ ﻭ ﺑﺎﻳﺪ ﻓﻴﻮﺯ ﺟﺪﻳﺪﻱ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﻛﺮﺩﻳﻢ
Circuit Breaker Pattern
ﺑﺎ ﺍﻳﻦ ﻣ ﺸﻜﻼﺕ ﻛﻪ ﻓﻴﻮﺯ ﺩﺍ ﺷﺖ ﻭ ﺳﻴﻠﻪ ﺍﻱ ﺑﻪ ﻧﺎﻡ circuit breaker ﺍﺧﺮﺍﻉ ﺷﺪﻩ ﻛﻪ ﻫ ﻤﺎﻧ ﻨﺪ ﻓﻴﻮﺯ ﺍﮔﺮ ﺟﺮ ﻳﺎﻥ ﺯ ﻳﺎﺩﻱ ﺍﺯ ﻣﺪﺍﺭ ﻋﺒﻮﺭ ﻣﻲ ﻛﺮﺩ ﻣﺪﺍﺭ ﺭﺍ ﺑﻪ ﺻــﻮﺭﺕ ﺍﺗﻮﻣﺎﺗ ﻴﻚ ﻗﻄﻊ ﻣﻲ ﻛ ﻨﺪ ﻭ ﺍ ﺟﺎﺯﻩ ﻋﺒﻮﺭ ﺟﺮ ﻳﺎﻥ ﺭﺍ ﺑﻪ ﻣﺪﺍﺭ ﻧﻤﻲ ﺩﻫﺪ ﻭ ﻫﻤﭽﻨﻴﻦ ﺑﺮﻋﻜﺲ ﻓﻴﻮﺯ ﻛﻪ ﺍﮔﺮ ﻣﻲ ﺳﻮﺧﺖ ﻭ ﻧﻴﺎﺯ ﺑﻪ ﺗﻌﻮﻳﺾ ﺁﻥ ﻧﺒﻮﺩ ﺑﻠﻜﻪ ﺍﻳﻦ ﻗﻄﻌﻪ ﺑﻪ ﺻﻮﺭﺕ ﻫﻮﺷﻤﻨﺪ ﺍﮔﺮ ﺟﺮﻳﺎﻥ ﻋﺒﻮﺭﻱ ﺍﺯ ﺁﻥ ﺍﺯ ﺁﺳﺘﺎﻧﻪ ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﻭ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﻋﺒﻮﺭ ﻣﻲ ﻛﺮﺩ ﺑﻪ ﺻﻮﺭﺕ ﺧﻮﺩﻛﺎﺭ ﺟﺮﻳﺎﻥ ﻣﺪﺍﺭﺍ ﺭﺍ ﻗﻄﻊ ﻛﺮﺩﻩ ﻭ ﻣﺪﺍﺭﺍ ﺭﺍ ﺩﺭ ﺣﺎﻟﺖ Open ﻗﺮﺍﺭ ﻣﻲ ﺩﺍﺩ ﻭ ﺑﻌﺪ ﺍﺯ ﺯﻣﺎﻧﻲ ﺩﻭﺑﺎﺭﻩ ﻣﺪﺍﺭﺍ ﺭﺍ close ﻛﺮﺩﻩ ﻭ ﺍﺟﺎﺯﻩ ﻋﺒﻮﺭ ﺟﺮﻳﺎﻥ ﺭﺍ ﻣﻲ ﺩﻫﺪ ﻭ ﺍﮔﺮ ﺑﺎﺯ ﻫﻢ ﺟﺮﻳﺎﻥ ﻋﺒﻮﺭ ﺑﻴﺶ ﺍﺯ ﺣﺪ ﺗﻌﻴﻴﻦ ﺷـﺪﻩ ﺑﺎﺷـﺪ ﻣﺪﺍﺭ ﺭﺍ ﺑﺎﺯ ﻣﻲ ﻛﻨﺪ ﺩﺭ ﻏﻴﺮ ﺍﻳﻨﺼﻮﺭﺕ ﺍﮔﺮ ﻫﻤﻪ ﭼﻴﺰ ﻃﺒﻴﻌﻲ ﺑﻮﺩ ﻣﺪﺍﺭﺍ ﺭﺍ ﺑ ﺴﺘﻪ ﻭ ﺍﺟﺎﺯﻩ ﻋﺒﻮﺭ ﺟﺮﻳﺎﻥ ﺭﺍ ﺑﻪ ﺣﺎﻟﺖ ﻃﺒﻴﻌﻲ ﻣﻲ ﺩﻫﺪ ﻭﺿﻌﻴﺖ ( Half State)
Circuit Breaker in Software
ﺣﺎﻻ ﺑﺒﻴﻨﻴﻢ ﺍﻳﻦ pattern ﺩﺭ ﻧﺮﻡ ﺍﻓﺰﺍﺭ ﻛﺠﺎ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩ:
ﺩﺭ ﺩﻧﻴﺎﻱ ﺍﻣﺮﻭﺯ ﻧﺮﻡ ﺍﻓﺰﺍﺭ، ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺑﺰﺭﮔﻲ ﻭ ﭘﻴﭽﻴﺪﮔﻲ ﺳﻴﺴﺘﻢ ﻫﺎ ﻭ ﻫﻤﭽﻨﻴﻦ ﺩﻧﻴﺎﻳﻲ ﺳﺮﻭﻳﺲ ﮔﺮﺍﻳﻲ ﺍﻳﻦ ﻣﺴﻠﻪ ﺑﺴﻴﺎﺭ
ﻃﺒﻴﻌﻲ ﺍﺳﺖ ﻛﻪ ﺳﻴﺴﺘﻢ ﺷﻤﺎ ﻧﻴﺎﺯﻣﻨﺪ ﺑﻪ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺳﺮﻭﻳﺲ ﻫﺎﻱ ﺍﺯ ﺳﻴﺴﺘﻢ ﺩﻳﮕﺮ ﺑﻪ ﺻﻮﺭﺕ remote call ﺑﺎﺷﺪ.
ﻫﺮ ﮔﺎﻩ ﻛﻪ ﺳﻴﺴﺘﻢ ﺷﻤﺎ ﻣﺠﺒﻮﺭ ﺑﻪ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺳﺮﻭﻳﺴﻲ ﺍﺯ ﺳﻴﺴﺘﻤﻲ ﺩﻳﮕﺮ ﻣﻲ ﺑﺎﺷﺪ ﻧﻘﻄﻌﻪ ﺍﻱ ﺑﺮﺍﻱ ﻣﺮﮒ ﺳﻴﺴﺘﻢ ﺧﻮﺩﺗﺎﻥ ﺑﻪ
ﻭﺟﻮﺩ ﻣﻲ ﺁﻭﺭﻳﺪ ﺍﮔﺮ ﺩﻗﺖ ﻧﻜﻨﻴﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻣﻲ ﻛﻨﻴﺪ.
ﺗﻔﺎﻭﺕ ﺍﺳــﺎﺳــﻲ ﺑﻴﻦ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺑﺼــﻮﺭﺕ in-memory ﻭ remote ﻭﺟﻮﺩ ﺩﺍﺭﺩ . ﺯﻣﺎﻧﻲ ﻛﻪ ﺷــﻤﺎ ﺳــﺮﻭﻳﺲ ﺭﻭ ﺑﺼــﻮﺭﺕ
remote ﻓﺮﺍﺧﻮﺍﻧﻲ ﻣﻲ ﻛﻨﻴﺪ ﻣﻤﻜﻦ ﺍﺳﺖ ﻧﺘﻴﺠﻪ ﺍﻳﻦ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺷﻤﺎ fail ﺑﺸﻮﺩ ﻭ ﻳﺎ ﺣﺘﻲ ﻣﻤﻜﻦ ﺍ ﺳﺖ ﺳﻴﺴﺘﻤﻲ ﻛﻪ ﺷﻤﺎ
ﺳﺮﻭﻳﺲ ﺁﻥ ﺭﺍ ﻓﺮﺍﺧﻮﺍﻧﻲ ﻛﺮﺩﻩ ﺍﻳﺪ ﺩﭼﺎﺭ ﻣﺸﻜﻞ ﺑﻮﺩﻩ ﻭ ﺑﻪ ﺷﻤﺎ ﭘﺎﺳﺨﻲ ﻧﺪﻫﺪ (ﻣﺜﻼ ﺳﻴﺴﺘﻢ ﻣﺬﻛﻮﺭ ﺧﻴﻠﻲ ﺷﻠﻮﻍ ﺑﻮﺩﻩ ﻭ ﻳﺎ
ﺩﭼﺎﺭ ﻣﺸﻜﻞ ﺑﺎﺷﺪ)ﺩﺭ ﺍﻳﻦ ﺻﻮﺭﺕ ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﻨﺘﻈﺮ ﺑﻤﺎﻧﻴﺪ ﺗﺎ ﺑﻪ ﺧﻄﺎﻱ timeout ﺑﺮﺑﺨﻮﺭﻳﺪ.ﻣﺸﻜﻞ ﺑﺎ ﺍﻳﻨﮕﻮﻧﻪ ﻭﺿﻌﻴﺖ ﻫﺎ
ﺩﺭ ﺍﻳﻦ ﺍ ﺳﺖ ﺍﮔﺮ ﺳﻴﺴﺘﻢ ﺷﻤﺎ ﺑﻄﻮﺭ ﺧﻴﻠﻲ ﺯﻳﺎﺩﻱ ﺍﻳﻦ ﺳﺮﻭﻳﺲ ﺭﻭ ﻓﺮﺍﺧﻮﺍﻧﻲ ﻣﻴﻜﻨﺪ ﻭ ﺳﻴﺴﺘﻢ ﻣﻮﺭﺩ ﺩﺭ ﻧﻈﺮ ﺩﺭ ﻭ ﺿﻌﻴﺘﻲ
ﺑﺎﺷﺪ ﻛﻪ ﻧﺘﻮﺍﻧﺪ ﭘﺎﺳﺦ ﺷﻤﺎ ﺭﺍ ﺑﺪﻩ ﺷﻤﺎ ﺩﭼﺎﺭ ﻛﻤﺒﻮﺩ ﻣﻨﺎﺑﻊ ﺧﻮﺍﻫﻴﺪ ﺷﺪﻩ ﺑﻪ ﺍﻳﻦ ﺩﻟﻴﻞ ﻛﻪ ﻣﻨﺎﺑﻊ ( thread ) ﻫﺎﻱ ﺷﻤﺎ ﻣﻨﺘﻈﺮ
ﭘﺎﺳﺦ ﺍﺯ ﺳﻮﻱ ﺳﺮﻭﻳﺲ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺷﺪﻩ ﻫﺴﺘﻨﺪ ﻭ ﭼﻮﻥ ﭘﺎﺳﺨﻲ ﺩﺭﻳﺎﻓﺖ ﻧﻤﻲ ﻛﻨﻴﻢ ﺗﺎ timeout ﺷﺪﻥ ﻭ ﺭﻫﺎ ﺷﺪﻥ ﺁﻥ
thread ﺑﺎﻳﺪ ﺻــﺒﺮ ﻛﺮﺩ ﺩﺭ ﺍﻳﻦ ﻓﺎﺻــﻠﻪ ﺍﮔﺮ ﻫﻤﻪ thread ﻣﺎ ﺩﺭﮔﻴﺮ ﺁﻥ ﺳــﺮﻭﻳﺲ ﺑﺎﺷــﻨﺪ ﻭ thread pool ﻣﺎ thread
ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ ﻛﻪ ﺑﻪ ﺩﺭﺧﻮﺍﺳﺖ ﺟﺪﻳﺪ ﺍﺧﺘﺼﺎﺹ ﺑﺪﻫﺪ / oops ﻣﺎ ﺍﺯ ﻛﺎﺭ ﺍﻓﺘﺎﺩﻳﻢ.ﺑﺨﺎﻃﺮ ﺑﺨﺸﻲ ﺍﺯ ﺳﻴﺴﺘﻢ ،ﻣﺎ ﻛﻞ ﺳﻴﺴﺘﻢ ﺭﺍ
ﺍﺯ ﺩﺳﺖ ﺩﺍﺩﻳﻢ.
ﺑﮕﺬﺍﺭﻳﺪ ﺑﺎ ﻳﻚ ﻣﺜﺎﻝ ﺍﺩﺍﻣﻪ ﺩﻫﻴﻢ :
ﺩﺭﺯﻣﺎﻥ ﻫﺎﻱ ﺑﺴﻴﺎﺭ ﻗﺪﻳﻢ ﻭ ﺩﻭﺭ ﻣﻦ ﺳﻴﺴﺘﻤﻲ ﻧﻮ ﺷﺘﻪ ﺑﻮﺩﻡ ﺑﺼﻮﺭﺕ ﺷﺨﺼﻲ ﻛﻪ ﺳﺮﻭﻳﺴﻲ ﺍﺯ ﺷﺮﻛﺘﻲ ﺩﻳﮕﺮﻱ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ
ﻛﺮﺩ ﻛﻪ ﻛﻞ ﺳﻴﺴﺘﻢ ﺑﺪﻭﻥ ﻣﺸﻜﻞ ﺩﺭﺧوﺍﺳﺖ ﻫﺎﻱ ﻛﺎﺭﺑﺮﺍﻥ ﺭﺍ ﺩﺭ ﺯﻣﺎﻥ ﻣﻨﺎ ﺳﺐ ﭘﺎﺳﺨﮕﻮ ﺑﻮﺩ ﺗﺎ ﺍﻳﻦ ﻛﻪ ﻧﺎﮔﻬﺎﻥ ﻛﻪ ﺩﺭ ﺍﺑﺰﺍﺭ
ﻣﺎﻧﺘﻴﻮﺭﻳﻨﮓ ﺳﻴﺴﺘﻢ ﻫﻤﻪ ﭼﻴﺰ ﻧﺎﮔﻬﺎﻥ ﻗﺮﻣﺰ ﻭ ﺳﻴﺴﺘﻢ ﺩﭼﺎﺭ ﺍﺧﺘﻼﻝ ﻋﺠﻴﺒﻲ ﺷﺪ ﻭ ﻛﻞ ﺳﻴﺴﺘﻢ ( Cascading failure ) ﺷﺪ ،ﻭ
ﻛﻞ ﻧﺮﻡ ﺍﻓﺰﺍﺭ ﻣﺎ ﺍﺯﺳﻴﺴﺘﻢ ﺧﺎﺭﺝ ﺷﺪ ﻣﺸﻜﻞ ﻛﺠﺎ ﺑﻮﺩ؟ﺑﻌﺪ ﺍﺯ ﺍﻳﻨﻜﻪ ﺑﻪ ﺑﺮﺭﺳﻲ ﻣﺸﻜﻞ ﺭﺳﻴﺪﻡ ﺑﺴﻴﺎﺭ ﺟﺎﻟﺐ ﺑﻮﺩ ﻛﻪ ﺗﻤﺎﻣﻲ ﺍﻳﻦ
ﻣﺸﻜﻞ ﺍﺯ ﺻﺪﺍ ﺯﺩﻥ ﺳﺮﻭﻳﺲ ﺷﺮﻛﺘﻲ ﺑﻮﺩ ﻛﻪ ﻣﺎ ﺍﺳﺘﻔﺎﺩﻩ ﻛﺮﺩﻩ ﺑﻮﺩﻳﻢ ﺭﺥ ﺩﺍﺩﻩ ﺑﻮﺩ . ﺑﻪ ﺍﻳﻦ ﺩﻟﻴﻞ ﻛﻪ ﺩﺭ ﺳﻴﺴﺘﻢ ﺷﺮﻛﺖ
ﻣﺬﻛﻮﺭ ﭘﺎﺳﺦ ﺭﺍ ﺩﺭﻳﺎﻓﺖ ﻧﻤﻲ ﻛﺮﺩﻳﻢ ﻭ ﺗﻤﺎﻣﻲ thread ﻫﺎﻱ ﻣﺎ ﺩﺭ timeout ﻓﺮﺍﺧﻮﺍﻧﻲ ﺍﻳﻦ ﺳﺮﻭﻳﺲ ﺩﺭﮔﻴﺮ ﻛﺮﺩﻩ ﺑﻮﺩﻥ ﻭ
ﺩﺭ ﺍﻳﻦ ﻓﺎﺻﻠﻪ ﺩﺭﺧﻮﺍﺳﺖ ﻫﺎﻱ ﺟﺪﻳﺪ ﻭﺍﺭﺩ سیستم ﺷﺪﻩ ﺑﻮﺩ ﻛﻪ ﺳﻴﺴﺘﻢ ﻣﺎ ﻗﺎﺩﺭ ﺑﻪ ﭘﺎ ﺳﺨﮕﻮﻳﻲ ﻧﻴﻮﺩ ﺑﻨﺎﺑﺮﺍﻳﻦ ﺳﻴﺴﺘﻢ ﻣﺎ ﺑﻪ
ﺩﻟﻴﻞ ﻧﺒﻮﺩﻥ ﻣﻨﺎﺑﻊ ﺩﭼﺎﺭ ﻣﺸﻜﻞ ﺷﺪﻩ ﻭ ﺍﺯ ﻣﺪﺍﺭ ﺧﺎﺭﺝ ﺷﺪﻩ. . ﻭﺳﻴﺴﺘﻢ ﺭﺍ ﺍﺯ ﺩﺳﺖ ﺩﺍﺩﻳﻢ..
ﺑﺨﺎﻃﺮ ﺑﺨﺸﻲ ﺍﺯ ﺳﻴﺴﺘﻢ ﻣﺎ ﻛﻞ ﺳﻴﺴﺘﻢ ﺭﺍ Fail ﻛﺮﺩﻳﻢ.
ﺭﺍﻩ ﺣﻞ ؟
ﺍﮔﺮ ﻣﺎ ﺍﺯ Circuit breaker ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﻛﺮﺩﻳﻢ ﺑﻪ ﺍﻳﻦ ﻣﺸﻜﻞ ﻧﻤﻲ ﺧﻮﺭﺩﻳﻢ.
ﺍﻳﺪﻩ ﺍﻳﻦ Pattern ﺑﺴﻴﺎﺭ ﺳﺎﺩﻩ ﺍﺳﺖ ﻣﺎ ﻻﻳﻪ ﺍﻱ ﺑﺎ ﻧﺎﻡ Circuit Breaker ﺑﺮﺭﻭﻱ ﻣﺎﮊﻭﻟﻲ ﻛﻪ ﻧﻘﻄﻪ ﺍﺗﺼﺎﻝ ﺑﻪ ﻣﺎ ﺩﻧﻴﺎﻳﻲ ﺑﻴﺮﻭﻥ
ﺍﺳﺖ ( wrap ) ﻣﻲ ﻛﻨﻴﻢ ﻭ ﺍﻳﻦ ﻻﻳﻪ ﺑﺎ ﻣﺎﻧﻴﺘﻮﺭ ﻛﺮﺩﻥ ﻓﺮﺍﻳﻨﺪ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺳﺮﻭﻳﺲ ﻫﺎ ﺑﺼﻮﺭﺕ ﺯﻳﺮ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ
.1. ﺑﻪ ﺻﻮﺭﺕ ﭘﻴﻮﺳﺘﻪ ﻭﺿﻌﻴﺖ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺳﺮﻭﻳﺲ ﻫﺎ ﺭﺍ ﻣﺎﻧﻴﺘﻮﺭ ﻣﻲ ﻛﻨﻴﻢ ﺍﮔﺮ ﻭﺿﻌﻴﺖ ﺳﻴﺴﺘﻢ ﻓﺮﺍﺧﻮﻧﻲ ﺷﺪﻩ ﻭ ﺗﻌﺪﺍﺩ
Fail ﻫﺎﻱ ﻣﺎ ﺍﺯ ﺣﺪ ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﮔﺬﺷﺖ ﺍﻳﻦ ﻻﻳﻪ ﺑﺼﻮﺭﺕ ﺍﺗﻮﻣﺎﺗﻴﻚ ﺍﺟﺎﺯﻩ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺳﺮﻭﻳﺲ ﻫﺎ ﺭﺍ ﻧﻤﻲ ﺩﻫﺪ ﻭ ﭘﻴﺎﻣﻲ
ﺧﻄﺎ ﺻﺎﺩﺭ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺳﻴﺴﺘﻢ ﻣﺬﻛﻮﺭ ﺍﻣﻜﺎﻥ ﭘﺎﺳﺨﮕﻮﻱ ﺑﻪ ﻣﺎ ﺭﺍ ﻧﺪﺍﺭﺩ ﻭ ﺩﺭ ﻭﺍﻗﻊ ﻣﺪﺍﺭ ﺭﺍ ﺑﻪ ﺣﺎﻟﺖ open ﺗﻐﻴﻴﺮ ﻣﻲ
ﺩﻫﺪ ﺩﺭ ﺍﻳﻦ ﺻﻮﺭﺕ ﺩﻳﮕﺮ Thread ﻣﺎ ﺗﺎ ﺯﻣﺎﻥ timeout ﺩﺭﮔﻴﺮ ﻧﺨﻮﺍﻫﻨﺪ ﺑﻮﺩ ﺑﺪﻳﻦ ﺻﻮﺭﺕ ﺑﺨﺸﻲ ﺍﺯ ﺳﻴﺴﺘﻢ ﻣﺎ
ﺩﭼﺎﺭ ﻣﺸﻜﻞ ﻣﻲ ﺷﻮﺩ ﻧﻪ ﻛﻞ ﺳﻴﺴﺘﻢ.ﺩﺭ ﻭﺍﻗﻊ ﺩﺭ ﻭﺿﻌﻴﺖ Open ﺷﺪﻥ ﻗﺮﺍﺭ ﺧﻮﺍﻫﻴﻢ ﮔﺮﻓﺖ.ﻭ ﻣﺪﺍﺭ ﺑﺎﺯ ﺍﺳﺖ ﻭ
ﺟﺮﻳﺎﻧﻲ ﺍﺯ ﺁﻥ ﻋﺒﻮﺭ ﻧﺨﻮﺍﻫﺪ ﻛﺮﺩ ﻭ ﺳﺮﻭﻳﺲ ﻓﺮﺍﺧﻮﺍﻧﻲ ﻧﻤﻲ ﺷﻮﺩ .
2. ﺩﺭ ﻣﺮﺣﻠﻪ ﺑﻌﺪ ﻻﻳﻪ Circuit breaker ﺍﺟﺎﺯﻩ ﻣﻲ ﺩﻫﺪ ﻛﻪ ﺩﻭﺑﺎﺭ ﺍﻳﻦ ﺳﺮﻭﻳﺲ ﺻﺪﺍ ﺯﺩﻩ ﺷﻮﺩ ﺍﮔﺮ ﺩﻭﺑﺎﺭﻩ ﻣﺎ ﺑﻪ
ﻣﺸﻜﻞ ﺧﻮﺭﺩﻳﻢ ﺑﺎﺯ ﻣﺪﺍﺭ ﺭﺍ ﺩﺭ ﺣﺎﻟﺖ ﺑﺎﺯ (open) ﻗﺮﺍﺭ ﺧﻮﺍﻫﺪ ﺩﺍﺩ ﻭ ﺍﮔﺮ ﻣﺸﻜﻞ ﻧﺒﻮﺩ ﻣﺪﺍﺭ ﺭﺍ ﺩﺭ ﺣﺎﻟﺖ ﺑﺴﺘﻪ ﻳﺎ
( close ) ﻗﺮﺍﺭ ﺧﻮﺍﻫﺪ ﺩﺍﺩ ﻭ ﺻﺪﺍ ﺯﺩﻥ ﺍﻳﻦ ﺳﺮﻭﻳﺲ ﻣﻲ ﺗﻮﺍﻧﺪ ﺑﻪ ﺻﻮﺭﺕ ﻋﺎﺩﻱ ﺍﻧﺠﺎﻡ ﺑﭙﺬﻳﺮﺩ ﻭﻟﻲ ﺍﮔﺮ ﺑﺎﺯ ﺩﭼﺎﺭ ﻣﺸﻜﻞ
ﺑﻮﺩ ﻣﺪﺍﺭ ﺭﺍ ﻣﺠﺪﺩﺍ ﺑﻪ ﺣﺎﻟﺖ Open ﺗﻐﻴﻴﺮ ﻭﺿﻌﻴﺖ ﺧﻮﺍﻫﺪ ﺩﺍﺩ ﺗﺎ ﺯﻣﺎﻧﻲ ﻛﻪ ﺑﻪ ﺣﺎﻟﺖ close ﺑﺮﺳﻴﻢ ﻣﺎ ﺍﻳﻨﻜﺎﺭ ﺭﺍ
ﺍﺩﺍﻣﻪ ﺧﻮﺍﻫﻴﻢ ﺩﺍﺩ ﺑﻪ ﺍﻳﻦ ﻭﺿﻌﻴﺖ ﻛﻪ ﻣﺎ ﭼﻚ ﻛﻨﻴﻢ ﻭ ﺣﺎﻟﺖ ﻫﺎ ﺭﺍ ﺑﺮﺭﺳﻲ ﻣﻴﻜﻨﻴﻢ ﻭﺿﻌﻴﺖ Half open ﻣﻲ ﮔﻮﻳﻴﻢ.
ﺑﻨﺎﺑﺮﺍﻳﻦ ﻣﺎ ﺳﻪ ﻭﺿﻌﻴﺖ ﺩﺍﺭﻳﻢ:
1.( Close ﻫﻤﻪ ﭼﻴﺰ ﺑﺪﻭﻥ ﻣﺸﻜﻞ ﺩﺭ ﺣﺎﻝ ﻛﺎﺭ ﺍﺳﺖ ﻭ Circuit breaker ﺍﺟﺎﺭﻩ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺳﺮﻭﻳﺲ ﻫﺎ ﺭﺍ ﻣﻲ ﺩﻫﺪ.)
2.( open ﺍﮔﺮ ﺗﻌﺪﺍﺩ fail ﻫﺎﻱ ﻣﺎ ﺍﺯ ﻳﻚ ﺳﻄﺞ ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﮔﺬﺷﺖ ﻭ ﻣﺎ ﺑﻪ ﻭﺿﻌﻴﺖ Open ﻣﻲ ﺭﻭﻳﻢ ﺩﺭ ﺍﻳﻦ ﻭﺿﻌﻴﺖ ﻫﺮ
Request ﻛﻪ ﻗﺼﺪ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺳﺮﻭﻳﺲ ﻣﻮﺭﺩ ﻧﻈﺮ ﺭﺍ ﺩﺍﺭﺩ Circuit Breaker ﺍﺟﺎﺯﻩ ﻧﺪﺍﺩﻩ ﻭ ﭘﻴﺎﻡ ﺧﻄﺎﻳﻲ ﻣﺒﻨﻲ ﺑﺮ ﺍﻳﻦ ﻛﻪ
ﺍﻳﻦ ﺳﺮﻭﻳﺲ ﺩﺭ ﺩﺳﺘﺮﺱ ﻧﻤﻲ ﺑﺎﺷﺪ ﺭﺍ ﺻﺎﺩﺭ ﻣﻲ ﻛﻨﺪ ﻭ ﺩﻳﮕﺮ ﻻﺯﻡ ﻧﻴﺴﺖ ﺁﻥ Thread ﺗﺎ ﺯﻣﺎﻥ Timeout ﺷﺪﻥ ﺭﺍ ﻧﮕﻪ
ﺩﺍﺭﻳﻢ ﺑﻠﻜﻪ ﺑﻪ ﺳﺮﻋﺖ ﭘﺎﺳﺦ ﺩﺍﺩﻩ ﻭ ﻣﺎ ﻣﻨﺎﺑﻊ ﺧﻮﺩ ﺭﺍ ﺍﺯ ﺩﺳﺖ ﻧﺨﻮﺍﻫﻴﻢ(ﺍﻟﺒﺘﻪ Biz ﺷﻤﺎ ﺑﺎﻳﺪ ﺍﻳﻦ ﭘﻴﺎﻡ ﺧﻄﺎ ﺭﺍ ﻣﺪﻳﺮﻳﺖ ﻛﻨﺪ)
3.( Half Close ﺩﺭ ﺍﻳﻦ ﻭﺿﻌﻴﺖ ﻛﻪ ﺍﺯ ﻭﺿﻌﻴﺖ Open ﺑﻪ ﺁﻥ ﺳﻮﻳﺞ ﻣﻲ ﻛﻨﻴﻢ ﺍﺟﺎﺯﻩ ﻣﻲ ﺩﻫﻴﻢ ﻛﻪ ﺑﺎﺭ ﺩﻳﮕﺮ ﺍﻳﻦ ﺳﺮﻭﻳﺲ
ﺻﺪﺍ ﺯﺩﻩ ﺷﻮﺩ ﺍﮔﺮ ﺑﺎﺯ ﺩﺭ ﺯﻣﺎﻥ ﻣﻨﺎﺳﺐ ﭘﺎﺳﺨﮕﻮ ﻧﺒﺎﺷﺪ ﻭ ﻳﺎ ﭘﺎﺳﺨﻲ ﺩﺭﻳﺎﻓﺖ ﻧﮕﺮﺩﺩ ﻭ ﻣﺠﺪﺩﺍ ﺑﻪ ﻭﺿﻌﻴﺖ Open ﺑﺎﺯ ﺧﻮﺍﻫﻴﻢ
ﺑﺮﮔﺸﺖ ﺩﺭ ﻏﻴﺮ ﺍﻳﻨﺼﻮﺭﺕ ﺍﮔﺮ ﻭﺿﻌﻴﺖ ﺑﻪ ﺣﺎﻟﺖ ﻃﺒﻴﻌﻲ ﺑﺮﮔﺸﺘﻪ ﺑﻮﺩ ﻣﺎ ﺑﻪ ﻭﺿﻌﻴﺖ Close ﺭﻓﺘﻪ ﻭ ﺍﺟﺎﺯﻩ ﻣﻲ ﺩﻫﻴﻢ ﺩﻭﺑﺎﺭﻩ
ﻫﻤﻪ ﭼﻴﺰ ﺑﻪ ﺣﺎﻟﺖ ﻃﺒﻴﻌﻲ ﺑﺎﺯ ﮔﺮﺩﺩ.)
ﻣﻮﺍﺭﺩﻱ ﻛﻪ ﺑﺎﻳﺪ ﺩﺭ ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ:
1. ﺍﮔﺮ ﻛﺪ ﺷﻤﺎ ﺭﺍ ﭘﻴﭽﻴﺪﻩ ﻣﻲ ﻛﻨﺪ ﻭ ﻳﺎ ﺗﻮﺍﻧﺎﻳﻲ ﺩﺭﺳﺖ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺭﺍ ﻧﺪﺍﺭﻳﺪ ﺍﻧﺠﺎﻡ ﻧﺪﻫﻴﺪ.
2. ﺣﺘﻤﺎ ﻳﻪ ﺍﺑﺰﺍﺭ ﻣﺎﻧﻴﺘﻮﺭﻳﻨﮓ ﺑﺮﺍﻱ ﻣﺎﻧﻴﺘﻮﺭ ﻛﺮﺩﻥ Circuit breaker ﺧﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ ﻛﻪ ﺑﺘﻮﺍﻧﻴﺪ ﻭﺿﻌﻴﺖ ﺁﻥ ﺭﺍ ﻣﺪﻳﺮﻳﺖ
ﻛﻨﻴﺪ
3. ﺣﺘﻤﺎ ﺧﻄﺎ ﻫﺎﻱ ﻛﻪ Circuit breaker ﻣﻲ ﻫﺪ ﺑﺎﻳﺪ ﻛﺪﻫﺎﻱ ﻣﺮﺑﻮﻁ ﺑﻪ Biz ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺪﻳﺮﻳﺖ ﻛﻨﺪ.
ﭘﺎﻳﺎﻥ
ﺩﻭﺳﺘﺎﻥ ﺧﻮﺑﻢ ﺍﻣﻴﺪﻭﺍﺭﻡ ﻟﺬﺕ ﺑﺮﺩﻩ ﺑﺎﺷﻴﻦ ﻭ ﺧﻮﺷﺤﺎﻝ ﻣﻴﺸﻢ ﻛﻪ ﺩﺭ ﺍﻳﻦ ﻣﻮﺭﺩ ﺑﺎ ﻫﻢ ﺩﺍﻧﺸﻤﻮﻥ ﺭﻭ ﺑﻪ ﺍﺷﺘﺮﺍﻙ ﺑﮕﺬﺍﺭﻳﻢ:
ﻣﻨﺒﻊ: