১৪ ডিসে, ২০২৪·8 মিনিট পড়তে

মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম: টেমপ্লেট, রিট্রাই, পছন্দসমূহ

ইমেল, SMS এবং Telegram-এর জন্য টেমপ্লেট, ডেলিভারি স্ট্যাটাস, রিট্রাই ও ব্যবহারকারীর পছন্দসহ একটি মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম ডিজাইন করুন।

মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম: টেমপ্লেট, রিট্রাই, পছন্দসমূহ

একটি একক নোটিফিকেশন সিস্টেম কী সমাধান করে

ইমেল, SMS এবং Telegram যদি আলাদা আলাদা ফিচার হিসেবে নির্মিত হয়, তাতে দ্রুত ফাটল দেখা দেয়। একই সতর্কবার্তা তিন জায়গায় ভিন্নভাবে লেখার, ভিন্ন সময়ে পাঠানোর, এবং ভিন্ন নিয়ম হওয়ার ফলে সমর্থন দল তিনটি আলাদা সত্য অনুসরণ করতে থাকে: ইমেল প্রোভাইডার, SMS গেটওয়ে, এবং বট লোগ—প্রত্যেকটিতে আলাদা তথ্য।

একটি মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম এটাকে ঠিক করে কারণ এটি নোটিফিকেশনকে তিনটি ইন্টিগ্রেশন নয়—একটি প্রোডাক্ট হিসেবে দেখে। এক ইভেন্ট ঘটে (পাসওয়ার্ড রিসেট, ইনভয়েস পেইড, সার্ভার ডাউন), এবং সিস্টেম টেমপ্লেট, ব্যবহারকারী পছন্দ ও ডেলিভারি নিয়মের উপর ভিত্তি করে সিদ্ধান্ত নেয় কোন চ্যানেলে কীভাবে পৌঁছানো হবে। মেসেজটি প্রতিটি চ্যানেলে আলাদাভাবে ফরম্যাট করা যেতে পারে, তবে তার অর্থ, ডেটা এবং ট্র্যাকিং সঙ্গত থাকে।

অধিকাংশ টিমের জন্য ভিত্তি একইই দরকার — ভ্যার্সনড টেমপ্লেটস সহ ভ্যারিয়েবল, ডেলিভারি স্ট্যাটাস ট্র্যাকিং ("sent, delivered, failed, why"), যুক্তিসংগত রিট্রাই ও ফলব্যাক, কনসেন্ট ও কুইএট আওয়ারসসহ ব্যবহারকারীর পছন্দ, এবং একটি অডিট ট্রেইল যাতে সাপোর্ট অনুমান না করেই ঘটনাগুলো দেখতে পারে।

সাফল্য ভালভাবে ঘাসফুলের মতো ধীর ও স্থির: বার্তাগুলো পূর্বানুমানযোগ্য; সঠিক ব্যক্তি সঠিক কন্টেন্ট পায়, সঠিক সময়ে, তাদের অনুমোদিত চ্যানেলে। কিছু ভুল গেলে ট্রাবলশুটিং সোজা কারণ প্রতিটি প্রচেষ্টা একটি স্পষ্ট স্ট্যাটাস ও রিজন কোডসহ রেকর্ড করা থাকে।

একটি "নিউ লগইন" সতর্কবার্তা ধরুন। আপনি এটাকে একবার তৈরি করেন, একই ব্যবহারকারী, ডিভাইস এবং লোকেশন ডেটা দিয়ে ভরাট করেন, এবং পরে ইমেল হিসেবে বিস্তারিত, SMS হিসেবে জরুরিতা, এবং Telegram হিসেবে দ্রুত নিশ্চিতকরণ পাঠান। যদি SMS প্রোভাইডার টাইমআউট করে, সিস্টেম সময়সূচী অনুযায়ী রিট্রাই করে, টাইমআউট লগ করে, এবং সতর্কবার্তাটি ফেলে না দিয়ে অন্য চ্যানেলে ফলব্যাক করতে পারে।

মূল ধারণা এবং একটি সহজ ডেটা মডেল

একটি মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম পরিচালনাযোগ্য থাকে যখন আপনি "কেন নোটিফাই করছি"কে "কিভাবে ডেলিভারি করছি" থেকে আলাদা রাখেন। এর মানে কয়েকটি শেয়ার করা অবজেক্ট এবং শুধুমাত্র যেখানে সত্যিই ভিন্ন, সেখানে চ্যানেল-নির্দিষ্ট বিবরণ।

শুরু করুন একটি event-এর সাথে। একটি ইভেন্ট হলো নামকৃত ট্রিগার যেমন order_shipped বা password_reset। নামগুলো সঙ্গতিপূর্ণ রাখুন: ছোট হাতের অক্ষর, আন্ডারস্কোর, এবং যেখানে মানায় পাস্ট টেন্স ব্যবহার করুন। ইভেন্টটিকে একটি স্থিতিশীল চুক্তি হিসেবে দেখুন যাতে টেমপ্লেট ও পছন্দ নিয়ম নির্ভর করে।

একটি ইভেন্ট থেকে, একটি notification রেকর্ড তৈরি করুন। এটি ব্যবহারকারী-ফেসিং ইরাদাই: কার জন্য, কি ঘটেছে, এবং কোন ডেটা লোড করতে হবে কন্টেন্ট রেন্ডার করতে (অর্ডার নম্বর, ডেলিভারি তারিখ, রিসেট কোড)। এখানে শেয়ার করা ফিল্ডগুলো রাখুন যেমন user_id, event_name, locale, priority, এবং scheduled_at।

