مدتی پیش با افزایش تعداد بازدیدکنندگان و خریداران وبسایت آرایشی و بهداشتی اونس متوجه شدیم کارایی وبسایت به شدت کاهش یافته و صفحات وبسایت و درخواستهایی که سمت وبسایت میرود با کاهش سرعت بسیاری مواجه شده است.
حتی در بسیاری از موارد مشاهده کردیم که پرداختها بدرستی صورت نمیپذیرد و خطاهایی که در هنگام پرداخت رخ میدهد باعث میشوند مشتریها را از دست بدهیم و مشتریان تجربه بسیاری بدی با فروشگاه تجربه کرده و مشتریان رفته رفته کم میشوند.
پس از بررسیهای بسیاری که توسط تیم فنی صورت گرفت متوجه شدیم اکثر مشکلات وقتی پیش میآید که پرداختی در حال انجام میباشد.
همین باعث شد تمرکز اصلی را بر روی صفحه پرداخت و برای موقعی که پرداختی در حال انجام هست بگذاریم که اتفاقا بدرستی تشخیص داده شده بود، مشکل از این قرار بود که در هنگام پرداخت و بعد از تکمیل پرداخت، پیامکهایی به مشتری و کارکنان ارسال میشد که مشتری و تعدادی از کارمندان را از فاکتور جدید آگاه سازی نماید.
بنابراین نخ های پردازنده (Threads) به شدت مشغول پروسه ارسال اس ام اس شده و عملا منابع را از دست میدادیم.
جهت مشاهده صفحه اصلی فروشگاه آرایشی و بهداشتی اونس، بر روی لینک زیر کلیک کنید:
اگر بخواهیم معماری کلی سیستم را ترسیم کنیم به این شکل خواهد بود:
در این شکل Bottleneck اصلی برای موقتی بود که بعد از تکمیل پرداخت پردازنده مشغول ارسال اس ام اس میشد.
راه حلی که برای حل این موضوع پس از بررسیها مطرح شد و توسط تیم فنی پیاده سازی شد، استفاده از صف جهت پردازش اطلاعات بود.
به این صورت بود که بعد از تکمیل پرداخت، پیامک در صفی قرار داده میشود و سرویس دیگری پیام را از صف برداشته و توسط پنل اس ام اس ارسال میشود که در ادامه معماری این سیستم را مشاهده میکنید.
در معماری جدید، پس از اتمام پرداخت، پیامی به صف ارسال میشود و پیام موفقیت آمیز بودن مراحل پرداخت را به مشتری نمایش میدهیم و مشتری هیچ انتظاری بابت ارسال اس ام اس نمیکشد. در واقع پیامی که در صف قرار میدهیم سرویس دیگری همین پیام را برداشته و پیامکی به مشتری و کارمندان ارسال میشود.
ساختار پیام به شکل زیر میباشد که بصورت سریال شده در صف RabbitMQ قرار داده میشود:
Customer notification message template:
{
"ProfileId": "SMS_KAVENEGAR",
"MobileNumbers": [ "09120000000" ],
"MessageId": "AVENS_NOTIF_CUSTOMER",
"Parameters": [ "آقای ...", "فروشگاه آرایشی و بهداشتی اونس", "https://avens.ir" ]
}
Employee notification message template:
{
"ProfileId": "SMS_KAVENEGAR",
"MobileNumbers": [ "09120000001", "09120000002", "09120000003" ],
"MessageId": "AVENS_NOTIF_EMPLOYEE",
"Parameters": [ ]
}
این معماری در تمام بخشهای سایت هم برای ارسال اس ام اس و هم برای ارسال ایمیل و ... استفاده شده است. در واقع سیستمی به نام سیستم نوتیفیکیشن طراحی و مستقر شده است و وابستگی نوتیفیکیشن را از سیستم اصلی جدا کرده و بدون هیچ گونه وابستگی هر کدام وظایف خود را انجام میدهند.
در صورتی که هر گونه سوال یا ابهامی در این زمینه داشته باشید میتوانید وارد وبسایت اونس شده و از طریق ارتباط با ما موضوع را مطرح نمایید که همکاران راهنماییهای لازم را بعمل خواهند آورد.