-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
58 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
--- | ||
github: "true" | ||
--- | ||
|
||
|
||
**پیمان:** توی سرویس درخواست سفر اوبر، وقتی کاربر درخواست سفر میده، ما باید به سرویس تخصیص راننده درخواست بزنیم. ولی گاهی اوقات این سرویس از کار میافته یا خیلی کند جواب میده. این باعث میشه که کاربرها منتظر بمونن و تجربه کاربری خراب بشه. نمیدونم چطور میتونیم این مشکل رو حل کنیم. | ||
|
||
**حسین:** سلام پیمان، مرسی که مشکل رو مطرح کردی. من فکر میکنم اینجا میتونیم از الگوی Circuit Breaker استفاده کنیم. این الگو به ما کمک میکنه تا وقتی که سرور به مشکل میخوره، به جای اینکه درخواستها رو ادامه بدیم، به صورت موقت درخواستها رو قطع کنیم تا سرور بتونه به حالت عادی برگرده. 🔗[Circuit Breaker](https://martinfowler.com/bliki/CircuitBreaker.html) | ||
|
||
**مارال:** حسین، میتونی بیشتر توضیح بدی که چطور این الگو کار میکنه؟ 🤓 | ||
|
||
**حسین:** بله، حتماً. Circuit Breaker به این صورت کار میکنه که وقتی تعداد مشخصی از درخواستها با خطا مواجه میشن، مدار رو قطع میکنه و دیگه درخواستهای جدید رو به سرور نمیفرسته. در عوض، یه پیام خطا به کاربر برمیگردونه. بعد از یه مدت زمان مشخص، دوباره مدار رو باز میکنه تا ببینه آیا سرور به حالت عادی برگشته یا نه. 🔗[Circuit Breaker Pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker) | ||
|
||
**ماهان:** حسین، میتونی یه مثال توی کد بزنی که بهتر متوجه بشم؟ 😅 | ||
|
||
**حسین:** بله، حتماً. فرض کن یه تابع داریم که درخواستها رو به سرور میفرسته. ما میتونیم از یه کتابخونه مثل `pybreaker` استفاده کنیم. این یه مثال ساده از استفاده از Circuit Breaker هست: | ||
|
||
```python | ||
import pybreaker | ||
import requests | ||
|
||
# تعریف Circuit Breaker | ||
breaker = pybreaker.CircuitBreaker(fail_max=5, reset_timeout=60) | ||
|
||
@breaker | ||
def call_server(url): | ||
response = requests.get(url) | ||
if response.status_code != 200: | ||
raise Exception("Server Error!") | ||
return response | ||
|
||
try: | ||
response = call_server("http://example.com/api") | ||
print(response.json()) | ||
except pybreaker.CircuitBreakerError: | ||
print("Circuit Breaker فعال شده، لطفاً بعداً دوباره امتحان کنید.") | ||
``` | ||
|
||
🔗[pybreaker](https://pypi.org/project/pybreaker/) | ||
|
||
**پیمان:** این خیلی خوبه حسین، ولی چطور میتونیم مطمئن بشیم که این راهحل توی محیط واقعی هم کار میکنه؟ 🤔 | ||
|
||
**حسین:** سوال خوبی پرسیدی پیمان. ما باید این رو توی محیط تست و استیجینگ امتحان کنیم و ببینیم که چطور عمل میکنه. همچنین باید لاگها رو بررسی کنیم تا مطمئن بشیم که Circuit Breaker به درستی فعال میشه و درخواستها رو مدیریت میکنه. 🔗[Testing Circuit Breaker](https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker#testing-the-pattern) | ||
|
||
--- | ||
### پیمان کنجکاوتر میشه: | ||
|
||
**پیمان:** این مفهوم توی رشته مهندسی برق هم هست؟ 🤔 | ||
|
||
**حسین:** بله پیمان، دقیقاً همینطوره. در واقع، ایده Circuit Breaker از مهندسی برق گرفته شده. توی مهندسی برق، Circuit Breaker یه دستگاه حفاظتیه که وقتی جریان برق از حد مجاز بیشتر میشه، مدار رو قطع میکنه تا از آسیب به تجهیزات جلوگیری کنه. توی نرمافزار هم همین مفهوم رو داریم، فقط به جای جریان برق، با درخواستهای شبکه سر و کار داریم. 🔗[Circuit Breaker in Electrical Engineering](https://en.wikipedia.org/wiki/Circuit_breaker) | ||
|
||
**مارال:** دقیقاً حسین، این یکی از مثالهای خوبیه که نشون میده چطور مفاهیم از یک رشته به رشته دیگه منتقل میشن و کاربرد دارن. 😊 | ||
|
||
**ماهان:** خیلی جالبه! من همیشه فکر میکردم این مفاهیم فقط توی نرمافزار هستن. 🤯 | ||
|
||
**حسین:** بله ماهان، خیلی از الگوها و مفاهیم توی مهندسی نرمافزار از رشتههای دیگه مثل مهندسی برق، مکانیک و حتی مدیریت گرفته شدن. این نشون میده که چقدر رشتههای مختلف میتونن از همدیگه یاد بگیرن. | ||
|
||
|