তারপর প্রতিটি চ্যানেলের জন্য messages-এ ভাগ করুন। একটি notification 0 থেকে 3 টি message তৈরি করতে পারে (ইমেল, SMS, Telegram)। Messages-এ চ্যানেল-নির্দিষ্ট ফিল্ড থাকে যেমন গন্তব্য (ইমেল ঠিকানা, ফোন, Telegram chat_id), template_id, এবং রেন্ডার করা কন্টেন্ট (ইমেলের subject/body, SMS-এর সংক্ষিপ্ত টেক্সট)।

অবশেষে প্রতিটি পাঠানোর চেষ্টা ট্র্যাক করুন একটি delivery attempt হিসেবে। Attempts-এ provider request_id, টাইমস্ট্যাম্প, response codes, এবং একটি নর্মালাইজড স্ট্যাটাস থাকে। ব্যবহারকারী যখন বলে, "আমি এটা পাইনি", তখন এটিই আপনি দেখতে চান।

একটি সোজা মডেল প্রায়শই চারটি টেবিল/কলেকশন-এ ফিট করে:

  • Event (অনুমোদিত ইভেন্ট নাম এবং ডিফল্টগুলোর ক্যাটালগ)
  • Notification (প্রতি ব্যবহারকারীর ইরাদায় একটি)
  • Message (প্রতি চ্যানেলের জন্য একটি)
  • DeliveryAttempt (প্রতি প্রচেষ্টার জন্য একটি)

আইডেম্পটেন্সি আগে থেকে পরিকল্পনা করুন। প্রতিটি notification-কে একটি ডিটারমিনিস্টিক কী দিন যেমন (event_name, user_id, external_ref) যাতে আপস্ট্রিম সিস্টেমের রিট্রাই ডুপ্লিকেট তৈরি না করে। একটি ওয়ার্কফ্লো ধাপে পুনরায় চললে, আইডেম্পটেন্সি কী ব্যবহারকারীকে দুইবার SMS পাওয়া থেকে রক্ষা করবে।

দীর্ঘমেয়াদে কেবল সেই তথ্য সংরক্ষণ করুন যা আপনি অডিট করার জন্য প্রয়োজন (event, notification, final status, timestamps)। শোর্ট-টর্ম ডেলিভারি কিউ এবং র উপাদান-পেইলোডগুলি কেবল তখনই রাখুন যতক্ষণ অবধি তা পরিচালনা ও ভুলত্রুটি নির্ধারণে দরকার।

ব্যবহারিক end-to-end ফ্লো (ধাপে ধাপে)

একটি মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম সবচেয়ে ভালো কাজ করে যখন আপনি "কী পাঠাবো সিদ্ধান্ত নেওয়া" এবং "পাঠানো" আলাদা রাখেন। এতে আপনার অ্যাপ দ্রুত থাকে এবং ব্যর্থতাগুলো পরিচালনা সহজ হয়।

একটি ব্যবহারিক ফ্লো দেখতে পারে:

  1. একটি ইভেন্ট প্রোডিউসার নোটিফিকেশন অনুরোধ তৈরি করে। এটি হতে পারে "password reset," "invoice paid," বা "ticket updated." অনুরোধে user ID, message type, এবং কনটেক্সট ডেটা (order number, amount, support agent name) থাকে। তৎক্ষণাৎ অনুরোধ সংরক্ষণ করুন যাতে একটি অডিট ট্রেইল থাকে।

  2. একটি রাউটার ব্যবহারকারী ও মেসেজ নিয়ম লোড করে। এটি ব্যবহারকারীর পছন্দ (অনুমোদিত চ্যানেল, অপ্ট-ইন, কুইএট আওয়ারস) এবং মেসেজ নিয়ম দেখবে (উদাহরণ: সিকিউরিটি অ্যালার্ম প্রথমে ইমেইল চেষ্টা করা উচিত)। রাউটার একটি চ্যানেল পরিকল্পনা ঠিক করে, যেমন Telegram, তারপর SMS, তারপর ইমেল।

  3. সিস্টেম প্রতিটি চ্যানেলের জন্য সেণ্ড জব এঙ্কিউ করে। প্রতিটি জবে একটি template key, চ্যানেল, এবং ভ্যারিয়েবল থাকে। জবগুলো একটি কিউতে যায় যাতে ব্যবহারকারীর অ্যাকশন পাঠানোর জন্য ব্লক না করে।

  4. চ্যানেল ওয়ার্কাররা প্রোভাইডার মারফত ডেলিভারি করে। ইমেইল SMTP বা ইমেল API-তে যায়, SMS SMS গেটওয়েতে যায়, Telegram আপনার বটের মাধ্যমে যায়। ওয়ার্কাররা আইডেম্পটেন্ট হওয়া উচিত, যাতে একই জব রিট্রাই করলে ডুপ্লিকেট না যায়।

  5. স্ট্যাটাস আপডেটগুলো এক জায়গায় ফিরে আসে। ওয়ার্কাররা queued, sent, failed, এবং যখন উপলব্ধ হয় তখন delivered রেকর্ড করে। যদি কোনো প্রোভাইডার কেবল "accepted" নিশ্চিত করে, সেটাও রেকর্ড করুন এবং delivered থেকে আলাদা হিসেবে বিবেচনা করুন।

  6. ফলব্যাক এবং রিট্রাই একই স্টেট থেকে চলে। যদি Telegram ব্যর্থ হয়, রাউটার (বা একটি রিট্রাই ওয়ার্কার) পরবর্তী SMS নির্ধারণ করতে পারে হারিয়ে যাওয়া কনটেক্সট ছাড়াই।

