مسئله تاخیر در انتقال و نمایش دیتا، چیزی که با سینک و کرال می‌شناسیم

شروع مسئله من با تعداد زیادی تیکت در پشتیبانی مراکز درمانی در خصوص تاخیر در نمایش دیتای پزشک، عدم وجود پزشک در سایت پذیرش۲۴ و مواردی از این دست بود.

ریشه همه این موضوعات به نحوی به مسئله sync و یا crowl مربوط می‌شد.
پس توی روند Tshoot من به دیزاینی رسیدم که با شما به اشتراک میزارم و بعد درباره این صحبت میکنم که چه مشکلاتی رو توی این دیزاین دیدم.

سینک و کرال چیست؟

(این اسلاید رو میتونید ادیت هم بکنید اگر نکته‌ای برای اضافه کردن و یا ویرایش کردن دارید)

داستان:
هر یک ساعت یکبار (دقیقه ۲۴ هر ساعت) دیتابیس (دیتابیس کلینیک) به سرورهای مختلف لوکال رکوئست میزند و دیتاهای جدید (update) شده را دریافت میکند.
اگر زمانی این انتقال دیتا faild شود و یا به خطا بخورد، در سینک بعدی مجدد دریافت خواهد شد.

سپس crowler شروع به کرال و خواندن دیتاها می‌کند، بدون توجه به اینکه آپدیت شده است یا نه، همه دیتا را از اول در صف خود کرال می‌کند و به سرویس‌های ما مثل سرچیا (برای پروداکت سرچ)، میلی سرچ، مونگو و… می‌دهد.

توی این تاپیک تا حد خوبی با تجمعی کردن سرورهای مراکز، تعداد سرورهای لوکال رو کمتر کردیم و بخشی از مشکل رفع شد.

https://community.paziresh24.com/t/topic/673

خانم منصوری و عرفان هم پیروی رفع این معضل‌ها، کارهایی برای event driven شدن انجام دادن

https://community.paziresh24.com/t/topic/673/46?u=sahar_h

اما هنوز شاهد مشکلاتی هستیم، چند مورد رو مثال میزنم که موشکافی کنیم

به چه مشکلاتی برخوردیم؟

یه بازنگری و بررسی روی تیکت‌هایی از پشتیبانی که زمان‌بر بودن و انرژی زیادی از ما میگرفتن رو انجام دادم و دیدم ریشه اغلبشون همین مسئله هست؛

چند مورد تیکت جیرا رو میزارم که روند حلش رو هم ببینید

۱. پروفایل پزشکانی که جدید تعریف شدند توی سایت ما و دیتابیس نیست
مسئله: سینک انجام نشده

این مشکل بعد از ۴ یا ۵ روز خود به خود رفع شد.

https://jira.paziresh24.info/browse/PAZDEV-1160

۲. پروفایل پزشک وجود ندارد
دیتا به سرچیا و میلی سرچ اومده ولی پروفایل پزشک نیست.
دلیلش احتمالا تاخیر mongoDB و یا شناخته نشدن این پروفایل به عنوان پزشک هست.

با crowl کردن مجدد این پزشک مسئله رفع شد.

https://jira.paziresh24.info/browse/PAZDEV-1152

تعداد زیادی از موارد شبیه به این رو هم چندوقت پیش توی این تاپیک گزارش کردم

جمع بندی

یکی از مشکلاتی که زمان و انرژی زیادی از ما در پشتیبانی میگیرد، عدم آپدیت دیتاهای پزشکان در پروداکت‌های پذیرش۲۴ بخصوص پروفایل است.

دیزاینی که برای این انتقال دیتا داریم، زمان‌بر و پیچیده است.

چطور با یک دیزاین ساده به مرحله‌ای برسیم که به محض اعمال تغییر در سرویس لوکال و کلود، تغییرات را نمایش دهیم؟

راه‌هایی که به ذهن من رسید:

۱. مراکز کوچک که زیرمجموعه دانشگاه‌ها نیستند را به امدن به سرور کلود خودمان دعوت کنیم.
تا تعداد سرورها یکبار دیگر کمتر شود

۲. آیا میشه بجای event base و یا massage q داشته باشیم؟ و این زمان یک ساعته رو حذف کنیم؟
بعد از اون هم بجای crowl به سمت event بریم ؟

۳. میتونیم سینک، دیتابیس، کرال رو از روند حذف کنیم و اطلاعات رو از سرورها مستقیم به سرویس‌های مختلف بدیم؟

۴. ما هم چندین سرور داریم که دیتاها توشون ذخیره میشن، ممکنه به سرور مراکز به عنوان یکی از سرورهای خودمون نگاه کنیم؟ (رفتار با سرورهای لوکال مشابه کلود)
از نطر فنی چطور ممکنه؟

