درود!
در تلاشم تا یک سیستم خرید طراحی کنم و به کمکتون برای ایدهپردازیش نیاز دارم.
در این سایت ما قصد فروش یکسری کتاب رو داریم اما بهصورت بخشبخش شده. یعنی بهجای اینکه فرد یکجا کتاب A رو خریداری کنه، توانایی این رو داره تا کتاب رو در قالب ۱۰۰ قسمت(پارت) جداگونه خریداری کنه. به این شکل میتونه هرجا که خواست کتاب رو رها کنه و هزینه اضافه نده. بهعنوان مثال شما تا وسط کتاب میخونید و ازش خسته می شید پس چه بهتر که پول باقی کتاب رو ذخیره کنید برای یک چیز دیگه.
حالا مشکل من روی خرید گروهی قسمتهاست. چرا؟ بهخاطر اینکه کتاب رو ۲۰ مترجم با همکاری همدیگه ترجمه کردن. هر کدوم از اونها یک بخش از این ۱۰۰ قسمت رو ترجمه کرده و سیستم خرید هم نیازه تا موقع خریداری قسمتها، درصدی از پول رو به اونها بده. بهعنوان مثال هر قسمت ۱.۰۰۰ تومان قیمت میگیره. قرار هم میشه تا مترجم ۵۰ درصد و سایت هم ۵۰ درصد از هر فروش رو برای خودشون بردارن. پس هرخریدی که انجام میشه، سیستم باید چک کنه که قیمت این قسمت چقدر بوده؟ آیا کاربر به اندازه کافی پول داره؟ چه فردی این قسمت رو ترجمه کرده؟ و در آخر فرآیند تقسیم پول رو انجام بده.
پیچیده بود مگه نه؟ دقیقا همین هم باعث میشه تا سرور نتونه سریع درخواست رو در مقیاس بالا هندل کنه. شما فرض کنین ۹۰تا درخواست اینطوری بهصورت همزمان براتون ارسال میشه(کاربر خواسته ۹۰ قسمت رو همزمان بهصورت گروهی بخره). حالا چاره چیه؟
راهحل اولی که بهش رسیدم ایجاد یک صف انتظار بود. یعنی درخواستها بهصورت همزمان برای سرور ارسال نشن. هربار که درخواستی ارسال شد، باقی درخواستها منتظر بمونن تا درخواست قبلی تایید بشه و بعد درخواست خرید بعدی رو انجام بده ولی این هم نمیدونم تا چه اندازه میتونه بازدهی داشته باشه.
راهحل مشخصی برای چنین مواقعی وجود داره؟ ایدهای دارین؟ خوشحال میشم دربارهش بدونم.
صف انتظار (Queue): ایدهی شما در مورد ایجاد یک صف انتظار خوب است. شما میتوانید از سیستمهای صف مثل RabbitMQ یا Kafka استفاده کنید. کاربران درخواستهای خود را در صف قرار میدهند و یک یا چند ورکر (worker) در پشتصحنه به طور موازی درخواستها را از صف بیرون میآورند و پردازش میکنند.
پردازش موازی (Parallel Processing): بجای اینکه هر درخواست را یکی پس از دیگری پردازش کنید، میتوانید از تکنیکهای موازیسازی مثل multi-threading یا multi-processing استفاده کنید تا چندین درخواست را به طور همزمان پردازش کنید. Cache: اگر بعضی از اطلاعات مانند اطلاعات مترجم یا قیمت قسمتهای مختلف تغییر نمیکند، میتوانید از یک سیستم کش مانند Redis یا Memcached استفاده کنید تا اطلاعات را در حافظه نگه دارید و به سرعت به آنها دسترسی پیدا کنید. بانک اطلاعاتی بهینه: از بانکهای اطلاعاتی با پردازش سریع و موازی استفاده کنید. برخی از بانکهای اطلاعاتی مانند PostgreSQL یا MySQL قابلیتهایی مانند partitioning دارند که میتواند در مواقع بحرانی به شما کمک کند.
استفاده از Microservices: به جای اینکه یک سیستم بزرگ داشته باشید، میتوانید سیستم خود را به چندین سرویس کوچکتر تقسیم کنید که هر یک مسئولیت خاصی داشته باشد. به این ترتیب، هر سرویس میتواند به طور مستقل از دیگران مقیاسپذیر شود.
Optimistic Concurrency Control (OCC): به جای اینکه برای هر درخواست یک قفل (lock) بگیرید، میتوانید از روش OCC استفاده کنید که فقط در زمان نوشتن دادهها قفل میگیرد. این روش به ویژه در سیستمهایی که بیشتر خوانده میشوند نسبت به نوشتهشدن، مفید است.
Batch Processing: اگر چندین درخواست با هم مشابه هستند، میتوانید آنها را در یک گروه قرار دهید و به طور گروهی پردازش کنید.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