উদাহরণ: একটি ব্যবহারকারী পাসওয়ার্ড পরিবর্তন করে। আপনার ব্যাকেন্ড এক অনুরোধ ইমিট করে ব্যবহারকারী ও IP ঠিকানা সহ। রাউটার দেখে ব্যবহারকারী Telegram পছন্দ করে, কিন্তু রাতের কুইএট আওয়ার সেই চ্যানেল ব্লক করে, তাই ইমেল এখন নির্ধারণ করে এবং Telegram সকালে শিডিউল করে, সবগুলো একই notification রেকর্ডের অধীনে ট্র্যাক করা হচ্ছে।

আপনি যদি এটাকে AppMaster-এ বাস্তবায়ন করেন, তাহলে Request, Jobs, এবং Status টেবিলগুলো Data Designer-এ রাখুন এবং রাউটিং ও রিট্রাই লজিক Business Process Editor-এ প্রকাশ করুন; পাঠানো অ্যাসিঙ্ক্রোনাস রাখুন যাতে UI দ্রুত থাকে।

এমন টেমপ্লেট স্ট্রাকচার যা চ্যানেল জুড়ে কাজ করে

ভাল টেমপ্লেট সিস্টেম একটি ধারণা থেকে শুরু করে: আপনি একটি ইভেন্ট সম্পর্কে খবর দিচ্ছেন, ইমেল পাঠাচ্ছেন না বা SMS পাঠাচ্ছেন না। প্রতিটি ইভেন্টের জন্য একটি টেমপ্লেট তৈরি করুন (Password reset, Order shipped, Payment failed), তারপর সেই ইভেন্টের অধীনে চ্যানেল-ভ্যারিয়্যান্টগুলো রাখুন।

প্রতিটি চ্যানেল ভ্যারিয়েন্টে একই ভ্যারিয়েবলগুলো রাখুন। যদি ইমেল first_name এবং order_id ব্যবহার করে, SMS এবং Telegram-ও একই নাম ব্যবহার করা উচিত। এতে এমন সূক্ষ্ম বাগ রোধ হয় যেখানে এক চ্যানেল ঠিক রেন্ডার করে আর অন্যটি খালি দেখায়।

একটি সহজ, পুনরাবৃত্ত টেমপ্লেট রূপ

প্রতি ইভেন্টের জন্য প্রতিটি চ্যানেলে ছোট কিছু ফিল্ড নির্ধারণ করুন:

  • ইমেল: subject, preheader (ঐচ্ছিক), HTML body, টেক্সট ফ্যালব্যাক
  • SMS: প্লেইন টেক্সট বডি
  • Telegram: প্লেইন টেক্সট বডি, প্লাস ঐচ্ছিক বাটন বা সংক্ষিপ্ত মেটাডেটা

চ্যানেল অনুসারে যা বদলায় তা হলো ফরম্যাটিং, অর্থ নয়।

SMS-এর জন্য বিশেষ নিয়ম দরকার কারণ এটি সংক্ষিপ্ত। আগে থেকে ঠিক করে নিন কন্টেন্ট দীর্ঘ হলে কি হবে এবং তা সঙ্গতিপূর্ণ রাখুন: একটি ক্যারেক্টার লিমিট সেট করুন, ট্রাঙ্কেশনের নিয়ম বেছে নিন (কাট ও "..." যোগ করা বা প্রথমে ঐচ্ছিক লাইনগুলো ফেলে দেওয়া), দীর্ঘ URLs এবং অতিরিক্ত পাঁচাইচিহ্ন এড়ান, এবং কীগুলো আগে রাখুন (কোড, ডেডলাইন, পরবর্তী পদক্ষেপ)।

ব্যবসায়িক লজিক কপিয় না করে লোকালাইজেশন

ভাষাকে একটি প্যারামিটার হিসেবে নিন, আলাদা ওয়ার্কফ্লো হিসেবে নয়। প্রতিটি ইভেন্ট ও চ্যানেলের জন্য অনুবাদ সংরক্ষণ করুন, তারপর একই ভ্যারিয়েবল দিয়ে রেন্ডার করুন। "Order shipped"-এর লজিক একই থেকে_subject_ ও বডি locale অনুযায়ী বদলাবে।

একটি প্রিভিউ মোড খুব কাজে দেয়। নমুনা ডেটা (লম্বা নামসহ এজ কেস) দিয়ে টেমপ্লেট রেন্ডার করে সাপোর্ট নিশ্চিত করতে পারে যে ইমেল, SMS, ও Telegram ভ্যারিয়্যান্টগুলো লাইভ হওয়ার আগে ঠিক আছে।

বিশ্বাসযোগ্য ও ডিবাগযোগ্য ডেলিভারি স্ট্যাটাস

টেমপ্লেট ভ্যারিয়্যান্ট দ্রুত সেট করুন
প্রতিটি ইভেন্টের জন্য একটিই টেমপ্লেট স্ট্রাকচার রেখে চ্যানেলগুলোর মধ্যে ভ্যারিয়েবল সঙ্গত রাখুন।
টেমপ্লেট তৈরি করুন

