ওয়েবহুকস ব্যাখ্যা: সাইনড পেলোড এবং পুনঃপ্রচেষ্টা
আপনি সবেমাত্র একটি পেমেন্ট প্রোভাইডারের ওয়েবহুক ইন্টিগ্রেট করেছেন লেনদেনের আপডেট পেতে। পরীক্ষায় সবকিছু কাজ করে, কিন্তু প্রোডাকশনে আপনি ট্র্যাফিক স্পাইকের সময় ইভেন্ট মিসিং বা প্রোভাইডার পুনঃপ্রচেষ্টা করার সময় ডুপ্লিকেট চার্জ লক্ষ্য করেন। ওয়েবহুকস ধারণায় সহজ কিন্তু বাস্তবে জটিল: তারা নেটওয়ার্ক সীমানা অতিক্রম করে, বিলম্বিত, ডুপ্লিকেট বা স্পুফ করা যেতে পারে। এই নিবন্ধে ব্যাখ্যা করা হয়েছে কীভাবে সাইনড পেলোড এবং স্মার্ট পুনঃপ্রচেষ্টা কৌশল ব্যবহার করে শক্তিশালী ওয়েবহুক কনজিউমার এবং প্রোডিউসার তৈরি করা যায়।
ওয়েবহুকস কী?
ওয়েবহুকস হল ইভেন্ট দ্বারা ট্রিগার করা ব্যবহারকারী-সংজ্ঞায়িত HTTP কলব্যাক। যখন সোর্স সিস্টেমে কিছু ঘটে (যেমন, একটি নতুন অর্ডার), তখন এটি আপনার দেওয়া URL-এ একটি HTTP POST অনুরোধ পাঠায়। পোলিংয়ের বিপরীতে, ওয়েবহুকস প্রায় রিয়েল-টাইমে ডেটা পুশ করে, লেটেন্সি এবং সার্ভার লোড কমায়।
তবে, ওয়েবহুকস চ্যালেঞ্জ নিয়ে আসে: অনুরোধটি প্রকৃতপক্ষে প্রত্যাশিত প্রেরকের কাছ থেকে এসেছে কিনা তা নিশ্চিত করা, ব্যর্থতাগুলি সুন্দরভাবে পরিচালনা করা এবং ডুপ্লিকেট প্রসেসিং এড়ানো।
সাইনড পেলোড দিয়ে ওয়েবহুকস সুরক্ষিত করা
যাচাইকরণ ছাড়া, যে কেউ আপনার ওয়েবহুক এন্ডপয়েন্টে জাল অনুরোধ পাঠাতে পারে। সাইনড পেলোডগুলি একটি ক্রিপ্টোগ্রাফিক স্বাক্ষর অন্তর্ভুক্ত করে যা আপনি যাচাই করতে পারেন।
HMAC স্বাক্ষর কীভাবে কাজ করে
প্রেরক একটি শেয়ার্ড সিক্রেট এবং অনুরোধের বডি ব্যবহার করে একটি হ্যাশ-ভিত্তিক মেসেজ অথেন্টিকেশন কোড (HMAC) গণনা করেন। স্বাক্ষরটি একটি হেডারে পাঠানো হয় (যেমন, X-Signature)। আপনি আপনার দিকে HMAC পুনরায় গণনা করেন এবং তুলনা করেন।
// Node.js উদাহরণ: একটি ওয়েবহুক স্বাক্ষর যাচাই করা
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
টাইমিং আক্রমণ প্রতিরোধ করতে সর্বদা timingSafeEqual এর মতো একটি ধ্রুবক-সময় তুলনা ফাংশন ব্যবহার করুন।
একটি টাইমস্ট্যাম্প অন্তর্ভুক্ত করুন
রিপ্লে আক্রমণ প্রতিরোধ করতে, সাইনড পেলোডে একটি টাইমস্ট্যাম্প অন্তর্ভুক্ত করুন এবং কয়েক মিনিটের বেশি পুরানো অনুরোধ প্রত্যাখ্যান করুন (যেমন, ৫ মিনিট)। টাইমস্ট্যাম্পটি সাইনড ডেটার অংশ হওয়া উচিত।
নির্ভরযোগ্য পুনঃপ্রচেষ্টা প্রয়োগ করা
নেটওয়ার্ক সমস্যা বা সাময়িক সার্ভার ত্রুটির কারণে ওয়েবহুক ডেলিভারি ব্যর্থ হতে পারে। একটি শক্তিশালী প্রেরক ব্যর্থ ডেলিভারিগুলি এক্সপোনেনশিয়াল ব্যাকঅফের সাথে পুনঃপ্রচেষ্টা করে।
পুনঃপ্রচেষ্টা কৌশল
- এক্সপোনেনশিয়াল ব্যাকঅফ: প্রতিটি পুনঃপ্রচেষ্টার মধ্যে বেশি সময় অপেক্ষা করুন (যেমন, ১সে, ২সে, ৪সে, ৮সে...)।
- সর্বোচ্চ পুনঃপ্রচেষ্টা: অসীম লুপ এড়াতে একটি সীমা নির্ধারণ করুন (যেমন, ৫টি প্রচেষ্টা)।
- ডেড-লেটার কিউ: সর্বোচ্চ পুনঃপ্রচেষ্টার পরে, ম্যানুয়াল পরিদর্শনের জন্য ইভেন্টটি সংরক্ষণ করুন।
- আইডেম্পোটেন্সি: একটি অনন্য ইভেন্ট আইডি অন্তর্ভুক্ত করুন যাতে রিসিভার ডুপ্লিকেট করতে পারে।
উদাহরণ: পাইথনে ব্যাকঅফ সহ পুনঃপ্রচেষ্টা
import time
import requests
from requests.exceptions import RequestException
def send_webhook(url, payload, max_retries=5):
for attempt in range(max_retries):
try:
response = requests.post(url, json=payload, timeout=5)
if response.status_code < 500:
return True # সফল বা ক্লায়েন্ট ত্রুটি (পুনঃপ্রচেষ্টা নয়)
except RequestException:
pass
time.sleep(2 ** attempt) # এক্সপোনেনশিয়াল ব্যাকঅফ
return False
ওয়েবহুক কনজিউমারদের জন্য সর্বোত্তম অনুশীলন
- দ্রুত প্রতিক্রিয়া জানান: প্রসেসিংয়ের আগে 2xx স্ট্যাটাস দিয়ে প্রাপ্তি স্বীকার করুন। কাজটি অ্যাসিঙ্ক্রোনাসভাবে সারিবদ্ধ করুন।
- স্বাক্ষর যাচাই করুন: পেলোডে বিশ্বাস করার আগে সর্বদা স্বাক্ষর যাচাই করুন।
- ডুপ্লিকেট পরিচালনা করুন: আইডেম্পোটেন্ট প্রসেসিং নিশ্চিত করতে ইভেন্ট আইডি ব্যবহার করুন।
- সবকিছু লগ করুন: ডিবাগিংয়ের জন্য প্রাপ্ত ওয়েবহুকগুলির লগ রাখুন।
তুলনা: ওয়েবহুকস বনাম পোলিং
| দিক | ওয়েবহুকস | পোলিং |
|---|---|---|
| লেটেন্সি | প্রায় রিয়েল-টাইম | বিরতির উপর নির্ভর করে |
| সার্ভার লোড | কম (শুধু পুশ) | বেশি (ঘন ঘন অনুরোধ) |
| জটিলতা | বেশি (এন্ডপয়েন্ট, নিরাপত্তা প্রয়োজন) | কম |
| নির্ভরযোগ্যতা | পুনঃপ্রচেষ্টা প্রয়োজন | স্বাভাবিকভাবেই পুনঃপ্রচেষ্টা করা হয় |
সচরাচর জিজ্ঞাসা
সাইনড ওয়েবহুক পেলোড কী?
একটি সাইনড পেলোডে একটি ক্রিপ্টোগ্রাফিক স্বাক্ষর (সাধারণত HMAC) অন্তর্ভুক্ত থাকে যা রিসিভারকে অনুরোধের সত্যতা এবং অখণ্ডতা যাচাই করতে দেয়।
ব্যর্থ ওয়েবহুক কতবার পুনঃপ্রচেষ্টা করা উচিত?
সাধারণ অনুশীলন হল এক্সপোনেনশিয়াল ব্যাকঅফ সহ ৩-৫ বার পুনঃপ্রচেষ্টা, তবে এটি আপনার SLA এবং ইভেন্টের গুরুত্বের উপর নির্ভর করে।
HTTPS ছাড়া ওয়েবহুক ব্যবহার করা যাবে?
না, পেলোড এবং স্বাক্ষর ইন্টারসেপশন থেকে রক্ষা করতে সর্বদা HTTPS ব্যবহার করুন। সাধারণ HTTP সংবেদনশীল ডেটা প্রকাশ করে।
ওয়েবহুক পেলোড ডিবাগ করার সময়, আপনার JSON দ্রুত ফরম্যাট করার প্রয়োজন হতে পারে। JSON প্রতিক্রিয়াগুলি সুন্দরভাবে প্রিন্ট এবং যাচাই করতে আমাদের JSON ফরম্যাটার ব্যবহার করে দেখুন।