۱. چقدر از مشکلمون مربوط به سرور نوبت دهی کلود خودمونه چقدر مربوط به self-hosted ها
۲. چند مورد دیر آپدیت داشتیم و چه مشکلاتی داشتن (میخوام بدونم عمده مشکل در کدوم بخشه، انتقال دیتا از مرکز به کلینیک، انتقال از کلینیک به پروفایل، از کلینیک به سرچیا یا کلینیک به ساجسشن)

لطفا فنی توضیح ندید بر مبنای مشکل کاربر صحبت کنید، مزیت نگاه شما اینه که out of the box هستش

از مطب‌ها خبر ندارم، به طور تقریبی از هر ۱۰ مورد ۲ مورد مربوط به مراکز کلود نیز هست. دیتاهای تیکت‌ها و اسامی مربوطش رو توی این خلاصه میزارم تا به طور تقریبی دستتون بیاد

خلاصه

مراکز کلود

۱. بیمارستان فرهیختگان تهران

۲. بیمارستان سیدالشهدای بندرعباس

مراکز لوکال

۱. بیمارستان شریعتی تهران

۲. بیمارستان جوادالائمه (ع) نرماشیر، بم

بیمارستان کودکان حکیم

خلاصه

ورود ‹ پشتیبانی پذیرش۲۴ — وردپرس
غیرفعال شدن نوبت دهی پزشک
با عرض سلام و خسته نباشید خدمت شما
با وجود اینکه دکتر دنیا سدید در پذیرش 24 تعریف شده و ساعت پذیرش هم برایشان تعریف کرده ایم ولی بیماران قادر به گرفتن نوبت برای ایشان نیستند و با این خطا روبرو میشوند که نوبت دهی برای این پزشک غیرفعال میباشد.
اگر لطف کنید و این موضوع را پیگیری کنید ممنون میشوم.

۳. بیمارستان حضرت ابوالفضل (ع) میناب

۴. درمانگاه حمزه

خلاصه

ورود ‹ پشتیبانی پذیرش۲۴ — وردپرس
درخواست مجدد درخصوص فعال سازی سایت اینترنتی پزشک

باسلام
باتوجه به درخواست قبلی در رابطه با تنظیمات شخصی مجدد پزشک و اضافه کردن حداکثر نوبت دهی دکتر زهرا منتصری و بررسی به عمل امده در ۲۴ ساعت اینده ،هنوز درسایت نوبت دهی اینترنتی فعال نمی باشد .
خواهشمندم بررسی لازم بفرمایید.

۵. بیمارستان سینا

خلاصه

ورود ‹ پشتیبانی پذیرش۲۴ — وردپرس
غیرفعال بودن نام پزشکان در نوبتدهی اینترنتی و اپلیکیشن
با سلام و احترام
به نظر میرسه نام تعداد زیادی از پزشکان بیمارستان (دکتر میرشاهی - دکتر آقامیر و …) در اپلیکیشن و سایت نوبتدهی پس از عوض شدن آی پی غیرفعال شده اند
در صورتیکه تنظیمات ساعت پذیرش پزشکان و انواع ویزیت دست نخورده و تغییری نداشته اند (با مهندس اسدی هم چک شد)
باتوجه به اعلام قبلی به بیماران در مورد عدم نوبتدهی حضوری از یکم مردادماه خواهشمنداست در اسرع وقت رسیدگی فرمایید

۶. درمانگاههای ساختمان ولیعصر (امام خمینی ها)

خلاصه

عدم مشاهده نوبت اینترنتی دکتر مهرداد جعفری در سایت نوبت دهی
با سلام و احترام
با توجه به تنظیمات انجام شده دکتر مهرداد جعفری در سایت نوبت دهی نمایش داده نمی شود
ورود ‹ پشتیبانی پذیرش۲۴ — وردپرس

۷. بیمارستان ولی عصر رشت

این سوال رو بدون توضیح فنی دونستن و حرف زدن نمیتونم پاسخ بدم
ترتیب تعداد مشکلاتم به این شکل هست:

۱. پروفایل نوبت نمی‌دهد (درحالی که باید بدهد)
۲. در سرچ نام پزشک تازه تعریف شده مشاهده نمیشود
۳. پروفایل پزشک در پروفایل مرکز درمانی نمایش داده نمیشود درحالی در سرچ فعال و دارای نوبت است.