একটি নোটিফিকেশন তখনই কার্যকর যখন আপনি পরে জিজ্ঞাসা করতে পারেন: এটাতে কি ঘটেছে? একটি ভালো মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম মেসেজটি যা পাঠাতে চেয়েছিল সেটাকে আলাদা রাখে প্রতিটি ডেলিভারি প্রচেষ্টার থেকে।

ছোট একটি শেয়ার করা স্ট্যাটাস সেট দিয়ে শুরু করুন যা ইমেল, SMS, এবং Telegram-এ একই অর্থ বহন করে:

  • queued: আপনার সিস্টেম দ্বারা গ্রহণ, ওয়ার্কার অপেক্ষায়
  • sending: একটি ডেলিভারি প্রচেষ্টা চলমান
  • sent: সফলভাবে প্রোভাইডার API-কে হস্তান্তর
  • failed: প্রচেষ্টা ত্রুটির সাথে শেষ হয়েছে, যার উপর আপনি কাজ করতে পারেন
  • delivered: ব্যবহারকারীর কাছে পৌঁছেছে বলে প্রমাণ আছে (যদি সম্ভব)

এই স্ট্যাটাসগুলো মেইন message রেকর্ডে রাখুন, কিন্তু প্রতিটি প্রচেষ্টার ইতিহাস টেবিলে ট্র্যাক করুন। ঐ ইতিহাসটিই ডিবাগ সহজ করে: অ্যাটেম্পট #1 ব্যর্থ (টাইমআউট), #2 সফল; অথবা SMS ঠিক ছিল কিন্তু ইমেইল বাউন্স করে গেছে।

প্রতিটি অ্যাটেম্পটে কী সংরক্ষণ করবেন

প্রোভাইডার রেস্পন্সগুলো নর্মালাইজ করুন যাতে আপনি সার্চ ও গ্রুপ করতে পারেন এমনকি বিভিন্ন প্রোভাইডার বিভিন্ন শব্দ ব্যবহার করলেও।

  • provider_name এবং provider_message_id
  • response_code (নর্মালাইজড কোড যেমন TIMEOUT, INVALID_NUMBER, BOUNCED)
  • raw_provider_code এবং raw_error_text (সাপোর্ট কেসের জন্য)
  • started_at, finished_at, duration_ms
  • channel (email, sms, telegram) এবং destination (মাস্ক করা)

আংশিক সফলতার জন্য পরিকল্পনা করুন। একটি notification তিনটি চ্যানেল মেসেজ তৈরি করতে পারে যেগুলো একই parent_id এবং ব্যবসায়িক কনটেক্সট (order_id, ticket_id, alert_type) শেয়ার করে। যদি SMS চলে যায় কিন্তু ইমেইল ব্যর্থ হয়, তখনও আপনি পুরো গল্প এক জায়গায় দেখতে চান, তিনটি আলাদা ঘটনার মতো নয়।

"delivered" আসলে কী মানে

"Sent" মানে "delivered" নয়। Telegram-এ আপনি হয়তো কেবল API-র acceptance জানেন। SMS ও ইমেইলে ডেলিভারি প্রায়ই ওয়েবহুক বা প্রোভাইডার কলব্যাকের উপর নির্ভর করে, এবং সব প্রোভাইডার সমান নির্ভরযোগ্য নয়।

প্রতি চ্যানেল আগে থেকেই delivered সংজ্ঞা নির্ধারণ করুন। যখন ওয়েবহুক-নিশ্চিত ডেলিভারি পাওয়া যায় তখন সেটা ব্যবহার করুন; অন্যথায় delivered অনিশ্চিত ধরে রাখুন এবং রিপোর্টে sent দেখান। এতে আপনার রিপোর্টিং সৎ থাকে এবং সাপোর্টের উত্তরগুলো ধারাবাহিক থাকে।

রিট্রাই, ফলব্যাক, এবং কখন চেষ্টা বন্ধ করবেন

রিট্রাই বেশিরভাগ সময় নোটিফিকেশন সিস্টেমগুলোতে সমস্যার কারণ হয়। অতিদ্রুত রিট্রাই করলে আপনি স্টর্ম তৈরি করবেন। অনন্তকাল রিট্রাই করলে ডুপ্লিকেট এবং সাপোর্ট সমস্যা হবে। লক্ষ্যটি সহজ: যখন সাফল্যের বাস্তব সম্ভবনা থাকে তখন পুনরায় চেষ্টা করুন, এবং যখন না তখন বন্ধ করে দিন।

প্রথমে ত্রুটিগুলো শ্রেণীবদ্ধ করুন। একটি ইমেল প্রোভাইডারের টাইমআউট, একটি SMS গেটওয়ের 502, বা একটি সাময়িক Telegram API ত্রুটি সাধারণত রিট্রাই করা যায়। একটি ভুল ফরম্যাট করা ইমেল ঠিকানা, একটি ফোন নম্বর যা ভ্যালিডেশন ফেইল করে, বা Telegram চ্যাট যেখানে আপনার বট ব্লক করা আছে—এসব নয়। এগুলো একইভাবে বিবেচনা করলে টাকা নষ্ট হয় এবং লগ ভরে যায়।

একটি ব্যবহারিক রিট্রাই পরিকল্পনা সীমাবদ্ধ এবং ব্যাকঅফ ব্যবহার করে:

  • অ্যাটেম্পট 1: এখনই পাঠান
  • অ্যাটেম্পট 2: 30 সেকেন্ড পরে
  • অ্যাটেম্পট 3: 2 মিনিট পরে
  • অ্যাটেম্পট 4: 10 মিনিট পরে
  • একটি ম্যাক্স এজের পরে বন্ধ করুন (উদাহরণ: অ্যালার্টগুলোর জন্য 30–60 মিনিট)

