ওয়েব পুশ নোটিফিকেশন অভ্যন্তরীণভাবে কীভাবে কাজ করে

আপনি নতুন মেসেজ, অর্ডারের আপডেট বা পেমেন্ট রিমাইন্ডারের জন্য নোটিফিকেশন দেখেন।

এটি দেখতে সহজ মনে হয়। আপনার ব্যাকএন্ড একটি মেসেজ পাঠায় এবং ব্যবহারকারী সেটি গ্রহণ করেন।

বাস্তবে, এই প্রক্রিয়ায় অনেকগুলো ধাপ জড়িত থাকে। আপনার ব্যাকএন্ড সরাসরি ব্রাউজারের সাথে কথা বলে না। পরিবর্তে, এটি একটি Push Service ব্যবহার করে।

Google Chrome ব্যবহার করে Firebase Cloud Messaging। Firefox ব্যবহার করে Mozilla Push Service।

কাজের ধারাটি এরকম:

Backend → Push Service → Browser → Service Worker → User

এখানে দেখানো হলো কীভাবে আপনি React এবং Golang ব্যবহার করে এই সিস্টেমটি তৈরি করবেন।

উপাদানসমূহ

  1. Frontend (React): অনুমতি অনুরোধ করে এবং একটি Service Worker রেজিস্টার করে।
  2. Service Worker: একটি ব্যাকগ্রাউন্ড স্ক্রিপ্ট যা ব্রাউজারে থাকে। আপনার ওয়েবসাইট বন্ধ থাকলেও এটি ইভেন্টগুলো হ্যান্ডেল করতে পারে।
  3. Backend (Golang): সাবস্ক্রিপশনগুলো সংরক্ষণ করে এবং এনক্রিপ্টেড মেসেজ পাঠায়।
  4. Push Service: একটি মধ্যস্থতাকারী যা ব্রাউজারে মেসেজ পৌঁছে দেয়।

সাবস্ক্রিপশন প্রবাহ

একটি মেসেজ পাঠাতে আপনার একটি সাবস্ক্রিপশন প্রয়োজন।

  • ব্যবহারকারী অনুমতি প্রদান করেন।
  • ব্রাউজার একটি সাবস্ক্রিপশন অবজেক্ট তৈরি করে যাতে একটি endpoint এবং সিকিউরিটি কী (security keys) থাকে।
  • আপনার React অ্যাপ এই অবজেক্টটি আপনার Golang ব্যাকএন্ডে পাঠায়।
  • আপনার ব্যাকএন্ড এটি একটি ডাটাবেসে সংরক্ষণ করে।

আপনার সার্ভার শনাক্ত করার জন্য আপনাকে অবশ্যই VAPID কী ব্যবহার করতে হবে। ফ্রন্টএন্ডের জন্য একটি public key এবং ব্যাকএন্ডের জন্য একটি private key ব্যবহার করুন। আপনার private key কখনোই শেয়ার করবেন না।

ইমপ্লিমেন্টেশন

React-এ, পুশ ইভেন্টগুলো শোনার জন্য আপনি একটি Service Worker রেজিস্টার করেন। এই ওয়ার্কারটি ব্যাকগ্রাউন্ডে চলে। এটি ডেটা গ্রহণ করে এবং ব্যবহারকারীকে নোটিফিকেশন দেখায়।

Golang-এ, এনক্রিপশন এবং VAPID অথেন্টিকেশন হ্যান্ডেল করার জন্য আপনি একটি লাইব্রেরি ব্যবহার করেন। আপনার সার্ভার ডাটাবেস থেকে সাবস্ক্রিপশনটি পড়ে, পেলোড (payload) এনক্রিপ্ট করে এবং ব্রাউজার পুশ সার্ভিসে পাঠিয়ে দেয়।

প্রোডাকশনের জন্য স্কেলিং

ছোট প্রজেক্টের জন্য একটি সাধারণ সেটআপ যথেষ্ট। কিন্তু একটি বড় সিস্টেমের জন্য আরও বেশি কিছুর প্রয়োজন।

  • একাধিক ডিভাইস হ্যান্ডেল করা: একজন ব্যবহারকারীর একটি ফোন এবং একটি ল্যাপটপ থাকতে পারে। প্রতিটি ব্যবহারকারীর জন্য একাধিক সাবস্ক্রিপশন সংরক্ষণ করুন।
  • ডেটা পরিষ্কার করা: সাবস্ক্রিপশনগুলোর মেয়াদ শেষ হয়ে যায়। আপনি যদি 404 বা 410 এরর পান, তবে আপনার ডাটাবেস থেকে সেই সাবস্ক্রিপশনটি মুছে ফেলুন।
  • Queues ব্যবহার করা: লক্ষ লক্ষ ব্যবহারকারীর জন্য Kafka বা এই জাতীয় কোনো টুল ব্যবহার করুন। এটি আপনার সিস্টেমকে অ্যাসিনক্রোনাসলি (asynchronously) নোটিফিকেশন প্রসেস করতে সাহায্য করে।
  • Retries ইমপ্লিমেন্ট করা: নেটওয়ার্ক ব্যর্থতা হ্যান্ডেল করার জন্য exponential backoff ব্যবহার করুন।

ব্যবহারকারী যখন সক্রিয় থাকেন তখন লাইভ চ্যাটের জন্য WebSockets ভালো। কিন্তু ট্যাব বন্ধ থাকা অবস্থায় ব্যবহারকারীর কাছে পৌঁছানোর জন্য Web Push বেশি কার্যকর।

উৎস: https://dev.to/chandu_bobbili_06/how-web-push-notifications-work-internally-implementing-with-react-golang-6m