لذت برنامه نویسی: پیاده سازی Push Notificaiton

اینم یه تجربه پراکنده دیگه!

قبلا در مور اینکه Push Notification چطور کار میکنه، نوشته بودم. حالا این دفعه میخوام راه حلی رو که برای ارسال پیغام بصورت آنی به کلاینت‌ها دارم رو بگم. توی این پست راه‌حل‌های مختلفی که به ذهنم میرسه رو میگم و معایب و مزایای هرکدوم رو از نظر خودم اسم میبرم!

اختراع مجدد چرخ

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

  • طراحی پروتکل: یعنی اینکه تعیین کنیم این سیستم جدید اولا چه پیغام‌هایی رو میفرسته(فرمت پیغام‌ها)
  • طراحی روند کار: اینکه وضعیت‌های کلاینت و سرور چیاست و مثلا رجیستر شدن کلاینت جدید، حذف شدنش، قطع شدنش و … چطور مشخص میشه.

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

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

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

  • چالش‌ها
    • تامین ثبات و مقاومت نسبت به خطا
  • مزایا
    • همه چیز در کنترل ماست و ما از زیر رو بم سیستم آگاهی داریم
  • معایب
    • نیاز به زمان و انرژی زیاد

استفاده از xmpp

خب استفاده از این راهبرد یکی از کم ریسک‌ترین راه‌هاست چرا که همین الان گوگل و اپل از این سیستم استفاده میکنند. دوم اینکه نرم‌افزارهای آماده‌ای هم برای این کار وجود داره. کارهایی که بایستی در این حالت انجام بشه اینه:

  • آشنایی با پروتکل xmpp
  • آشنایی با سرور و کلاینت‌های موجود برای xmpp
  • ارزیابی لیست ویژگی‌هایی که ما داریم با قابلیت‌های این سیستم‌ها

بعد از انجام این بررسی‌ها باید برویم سراغ انتخاب سرور و کلاینت. چون این پروتکل استاندارد شده و سرور و کلاینت‌هایی براش موجوده پس میشه گفت که چالش‌ها، مزایا و معایبش یکی هست:

  • چالش‌ها:
    • نیاز به آموزش زیاد
    • نیاز به دستکاری و تغییر کدهای نوشته شده توسط دیگران: خیلی از ما در خوندن و دستکاری کد دیگران با مشکلات عدیده‌ای مواجه هستیم که خب معمولا باعث میشه از این کار بترسیم.
  • مزایا:
    • وجود نرم‌افزارها متن باز
    • ریسک پایین کار
  • معایب:
    • پروتکل xmpp مبتنی بر xml هست که عملیات استخراج اطلاعات رو از نظر محاسباتی پر هزینه میکنه.
    • پروتکل‌ xmpp دارای extension های غیر استاندارد زیادی هست که همه سرورها و همه کلاینت‌ها از اون پشتیبانی نمی‌کنن.

استفاده از IRC

خب ریسک این راهبرد یکم بیشتر از قبله، اما توسط ارتش آمریکا برای اطلاع رسانی در حین عملیات استفاده شده که نشون میده این ایده هم قابلیت اجرای عملیاتی داره. کارهایی که در اینجا هم باید انجام بشه شبیه xmpp هست:

 

  • آشنایی با پروتکل IRC که خیلی ساده و راحت هست
  • آشنایی با سرور و کلاینت‌های موجود برای IRC
  • ارزیابی لیست ویژگی‌هایی که ما داریم با قابلیت‌های این سیستم‌ها

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

  • چالش‌ها:
    • نیاز به دستکاری و تغییر کدهای نوشته شده توسط دیگران
  • مزایا:
    • نیاز به آموزش قابل قبول
    • وجود نرم‌افزارها متن باز
    • ریسک پایین کار
    • پروتکل IRC مبتنی بر متن بوده و بسیار ساده است.
  • معایب:
    • پروتکل IRC مبتنی بر متن بوده و به سختی یا با هزینه بیشتر میشه اطلاعات بایتنری رو از طریق اون انتقال داد.

 جمع بندی