স্টপ করার জন্য আপনার ডেটা মডেলে একটি বাস্তব জায়গা রাখুন। রিট্রাই সীমা ছাড়ালে মেসেজকে dead-letter (বা failed-permanently) হিসেবে চিহ্নিত করুন। শেষ ত্রুটি কোড ও একটি সংক্ষিপ্ত ত্রুটি মেসেজ রাখুন যাতে সাপোর্ট অনুমান না করেই কাজ করতে পারে।

সাফল্যের পরে পুনরায় পাঠানো প্রতিরোধ করতে আইডেম্পটেন্সি ব্যবহার করুন। প্রতিটি লজিকাল মেসেজের জন্য একটি আইডেম্পটেন্সি কী তৈরি করুন (সাধারণত notification_id + user_id + channel)। যদি প্রোভাইডার দেরিতে রেসপন্ড করে এবং আপনি রিট্রাই করেন, দ্বিতীয় প্রচেষ্টাকে ডুপ্লিকেট হিসেবে চিনে স্কিপ করা উচিত।

ফলব্যাকগুলো হঠাৎ আতঙ্কে স্বয়ংক্রিয় হওয়া উচিত নয়। গুরুত্ব ও সময়ের উপর ভিত্তি করে এসক্যালেশন নিয়ম নির্ধারণ করুন। উদাহরণ: পাসওয়ার্ড রিসেট আরেক চ্যানেলে ফলব্যাক করা উচিত নয় (গোপনীয়তার ঝুঁকি), কিন্তু প্রোডাকশন ইনসিডেন্ট অ্যালার্ম দুইবার Telegram ব্যর্থ হলে SMS চেষ্টা করতে পারে, এরপর 10 মিনিট পরে ইমেইল চেষ্টা করতে পারে।

ব্যবহারকারীর পছন্দ, কনসেন্ট, এবং কুইএট আওয়ারস

স্ট্যাটাস ডিবাগ করা সহজ করুন
প্রতিটি অ্যাটেম্পট, স্ট্যাটাস এবং ত্রুটির কারণ দেখাবে এমন সাপোর্ট-ফ্রেন্ডলি ভিউ দিন।
ড্যাশবোর্ড তৈরি করুন

একটি নোটিফিকেশন সিস্টেম তখনই "স্মার্ট" লাগে যখন এটি মানুষের পছন্দকে সম্মান করে। সবচেয়ে সহজ উপায় হল ব্যবহারকারীদের নোটিফিকেশন টাইপভিত্তিক চ্যানেল বেছে নেওয়ার সুযোগ দেয়া। অনেক টিম টাইপগুলোকে security, account, product, এবং marketing-এ ভাগ করে কারণ নিয়ম ও আইনি দাবি আলাদা হয়।

একটি পছন্দ মডেল শুরু করুন যা তখনও কাজ করবে যখন একটি চ্যানেল উপলব্ধ থাকবে না। ব্যবহারকারীর কাছে ইমেল থাকতে পারে কিন্তু ফোন নম্বর না থাকতে পারে, অথবা তারা Telegram সংযুক্ত করে নি। আপনার সিস্টেমকে এটি স্বাভাবিক হিসেবে বিবেচনা করা উচিত, ত্রুটিস্বরূপ নয়।

অধিকাংশ সিস্টেমে একটি সংক্ষিপ্ত সেট ফিল্ড লাগে: notification type (security, marketing, billing), প্রতিটি টাইপে অনুমোদিত চ্যানেল (email, SMS, Telegram), চ্যানেলভিত্তিক কনসেন্ট (তারিখ/সময়, সোর্স, প্রমাণ যদি প্রয়োজন), চ্যানেল-ভিত্তিক অপ্ট-আউট কারণ (ব্যবহারকারী পছন্দ, বাউন্সড ইমেইল, "STOP" উত্তর), এবং একটি কুইএট আওয়ার নিয়ম (শুরু/শেষ প্লাস ব্যবহারকারীর টাইমজোন)।

কুইএট আওয়ারসই সেই জায়গা যেখানে সিস্টেমগুলো প্রায়ই ভেঙে পড়ে। ব্যবহারকারীর টাইমজোন সংরক্ষণ করুন (শুধু অফসেট নয়) যাতে ডে-লাইট সেভিংস পরিবর্তন কাউকে অবাক না করে। যখন কোনও মেসেজ কুইএট আওয়ারে শিডিউল করা হয়, তাকে ব্যর্থ হিসেবে গণ্য করবেন না। তাকে deferred হিসেবে চিহ্নিত করুন এবং পরবর্তী অনুমোদিত পাঠানোর সময় নির্ধারণ করুন।

ডিফল্ট গুরুত্বপূর্ণ, বিশেষ করে গুরুত্বপূর্ণ অ্যালার্মগুলোর জন্য। একটি সাধারণ পদ্ধতি: সিকিউরিটি নোটিফিকেশন কুইএট আওয়ার উপেক্ষা করে (তবে কঠোর অপ্ট-আউট যেখানে প্রয়োজন সেগুলো মানে), যখন অ-ক্রিটিক্যাল আপডেট কুইএট আওয়ার ও চ্যানেল পছন্দ অনুসরণ করে।

