ایجاد notification برای user ها


#1

سلام دوستان. من یک چیزی شبیه به کانال درست کردم توی سایتم که کاربر ها میتونن توش عضو بشن.

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

چطور چنین چیزی رو باید طراحی کنم؟ دیتابیس باید چطوری باشه؟


#2

باید یک سرویس push notification داشته باشی و یک background worker که وقتی مطلب جدید پست شد اون سرویس رو اجرا کنه. این برای بیسیک ماجرا بود, حالا اگر اطلاعات بیشتری بدی که مثلا پلتفرم چیه, از چی استفاده کردی و غیره شاید بتونم کاملتر توضیح بدم.


#5

از python 3 و django 2.1 استفاده میکنم. دارم ی شبکه اجتماعی آزمون آنلاین میسازم

جنگو خودش ی چیزی داره به نام signal که میتونی براش تعریف کنی اگر فلان اتفاق افتاد ی کاری رو انجام بده


#6

بله درسته، شما میتونید یک اپ برای push notification داشته باشید مثلا user_notifier، منظورم signal dispath در جنگو نیست، منظورم مکانیزمی هست که به کار بر پیام بفرسته حالا اینکه user چطور میخواد از پیام تغذیه کنه بحث دیگه ایه.
بعد همونطور که در سایت جنگو توضیح داده با استفاده از callback های signal dispather به user_notifier اطلاع بده که کارشو شروع کنه.

البته من ترجیه میدم کمتر از model callback ها استفاده کنم، سعی میکنم خودم با استفاده از Signal یک اینترفیس بین user_notifier و آبجکتهایی که قراره ازش استفاده کنند ایجاد کنم که خیلی جادویی عمل نکنه و قابل نگهداری باشه.
و signal بنظر شبیه یک جور observer design pattern هست که بهتره با دقت استفاده کنیم.


#8

به نظرتون سایت سنگین نمیشه؟ هر کانالی که مطلب میزاره باید برای هر یوزر یدونه رکورد توی جدول notification درست کنه و هر دفعه باید چک بشه و…

کلا چنین چیزی رو پیشنهاد میکنید؟


#9

لازم نیست توی جدول نوتیفیکیشن چک بشه، میتونه همون زمانی که یوزر مطلب میزاره پیام بوسیله notify_user فرستاده بشه البته در background و یا اگر لود بالاست یک background process این کارو در queue قرار بده و وقتی جا گرفت پیام ها رو جاری کنه، یا اینکه در لسیت مطالب جدید از جدول مربوط، اونهایی که پیام رسانی یا queue نشدند رو هر چند دقیقه یک بار چک کنه، به هر حال راه حل شما باید یکی از این موارد یا چیز مشابهی باشه.

اما در مورد سنگین شدن منظور شما دقیقا کدوم قسمت سایته؟ بهتره backgroun process ها instance اختصاصی خودشونو داشته باشند، یعنی web از bg جدا باشه.

حرف کلی من asynchronous بودن پروسه گذاشتن مطلب بوسیله یوزر و فرستادن پیام در مورد اون مطلب به یوزرهای دیگست.

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