اگه من بخوام جمع بندی کنم من حداکثر سعیم رو میکنم که سراغ «اختراع مجدد چرخ» نرم. جاهایی که با کمبود قدرت محاسباتی کلاینت مواجهم یا قرار نیست با این اطلاع رسانی آنی «شاخ غول» بشکنم، استفاده از IRC‌ به علت ساده تر بودنش قابل قبول تره اما اگه موقعیت عجیب غریب باشه احتمالا میرم سراغ xmpp.

امیدوارم این مطلب به دردتونه خورده باشه! همین!

غواصی در اعماق: زیر پوست push notification

اینم یه تجربه پراکنده دیگه!

من توی یکی از کارهایی که انجام میدادم نیاز پیدا کردم که تقریبا به صورت آنی به کلاینت خبر بدم که یه اتفاق افتاده و کلاینت به اون اتفاق پاسخ مناسب بده. با توجه به این نیاز و دونستن اینکه نرم‌افزارهای موبایل عملا به راحتی اتفاقات سمت سرور رو به کلاینت خبر میدن رفتم سراغ اینکه بدونم اونها چطور کار میکنن.

خب اول از همه ویندوز، iOS و آندروید هر سه در سطح سیستم عامل این عملیات رو پشتیبانی میکنن. بدین صورت که اگه شما بخوای اطلاعاتی رو به موبایل push کنی بایستی تقریبا مراحل زیر رو طی کنی:

  1. نرم افزاری رو که میخوای براش اطلاعات بفرستی به فراهم کننده این سرویس معرفی کنی و ازش یه شبه اکانت بگیری
  2. توی نرم افزار موبایل کارها مرتبط با پیدا سازی این سرویس رو انجام بدی
  3. از سمت سرور به سرورهای فراهم کننده وصل بشی و بدونی چه کلاینت هایی داری و به اون کلاینت‌ها اطلاعات رو push کنی.

خب دونستن این اطلاعات خیلی به من برای رسیدن به هدفم کمک نمی‌کرد. پس رفتم سراغ یه جای دیگه. ما راه‌حل‌هایی داریم به اسم Backend as a Service که اونها اداعا میکنن که سرور push notification دارن. بعد از بررسی و خوندن مستندات و یکم دست و پنجه نرم کردن با این راه‌حل‌ها فهمیدم که کارکردن و سرو کله زدن سرورهای فراهم کننده خیلی راحت و تو دل برو نیست و برای پیاده سازی باید کلی نحوه ارسال این اطلاعات مدیریت بشه. سرور push notification توی این راه‌حل‌ها سعی میکردن این مدیریت رو انجام بدن. این اطلاعات هم خوب بود اما خیلی به درد نمی‌خورد.

پس یه قدم به جلو رفتم که بدونم زیر این سیستم‌ها از چی استفاده میشه. پس یکم بررسی پیدا کردم(از اینجا، اینجا، اینجا و اینجا) که اپل و گوگل و خدا بیامرز نوکیا از پروتکل xmpp برای ارتباط کلاینت‌ها و سرورهاشون استفاده میکنن. این سرنخ خوبی بود. این نشون میداد که کل سیستم براساس یه نوع چت خاص کار میکنه. یعنی همه کلاینت‌های متصل به اینترنت آنلاین هستن و با سرور اتصال دارن. حالا سرور با رسیدن یه پیغام، اون رو برای موبایل یا موبایلها میفرسته.

خب همین سرنخ کافی بود تا من برم و بیشتر بررسی کنم ببینم تکنولوژی‌های چت چی هستن و چطور میشه ازشون استفاده کرد. پروتکل‌های متفاوتی رو توی اینجا پیدا کردم. اما اکثرا یا ویژگی‌هایی داشتن که من نمیخواستم( مثلا ارسال صدا، تصویر و …) یا اینکه خیلی معمول نبودن یا مقبولیت عام نداشتن. پس از بررسی اولیه به نظرم استفاده از یکی از این دوتا پروتکل میتونه برامون push notification به همراه داشته باشه

فعلا همین!

پ.ن. این پست یه قسمت دیگه هم خواهد داشت که از منظر پیاده‌سازی به این موضوع نگاه میکنه.