سلام و وقت بخیر
در حال حاضر موضوع ایونت بیس شدن به صورت پایه ای و زیرساختی انجام شده و روی دولوپ نیز اپدیت گردیده است اما پس از بررسی متوجه شدیم که یک چالشی وجود دارد و اطلاعات در سرچیا ذخیره نمیشه بنابراین این موضوع در حال بررسی و رفع مشکل است.

اگر بخوام توضیحی در مورد نحوه عملکرد زیرساخت ایونت بیس شدن بدم باید بگم که ما با استفاده از rabbitmq (برای دوستان محصول یک صف دارای قابلیت شروع کارها از ابتدا و ادامه ی روند کارها در صورت وجود خطا ) ایجاد کردیم که تمام اطلاعات نظیر ویرایش هر پزشک ( و قطعا در ادامه مراکز ) بسته به نوع اپدیت (مثلا افزودن یک ساعت کاری یا ویرایش نام و نام خانوادگی پزشک و … ) در این صف قرار میگیرد و به صورت موازی در دیتاسورس های مختلف ذخیره میشوند.

صرفا جهت اطلاع: ما از سرچیا برای سرچ پزشکان و مراکز از میلی سرچ برای ساجسشن و از مونگو برای پروفایل استفاده میکنیم.

من میخوام قسمت کرالر رو حذف کنم.
آقای صادقی نژاد با یک سری ابزار، امکان cdc رو فراهم کردند.
به این صورت که هر تغییری در دیتابیس صورت بگیره، به rabbitmq ارسال میشه.
من میخوام که شروع کنم و کم کم کرالر رو درست کنم.

کاری که میخوام انجام بدم و چالش هایی که دارم:

  • یک ورک فلو n8n بسازم که از این rabbitmq استفاده کنه و تغییرات رو بخونه
  • تغییراتی که مربوط به پزشک نیست رو نادیده بگیرم و فقط تغییراتی که روی پروفایل پزشک تاثیر میزاره رو روش کار کنم
  • پزشک مربوطه رو پیدا کنم
  • از وب سرویس سرچ دیتای مربوط به پزشک توی هر data source رو بگیرم (میلی سرچ، سرچیا و مونگو) (چالش: حجم دیتا خیلی زیاد میشه توی هر دیتا سورسی، یک جور ذخیره میشه و اینکه مدت زمان اجرای وب سرویس هم ممکنه زیاد باشه. به ازای هر پزشک بین 2 تا 5 ثانیه میشه)
  • با استفاده از n8n، دیتا سورس ها رو آپدیت کنم
  • اگه خطا داشت آیتم مجدد کار کنه و اگه خطا نداشت بره سراغ آیتم بعدی

ممنون میشم اگه راه کار دیگه ای دارید راهنماییم کنید. این کار رو میکنم که کرالر رو حذف کنم. قدم به قدم جلو میرم و اصلاحیه ها رو انجام میدم. یعنی بهبود وب سرویس و اینا مد نظرم نیست و در قدم بعدی انجام میدم.

@h.sadeghynejad @erfanzamanzade @Terra-Chaos @amirjavad_afrugh @sajad_nyn

4 پسندیده

سلام. این جا منظورت اینه که نمیخوای مستقیم از خود دیتاسورس ها داکیومنت ها رو بگیری؟ یعنی میخوای برای دریافت اطلاعات پزشک از هر کدوم از این دیتاسورس ها یه api جدا بنویسی؟

بابت مشکل مدت زمانش، میشه که ورکفلوی n8nت رو duplicate کنی و چندتا instance همزمان از صف rabbitmq بخونن؟
مطمئن نیستم، ولی فکر کنم که rabbitmq باید همچین چیزی رو هندل کرده باشه

خیر. منظورم رو اشتباه بیان کردم.
من میخوام دیتایی که کرالر میسازه رو از طریق api بگیرم و با n8n در دیتا سورس های مربوطه آپدیت کنم. نه اینکه دیتا رو از دیتا سورس ها بگیرم. دیتا سورس ها دیتای قدیمی دارند و من میخوام که دیتای آپدیت شده داخلش قرار بگیره.

اما حداقل برای میلی سرچ لازمه که کل داکیومنت رو بگیری، اون جایی که میخوای رو تغییر بدی، بعد کل داکیومنت رو دوباره بفرستی. لطفا حواست به این موضوع باشه.

ولی برای بحث گرفتن دیتایی که کرالر میسازه، میخوای این اطلاعات رو یکجا بگیری، یا میخوای مثلا اطلاعات مراکز رو جدا، اطلاعات سرویس ها رو جدا و … براش api داشته باشی؟

