tgoop.com/pyHints/898
Last Update:
توی معماری سیستم یک اصطلاحی داریم به اسم؛distributed monolithic
که خب یک anti-pattern
هست برای معماری micro-service
اول هفته با یک شرکتی برای مشاوره صحبت کردیم (کارشون رو قبول نکردم ولی یک قرارداد کوچک بستم برای اینکه بگم مشکل فعلی سیستم کجاس)
معماری سیستم مثلاً قرار بوده micro-service باشه؛ در نگاه اول هم هست و حتی از تمام ابزارهای لازم هم داره استفاده میشه اما به اشتباه.
کل سیستم رو امروز کنار هم چیدم و روی یک سرور بالا آوردم (بجای چندتا سرور) و تبدیلش کردم به multi app monolithic
اولش خیلی ناراحت و نگران بودند که پرفورمنس خراب میشه و ازین حرفا ولی بعد توی تستها دیدند که حداقل ۲ برابر سرعت پاسخ و تعداد درخواستهایی که هندل میشه بیشتره.
البته من مطمئن بودم که اینطوری میشه به سه دلیل :
۱- به وضوح anti pattern
رو میدیدم
۲- تعداد درخواستهای بین سرویسها زیاد بود
۳- خیلی از زمان پروفایلنگ، برای درخواست بین سرویسها هدر میرفت روی نتورک. (که خب حتی async
هم نبود که حداقل cpu هدر نره)
این موضوع دلیلی شد؛ بیام چندتا تعریف اشتباه که دائم میشنوم رو انتقال بدم:
۱- توی ماکروسرویس هر سرویس باید دیتابیس جدا داشته باشه.
این تعریف درسته، اما تفسیر غلط ازش زیاده؛ مثلاً ۹۹٪ فکر میکنند این یعنی برای هر سرویس باید یک سرور Postgres
جدا داشته باشند، نه لزوماً مفهوم این تعریف اینه که:
مثلاً سرویس auth
شما نره دیتای سرویس payment
رو بخونه حتی اگر جفتشون روی یک دیتابیس هستند (فقط دوتا تیبل جداشده) و برای گرفتن دیتای مورد نیازش به سرویس payment
درخواست بده
۲- هر تابع، متد یا ... باید single responsibility
داشته باشه.
بله درسته، این یکی از موارد مهم هست اما تفسیر اشتباه ازش زیاده، مثلاً:
فرض کنید سرویس payment بالا، بعد از اینکه پرداخت انجام شد باید به بخش انبارداری تیکت بزنیم که پرداخت موفق بوده موجودی رو کم کن، به بخش حسابداری بزنیم که فاکتور صادر شده پرداخت شد و مثلاً به بخش ارسال کالا هم بگیم چیو بستهبندی و ارسال کنه به چه آدرسی ...
اینو دیدم که میگم، به طرف میگم، خب عالی توابع اینکارها رو بذار یکجا داخل یک تابع و درخواست بده اگر مشکلی توی پرداخت پیش اومد همه باهم باید rollback
بخوره (توجه به بحث قبل شما حق نداری، تیبل سرویسهای دیگه رو دستکاری کنی)؛ برگشته میگه پس Single Responsiblity
چی میشه ؟
یک ساعت داشتم براش توضیح میدم؛ که این تابع SRP رو رعایت میکنه چون تو فقط داری میگی من پول رو پرداخت کردم موفق بود یا نه.
۳- ماکروسرویس بهتره ...
نه چون یک چیزی سختتر هست پیادهسازیش لزوماً بهتر نیست، بسیار بسیار پروژه دیدم که گفتم خب همهی چیزایی که اینا لازم دارن اگر monolithic
بود، هم سریعتر بود هم سرعت توسعهاش بیشتر بود هم نیاز به این همه دولوپر نداشت.
چندتا برداشت اشتباه دیگه هم بود که متأسفانه یادم نیست دیگه، ولی تبدیل سیستم به یک monolithic
واقعی توی این پروژه نتایج خیلی بهتری داشت.
حتی برای مرحله بعدی هم پیشنهاد کردم اول سراغ Load balance
و بالا آوردن چندتا instance
از همین monolithic
برند، بعد برای تبدیل به micro-sercive از یکی که معماری رو واقعاً بلد هست کمک بگیرند نه کسی که پوشه پوشه کردن فایلای پایتونش رو فقط یاد گرفته.
نهایتاً؛ البته من میدونم خیلی از این برداشتهای اشتباه از کجا میاد.
منابع ترجمه شده به فارسی.
ترجمه اشتباه لغوی یک کلمه، باعث میشه معنی یک جمله بطور کامل عوض بشه.
BY Python Hints
Share with your friend now:
tgoop.com/pyHints/898