آرش جعفرزاده
آرش جعفرزاده
خواندن ۲ دقیقه·۲۰ روز پیش

Concurrency in database migration

سلام به همه دوستان عزیز چند روز پیش یکی از دوستان توی linkedin یه مطلبی نوشته بود و یه نکته ای در اون دیدم که به نظرم رسید خوبه در موردش صحبت کنم. مسئله این بود که تصمیم گرفته بود پروسه مربوط به database migration رو زمان بوت سرور انجام بده که خوب این یه کار خیلی رایج هست. تو این نوشته ابزاری که ایشون استفاده کرده بود مد نظر من نیست مشکلی که به نظرم در این خصوص مطرح میشه اینه که ممکنه تصمیم داشته باشیم از instance برنامه همزمان چندتا بالا بیاریم. خوب شاید سوال پیش بیاد که مشکل چیه اینا همزمان بالا بیان. از اونجایی که عمل چک کردن اینکه یکی از migration ها انجام شده و اجرای مایگریشن در یک quantum انجام نمیشه (تا اونجایی که توی ef core و fluent migrator خوندم به نظر میاد اینطوری باشه) یعنی به فرض مثال اول برنامه توی یه query چک میکنه که Migration انجام شده و اگر نشده بود تو query بعدی اونو انجام میده خوب میتونن همزمان 2 تا instance از برنامه عمل چک رو انجام بدن و فکر کنن که migration انجام نشده و همزمان تصمیم به اجرای migration بگیرن. خوب این مطلب میتونه race condition به وجود بیاره.

حالا راه حلی که بنده بهش رسیدم برای حل کردن این مشکل این بود که باید از یه lock در اسکوپ global استفاده کنیم.یعنی یه lock بزرگ روی اجرای migration بزاریم. ابزار های مختلف تو این زمینه هست ولی از اونجایی که migration را داریم روی database انجام میدیم اکثر دیتابیس ها روشی برای درست کردن lock دارن و پیشنهاد میکنم از اونا استفاده کنید. مثلا توی sql server یه sp به نام sp_getapplock وجود داره که با اون میتونیم یه lock عمومی درست کنیم. اگرم روی دیتابیسی که داریم کار میکنیم این امکان وجود نداشت میتونیم از redis red lock استفاده کنیم که اونم برایه اینه که یه lock در سطح global درست کنیم.

نکته آخرم رو هم بگم که سرتون رو زیاد در نیارم. اینکه ما migration رو زمان boot سرور انجام بدیم مزایا و معایب خودش رو داره. از مزایاش میتونم به این اشاره کنم که لازم نیست تیم devops به این aware باشه که قرار هست با این instance از برنامه migration ای اجرا بشه. اما از معایب این کار اینه که اگه زمان اجرای migration طولانی باشه یا به هر نحوی اجرای migration زمانبر بشه (مثلا یهو زدیم یه column رو change type کردیم که جدولش یک میلیارد رکورد داره) بالا اومدن سرور ممکنه با خطا مواجه بشه.

sql servermigration
شاید از این پست‌ها خوشتان بیاید