উদাহরণ: একটি পাসওয়ার্ড রিসেট দ্রুততম অনুমোদিত চ্যানেলে তৎক্ষণাৎ পাঠানো উচিত। একটি সাপ্তাহিক ডাইজেস্ট সকালে পাঠানো উচিত এবং SMS স্কিপ করা উচিত যদি ব্যবহারকারী স্পষ্টভাবে সেট না করে।

অপারেশন: মনিটরিং, লগস, এবং সাপোর্ট ওয়ার্কফ্লো

মাল্টি-চ্যানেল ডেলিভারি দ্রুত চালু করুন
ট্র্যাকিং এক স্থানে রেখে Telegram, ইমেল এবং SMS ইন্টিগ্রেশনগুলো ওয়্যার-আপ করুন।
চ্যানেল সংযুক্ত করুন

যখন নোটিফিকেশন ইমেল, SMS, এবং Telegram স্পর্শ করে, সাপোর্ট দল দ্রুত উত্তর জানতে চায়: আমরা কি পাঠিয়েছি, কি পৌঁছেছে, এবং কি ব্যর্থ হয়েছে? একটি মাল্টি-চ্যানেল সিস্টেম এমনভাবে লাগা উচিত যেন ভিতরে কয়েকটি প্রোভাইডার থাকলেও তদন্তের জন্য একটি জায়গা থাকে।

একটি সহজ অ্যাডমিন ভিউ দিয়ে শুরু করুন যা কেউ ব্যবহার করতে পারে। ব্যাবহারকারী, ইভেন্ট টাইপ, স্ট্যাটাস, এবং টাইম উইন্ডো অনুযায়ী সার্চযোগ্য করুন, এবং নতুন অ্যাটেম্পট প্রথমে দেখান। প্রতিটি সারি চ্যানেল, প্রোভাইডার রেসপন্স, এবং পরবর্তী পরিকল্পিত একশন (রিট্রাই, ফলব্যাক, বা স্টপ) দেখাবে।

সমস্যা ধরতে যে মেট্রিক্সগুলো দরকার

আউটেজ সাধারণত এক পরিষ্কার ত্রুটি হিসেবে আসে না। কয়েকটি গুরুত্বপূর্ণ সংখ্যা ট্র্যাক করুন এবং নিয়মিত পর্যালোচনা করুন:

  • প্রতিটি চ্যানেলের পাঠানোর হার (মেসেজ/মিনিট)
  • প্রোভাইডার ও ত্রুটি কোড অনুযায়ী ব্যর্থতার হার
  • রিট্রাই হার (কত মেসেজে দ্বিতীয় প্রচেষ্টা লাগলো)
  • ডেলিভারির সময় (queued থেকে delivered, p50 এবং p95)
  • ড্রপ হার (ব্যবহারকারীর পছন্দ, কনসেন্ট, বা ম্যাক্স রিট্রাইয়ের কারণে স্টপ)

সবকিছুকে করেলেট করুন। ইভেন্ট ঘটার সময় একটি করেলেশন ID জেনারেট করুন (যেমন "invoice overdue") এবং এটাকে টেমপ্লেটিং, কিউইং, প্রোভাইডার কল, এবং স্ট্যাটাস আপডেটে পাঠান। লগগুলোতে সেই ID হচ্ছে থ্রেড যা অনুসরণ করে বোঝা যায় কিভাবে একটি ইভেন্ট একাধিক চ্যানেলে ছড়ায়।

সাপোর্ট-ফ্রেন্ডলি রিপ্লে বাগার্ড

রিপ্লে জরুরি, কিন্তু গার্ডরেইল দরকার যাতে আপনি মানুষকে স্প্যাম না করেন বা দ্বিগুণ চার্জ না করেন। একটি নিরাপদ রিপ্লে ফ্লো সাধারণত মানে: কেবল একটি নির্দিষ্ট message ID পুনরায় পাঠান (পুরো ইভেন্ট ব্যাচ নয়), পাঠানোর আগে নির্দিষ্ট টেমপ্লেট ভার্সন ও রেন্ডার করা কন্টেন্ট দেখান, রিপ্লে ট্রিগার করার জন্য একটি কারণ এবং কে ট্রিগার করল তা সংরক্ষণ করুন, যদি মেসেজ ইতিমধ্যেই ডেলিভার্ড হয়ে থাকে তাহলে ব্লক করুন (নির্দিষ্টভাবে জোর করে না বলা হলে), এবং ব্যবহারকারী ও চ্যানেলভিত্তিক রেট লিমিট প্রয়োগ করুন।

নোটিফিকেশনগুলোর জন্য নিরাপত্তা ও פרטগতরণ মূলনীতি

একটি মাল্টি-চ্যানেল সিস্টেম ব্যক্তিগত ডেটা (ইমেল, ফোন নম্বর, চ্যাট আইডি) স্পর্শ করে এবং সংবেদনশীল মুহূর্ত (লগইন, পেমেন্ট, সাপোর্ট) কভার করে। ধরে নিন প্রতিটি মেসেজ বডি ও প্রতিটি লগ লাইন পরে দেখা হতে পারে, তারপর ডিজাইন করুন কী সংরক্ষণ করা হবে এবং কে তা দেখতে পারবে।

যেখানে সম্ভব, টেমপ্লেটে সংবেদনশীল ডেটা রাখবেন না। একটি টেমপ্লেট পুনব্যবহারযোগ্য ও সাধারণ হওয়া উচিত: "Your code is {{code}}" ঠিক আছে, তবে পুরো অ্যাকাউন্ট ডিটেইলস, লম্বা টোকেন, বা এমন কিছু যা অ্যাকাউন্ট দখলের জন্য ব্যবহার হতে পারে তা এড়িয়ে চলুন। যদি মেসেজে ওয়ান-টাইম কোড বা রিসেট টোকেন থাকা জরুরি হয়, যাচাই করার জন্য কেবল যা দরকার (যেমন হ্যাশ ও মেয়াদ) সংরক্ষণ করুন, কাঁচা মান নয়।