من قبلا توی n8n چندتا ورکفلو درست کرده بودم که با hasura کار میکرد، اطلاعات رکورد تغییر کرده رو میگرفت، اطلاعات جانبی هم اگر احتیاج داشت میگرفت(بازم از hasura، ولی از دیتابیس یا جای دیگه هم میشه گرفت)، و بعد میریخت توی سرچیا. فقط برای اطلاعات جدول user_info و slug نوشته بودم فکر کنم. اگر خواستی شاید به دردت بخورن.

این که یه قسمت از داکیومنت رو آپدیت کنم میزارم برای دفعه بعد.
فعلا کاری که داره کرالر انجام میده رو (یعنی دریافت اطلاعات کامل پزشک) با api انجام بدم. میخوام کرالر ها رو غیرفعال کنم.

همون فانکشنالیتی که داره توی کامند انجام میشه رو بیارم توی Api و با n8n کار کنم.

1 پسندیده

سلام و وقت بخیر
از اونجایی که تسک ایونت بیس شدن داده های پزشک رو دارم انجام میدم به نظرم یه نگاهی به داکیومنت توی گیت لب داشته باشید که به چه شکل کار داره انجام میشه ضرورویه که باهم هماهنگ باشیم و دیتاهای مورد نظر رو در لحظه ویرایش کنیم.

کاری که در این تسک دارم انجام میدم اینه که از هر جایی که تغییر اعمال میشه یکسری اطلاعات تغییر داده شده رو به صف RabbitMq میفرسم و همچنین توی پروژه سرچ هم تغییرات رو با استفاده از پکیج لاراولی، تغییرات رو از صف میگیرم و متناسب با نوع ایونت تغیرات رو فقط درون مونگو اصلاح میکنم که کاملترین داکیومنت ما هست.
بر طبق ایونت های لاراولی به تعداد ریسورس های دیگر Listener ایجاد کردم و داکیومنتهای مختلف رو به اون دیتاسورس ها ارسال میکنم.

خلاصه موضوع این هست که تا به اینجای کار دیتاها از مونگو گرفته میشن و با تغییر فیلد های مورد نظر در همون دیتاسورس مونگو ذخیره میشن سپس در قالب Listener دیتاها را متناسب با دیتاسورس یکپارچه میکنم (فیلد های اضافی رو حذف و فیلد های مورد نیاز رو اضافه میکنم [Resource]) و به همون دیتاسورس ها برای ذخیره ارسال میکنم.

1 پسندیده

من موضوع سینک رو میخوام با این روش پیش ببرم
و تغییرات رو لوکال ها رو با سیستم های messaging به کلینیک منتقل کنم

2 پسندیده

شما در حال ارسال ایونت به rabbitmq برای ثبت تغییرات هستید.
من کارم بعد از کار شماست.
فعلا دارم از event های دیتابیسی که با maxwell ساخته میشه و داخل rabbitmq ریخته میشه استفاده میکنم.

فکر نکنم کارمون تداخلی با هم داشته باشه.

بخش اصلی کار من ایونت شدن رویداد هاست ولی در کنارش به دلیل مشکلات و چالش ها مجبور شدم ریسورس کامل دکتر رو برای هر سه انجین طراحی کنم که اطلاعات رو از داکیومنت بدون وابستگی کامل کند به عنوان مثال در زمان ثبت یک کامنت قرار نیست دستی تعدا کامنت ها یا تعداد لایک ها رو هم از ورودی بگیرم و مثلا مقدار wilson_star رو هم از بیرون محاسبه کنم در حالیکه تک تک وابستگی ها رو درون ریسورس محاسبه میکنم

مرتبط با این مشکل، با کمک کل @paziresh24team در حال تلاش برای طراحی دیاگرام وضعیت فعلی معماری انتقال دیتای پذیرش24 برای پزشکان و بیماران هستیم .

2 پسندیده

در ایشو تغییر ریدایرکت 301 به 302 در کیس های dp redirect فیلد از به توسط **** تنظیم شد.

در حین دیباگ تاخیر در آپدیت شدن پروفایل پزشک، متوجه یه اشتباه در تنظیم ریدایرکت شدم.

اشتباها در کد لاراول دکتراپ، ریدایرکت 301 بجای 302 برای هدایت کاربران در پروفایل های حذف شده ارسال می شود.
این باگ باعث می شود اگر فقط یک بار پروفایل حذف شود، روی مرورگر کاربرها و همینطور کش آروان تا زمان پاک شدن کش، این ریدایرکت میماند.
حتی اگر مشکل حذف شدن این پروفایل مرتفع شود، کاربری که قبلا یک بار ریدایرکت شده نمیتواند آن را ببیند.

برای این مورد نیاز هست که در کد لاراول دکتراپ تغییر جزئیی برای حل این مسئله اعمال شود.

@anahitamansoori

سلام و احترام
مورد تایید است