مقدمه ای بر ( اعمال تغییرات آنی بین سرور و کلاینت )

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

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

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

 

۱ – ارتباط مداوم کلاینت سرور

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

   برای مثال هریک یا دو دقیقه یک بار به سرور درخواست بفرستد و سرور نیز شرایط فعلی کلاینت را بررسی کند و به آن جواب بدهد (response) که آیا محصول جدیدی اضافه شده یا نه.

عیب این روش این است که ممکت است برای ساعت ها محصولی به دیتابیس اضافه نشود و با ارسال درخواست های مکرر پروسس (process) اضافی در سرور داشته باشیم یا حتی ممکن است بعضی اوقات بخواهیم بازه ی زمانی ارسال درخواست را کاهش یا افزایش دهیم که این روش از کارایی و سرعت سرور ما می کاهد.

 

۲ – برقراری socket با سرور

در این روش کلاینت یک سوکت (Soket) با سرور برقرار می کند و سرور هر وقت تغییری در محصولاتش اتفاق بیفتد که نیاز باشد کلاینت از آن مطلع گردد ، به آن اطلاع می دهد . اگر تغییری (مثلا اضافه شدن یک محصول به فروشگاه) اتفاق بیفتد آنگاه سرور جزییات آن محصول را برای کلاینت ارسال می کند تا او از آن مطلع شود. این ارتباط مادامی که کلاینت به اینترنت وصل باشده حفظ می شود.

در این روش دیگر نیازی به ارسال درخواست های مکرر به سرور نیست و نسبت به روش اول بهتر است ولی عیب آن این است که اگر تعداد کلاینت هایی که به سرور سوکت زده اند زیاد شود دیگر سرور کارایی و سرعت لازم برای پاسخ دادن به همه سوکت ها را از دست می دهد.

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

(در آینده سرویس پوشر Pusher را معرفی می کنم که برای این کار مناسب است)

 

۳ – روش push Notification

در این روش هر وقت تغییری در سرور اتفاق بیفتد آنگاه سرور باید کلاینت را در صورت مرتبط بودن از این تغییر مطلع سازد. در این مقاله پیاده سازی این روش را بر روی گوشی های اندروید بررسی می کنیم.

در اندروید امکان استفاده از یکی از Api های گوگل به نام Google Cloud Messaging یا همان GCM فراهم شده است. GCM سرویسی است که به ما امکان ارسال اطلاعاتی را از سرور به کلاینت (در اینجا دیوایس های اندرویدی) می دهد. همچنین می توانیم اطلاعاتی را از کلاینت دریافت کنیم.

GCM همه ی حالات صف بندی پیام ها و اطمینان از به مقصد رسیدن آن را پشتیبانی می کند. این سرویس رایگان است و محدودیتی در دفعات استفاده نداد.

در این روش

۱- ابتدا device اندرویدی sender ID و application ID را برای ثبت نام به سرور GCM ارسال می کند .

۲ –  اگر این عملیات با موفقیت انجام شد ، آنگاه GCM به آن Device یک registration ID می دهد.

۳ – سپس device این کد را برای سرور ما ارسال می کن.

۴ – سرور این شناسه را در دیتابیس خود ذخیره می کند تا هروقت نیاز به ارسال اطلاعاتی به device بود از آن استفاده کند.

برای مثال اگر در سیستم فروشگاهی محصولی اضافه شود، آنگاه سرور این تغییر را از طریق GCM به کلاینت هایی که می خواهد ارسال می کند ، به این صورت که سرور یک پیام حاوی registration ID  و متن پیام به GCM ارسال می کند ، سپس GCM با ارسال یک Notification به کلاینت ، device را از وجود این تغییرات مطلع می سازد .

GCM برای تحویل دادن پیام به کلاینت نیاز به یک Broadcast Receiver در device دارد تا در صورت رسیدن پیام جدید آن را به اپلیکیشن ما بدهد. (Broadcast Receiver همیشه پیام هارا دریافت می کند حتی اگر اپلیکیشن destroy شده باشد)

در GCM پیام ها باید حداکثر دارای حجم ۴KB باشند. اگر بخواهیم دیتایی را به کلاینت منتقل کنیم که حجم آن از این مقدار بیشتر باشد (مثل یک عکس یا فایل) می توانیم url آن را از طریق پیام به کلاینت ارسال کنیم و به محض دریافت پیام توسط Broadcast Receiver سرویسی را اجرا کنیم تا با استفاده از url عکس یا فایل را از سرور بگیرد.

 

در این روش دیگر نیازی نیست تا ارتباط سرور یک ارتباط مداوم باشد و نقاط ضعف روش اول و دوم را پوشش می دهد.

از لحاظ امنیتی نیز این روش مناسب است زیرا می توان بین سرور و کلاینت session ایجاد کرد تا پیام هایی که به صورت غیر مستقیم توسط سرور برای کلاینت فرستاده می شوند فقط توسط کلاینت قابل استفاده باشند.

از این روش می توان برای هماهنگ کردن دیتابیس کلاینت با سرور ، اعمال تغییرات آنی ، چت سرور و … استفاده کرد.

 

منبع :

http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/

نویسنده : مهدی ملکی

برگرفته از سایت : http://iact.ir