নোটিফিকেশন ইভেন্টগুলো সংরক্ষণ বা লগ করার সময় কড়া মাস্কিং করুন। একটি সাপোর্ট এজেন্ট সাধারণত জানতে চায় যে কোড পাঠানো হয়েছে, কোডটা কী ছিল না। একইভাবে ফোন নম্বর ও ইমেল: ডেলিভারির জন্য পুরো মান সংরক্ষণ করুন, কিন্তু বেশিরভাগ স্ক্রিনে মাস্ক করা ভার্সন দেখান।

অনেকে ইনসিডেন্ট প্রতিরোধ করে এমন ন্যূনতম নিয়ন্ত্রণ

  • রোল-ভিত্তিক অ্যাক্সেস: কেবল কিছু নির্দিষ্ট রোল মেসেজ বডি ও পুরো রিসিপিয়েন্ট তথ্য দেখতে পারবে।
  • ডিবাগ অ্যাক্সেস আলাদা রাখুন সাপোর্ট অ্যাক্সেস থেকে যাতে ট্রাবলশুটিং প্রাইভেসি লিক না করে।
  • ওয়েবহুক এন্ডপয়েন্টগুলো সুরক্ষিত করুন: সাইন করা কলব্যাক বা শেয়ার্ড সিক্রেট ব্যবহার করুন, টাইমস্ট্যাম্প ভ্যালিডেট করুন, এবং অচেনা সোর্স রিজেক্ট করুন।
  • রেস্ট-এ সংবেদনশীল ফিল্ড এনক্রিপ্ট করুন এবং ট্রানজিট-এ TLS ব্যবহার করুন।
  • রিটেনশন নিয়ম নির্ধারণ করুন: বিস্তারিত লগ সাময়িকভাবে রাখুন, তারপর কেবল অ্যাগ্রিগেট বা হ্যাশ আইডেন্টিফায়ার রাখুন।

একটি ব্যবহারিক উদাহরণ: যদি পাসওয়ার্ড রিসেট SMS ব্যর্থ হয় এবং আপনি Telegram-এ ফলব্যাক করেন, তাহলে চেষ্টা, প্রোভাইডার স্ট্যাটাস, এবং মাস্ক করা রিসিপিয়েন্ট স্টোর করুন, কিন্তু রিসেট লিঙ্ক নিজেকে ডাটাবেস বা লগে রাখবেন না।

উদাহরণ সিনারিও: একটাই অ্যালার্ম, তিনটি চ্যানেল, বাস্তব ফলাফল

ডিজাইনে ব্যবহারকারী পছন্দ সম্মান করুন
চ্যানেল-পছন্দ, কনসেন্ট এবং কুইএট আওয়ারস প্রয়োগ করুন—চ্যানেলভিত্তিক লজিক বিভক্ত না করে।
পছন্দ সেট করুন

একজন গ্রাহক, Maya, দুটি নোটিফিকেশন টাইপ সক্ষম করে রেখেছেন: Password reset এবং New login। তিনি Telegram-কে প্রথম পছন্দ দেন, তারপর ইমেল। তিনি কেবল password reset-এর জন্য SMS-কে ফেলব্যাক হিসেবে রাখতে চান।

এক সন্ধ্যায়, Maya পাসওয়ার্ড রিসেট অনুরোধ করেন। সিস্টেম একটি স্টেবল ID সহ একক notification রেকর্ড তৈরি করে, তারপর তাঁর বর্তমান পছন্দ অনুযায়ী চ্যানেল অ্যাটেম্পটগুলো প্রসারিত করে।

Maya যে দেখেন তা সহজ: কয়েক সেকেন্ডের মধ্যে Telegram মেসেজ আসে একটি সংক্ষিপ্ত রিসেট কোড ও মেয়াদসহ। আর কিছু আসে না কারণ Telegram সফল হয় এবং কোনো ফলব্যাক প্রয়োজন পড়ে না।

সিস্টেম যা রেকর্ড করে তা আরও বিস্তারিত:

  • Notification: type=PASSWORD_RESET, user_id=Maya, template_version=v4
  • Attempt #1: channel=TELEGRAM, status=SENT তারপর DELIVERED
  • ইমেল বা SMS অ্যাটেম্পটগুলো তৈরি হয়নি (নীতি: প্রথম সাফল্যের পরে থামো)

সপ্তাহের পরে, New login অ্যালার্ট ট্রিগার হয় একটি নতুন ডিভাইস থেকে। Maya লগইন এলার্টে Telegram-ই পছন্দ করেন। সিস্টেম Telegram পাঠায়, কিন্তু Telegram প্রোভাইডার সাময়িক ত্রুটি দেয়। সিস্টেম দুবার ব্যাকঅফসহ রিট্রাই করে, তারপর অ্যাটেম্পটটিকে FAILED হিসেবে চিহ্নিত করে ও থামে (এই টাইপের জন্য ফলব্যাক নেই)।

এখন একটি বাস্তব ব্যর্থতা: Maya ভ্রমণে থাকেন এবং আরেকটি পাসওয়ার্ড রিসেট চান। Telegram পাঠানো হয়, কিন্তু 60 সেকেন্ডের মধ্যে ডেলিভারি নিশ্চিত না হলে SMS ফলব্যাক কনফিগার করা আছে। SMS প্রোভাইডার টাইমআউট করে। সিস্টেম টাইমআউট রেকর্ড করে, একবার রিট্রাই করে, এবং দ্বিতীয় প্রচেষ্টা সফল হয়। Maya এক মিনিট পরে SMS কোড পান।

Maya যদি সাপোর্টে যোগাযোগ করেন, তারা ব্যবহারকারী ও সময় উইন্ডো দিয়ে সার্চ করে এবং দ্রুত অ্যাটেম্পট ইতিহাস দেখতে পায়: টাইমস্ট্যাম্প, প্রোভাইডার রেসপন্স কোড, রিট্রাই কাউন্ট, এবং চূড়ান্ত ফলাফল।

দ্রুত চেকলিস্ট, সাধারণ ভুল, এবং পরবর্তী ধাপ

একটি মাল্টি-চ্যানেল নোটিফিকেশন সিস্টেম পরিচালনা করা সহজ হয় যখন আপনি দ্রুত দুটি প্রশ্নের জবাব দিতে পারেন: "আমরা ঠিক কী পাঠানোর চেষ্টা করেছি?" এবং "তার পরে কি ঘটেছে?" চ্যানেল বা ইভেন্ট বাড়ানোর আগে এই চেকলিস্ট ব্যবহার করুন।

দ্রুত চেকলিস্ট

  • স্পষ্ট ইভেন্ট নাম ও কর্তৃত্ব (উদাহরণ: invoice.overdue—বিলিং টিমের মালিকানা)
  • টেমপ্লেট ভ্যারিয়েবল একবার সংজ্ঞায়িত করা (প্রয়োজনীয় বনাম ঐচ্ছিক, ডিফল্ট, ফরম্যাটিং নিয়ম)
  • স্ট্যাটাসগুলি আগে থেকে নির্ধারণ করা (created, queued, sent, delivered, failed, suppressed) এবং প্রতিটির মানে
  • রিট্রাই সীমা ও ব্যাকঅফ (ম্যাক্স অ্যাটেম্পট, ব্যবধান, স্টপ নিয়ম)
  • রিটেনশন নিয়ম (কতদিন message বডি, প্রোভাইডার রেসপন্স, এবং স্ট্যাটাস ইতিহাস রাখবেন)

আপনি যদি কেবল একটাই কাজ করেন, plain ভাষায় sent ও delivered-এর তফাত লিখে রাখুন। Sent হচ্ছে আপনার সিস্টেম যা করেছে। Delivered হচ্ছে প্রোভাইডার যা রিপোর্ট করেছে (এটি দেরিতে বা অনুপলব্ধ হতে পারে)। এ দুটো মিশ্রিত করলে সাপোর্ট দল ও স্টেকহোল্ডারদের বিভ্রান্তি হবে।

টিপিক্যাল ভুলগুলো যা এড়াতে হবে

  • sent-কে সফল হিসেবে ধরে নিয়ে ডেলিভারি রেট বাড়িয়ে দেখানো
  • চ্যানেল-নির্দিষ্ট টেমপ্লেটগুলো ভিন্নভাবে বাড়তে দেওয়া যাতে ইমেল, SMS, Telegram একে অপরের সঙ্গে বিরোধ সৃষ্টি করে
  • আইডেম্পটেন্সি ছাড়া রিট্রাই করা, যার ফলে প্রোভাইডার টাইমআউট করে পরে মেসেজ গ্রহণ করলে ডুপ্লিকেট হয়
  • অনন্তকাল রিট্রাই করা, সাময়িক আউটেজকে একটি গোলমাল ইন্সিডেন্টে পরিণত করা
  • "শুধু কেসের জন্য" অতিরিক্ত ব্যক্তিগত ডেটা লগ করা

একটি ইভেন্ট এবং একটি প্রাথমিক চ্যানেল দিয়ে শুরু করুন, তারপর একটি দ্বিতীয় চ্যানেল ফলব্যাক হিসেবে যোগ করুন (প্যারালাল ব্লাস্ট নয়)। ফ্লো স্থিতিশীল হলে ইভেন্টানুক্ষণে বিস্তার করুন, টেমপ্লেট ও ভ্যারিয়েবল শেয়ার করে রাখুন যাতে মেসেজগুলো সঙ্গত থাকে।

আপনি যদি প্রতিটি অংশ হাতে কোড না করে তৈরি করতে চান, AppMaster (appmaster.io) মূল অংশগুলো জন্য প্র্যাকটিক্যাল: Data Designer-এ ইভেন্ট, টেমপ্লেট, এবং ডেলিভারি অ্যাটেম্পট মডেল করুন, Business Process Editor-এ রাউটিং ও রিট্রাই তোলুন, এবং ইমেল, SMS, Telegram ইন্টিগ্রেশনগুলো সংযুক্ত করুন—সবসময় স্ট্যাটাস ট্র্যাকিং এক জায়গায় রাখলে সুবিধা হয়।

শুরু করা সহজ
কিছু আশ্চর্যজনকতৈরি করুন

বিনামূল্যের পরিকল্পনা সহ অ্যাপমাস্টারের সাথে পরীক্ষা করুন।
আপনি যখন প্রস্তুত হবেন তখন আপনি সঠিক সদস্যতা বেছে নিতে পারেন৷

এবার শুরু করা যাক