ওয়েবহুক ব্যাখ্যা: স্বাক্ষরিত পেলোড এবং পুনঃপ্রচেষ্টা
আপনি একটি পেমেন্ট গেটওয়ে বা CI/CD পরিষেবা ইন্টিগ্রেট করেছেন, এবং এখন আপনাকে রিয়েল-টাইম ইভেন্ট গ্রহণ করতে হবে। ওয়েবহুক হলো স্ট্যান্ডার্ড সমাধান, তবে এর সাথে দুটি বড় চ্যালেঞ্জ আসে: অনুরোধটি সত্যিই প্রত্যাশিত প্রেরকের কাছ থেকে এসেছে কিনা তা যাচাই করা, এবং আপনার এন্ডপয়েন্ট ডাউন বা ধীর হলে ব্যর্থতাগুলো সামলানো। এই নিবন্ধে ব্যবহারিক কোড উদাহরণসহ স্বাক্ষরিত ওয়েবহুক পেলোড এবং শক্তিশালী পুনঃপ্রচেষ্টা লজিক কীভাবে বাস্তবায়ন করবেন তা ব্যাখ্যা করা হয়েছে।
ওয়েবহুক কী?
ওয়েবহুক হলো একটি ব্যবহারকারী-সংজ্ঞায়িত HTTP কলব্যাক। আপনার অ্যাপ্লিকেশন আপডেটের জন্য একটি API পোল করার পরিবর্তে, কোনো ইভেন্ট ঘটলে প্রোভাইডার আপনার নির্দিষ্ট করা URL-এ একটি HTTP POST অনুরোধ পাঠায়। এটি ইন্টিগ্রেশনগুলোকে দক্ষ এবং প্রায় রিয়েল-টাইম করে তোলে।
তবে, ওয়েবহুক পুশ-ভিত্তিক, যার মানে আপনার এন্ডপয়েন্ট অবশ্যই পাবলিকলি অ্যাক্সেসযোগ্য হতে হবে, অপ্রত্যাশিত লোড সামলাতে হবে এবং ডুপ্লিকেট বা ক্ষতিকারক অনুরোধ মোকাবেলা করতে হবে। এখানেই স্বাক্ষর এবং পুনঃপ্রচেষ্টা কাজে আসে।
ওয়েবহুক পেলোড স্বাক্ষর করবেন কেন?
যাচাই ছাড়া, যে কেউ আপনার ওয়েবহুক URL জানে সে জাল ইভেন্ট পাঠাতে পারে। একটি শেয়ার্ড সিক্রেট দিয়ে পেলোড স্বাক্ষর করা আপনাকে প্রেরক প্রমাণীকরণ করতে এবং পেলোডের সাথে ছेড়াছেড়ি হয়নি তা নিশ্চিত করতে দেয়।
সবচেয়ে সাধারণ পদ্ধতি হলো SHA-256 ব্যবহার করে HMAC (হ্যাশ-ভিত্তিক মেসেজ অথেন্টিকেশন কোড)। প্রোভাইডার একটি গোপন কী ব্যবহার করে কাঁচা অনুরোধ বডির উপর একটি স্বাক্ষর গণনা করে এবং এটি একটি হেডারে (যেমন X-Signature) অন্তর্ভুক্ত করে। আপনার সার্ভার স্বাক্ষরটি পুনরায় গণনা করে এবং সেগুলো তুলনা করে।
HMAC যাচাইকরণ বাস্তবায়ন
এখানে Express ব্যবহার করে Node.js-এ একটি সহজ উদাহরণ:
const crypto = require('crypto');
const express = require('express');
const app = express();
// স্বাক্ষর যাচাইয়ের জন্য কাঁচা বডি ব্যবহার করুন
app.use(express.raw({ type: 'application/json' }));
app.post('/webhook', (req, res) => {
const signature = req.headers['x-signature'];
const secret = process.env.WEBHOOK_SECRET;
const payload = req.body; // Buffer
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send('Invalid signature');
}
// ইভেন্ট প্রক্রিয়া করুন
const event = JSON.parse(payload);
console.log('Received event:', event.type);
res.status(200).send('OK');
});
app.listen(3000, () => console.log('Webhook server running'));
মূল বিষয়গুলো:
- কাঁচা বডি ব্যবহার করুন: বডিটি JSON হিসেবে নয়, কাঁচা বাইট হিসেবে পার্স করুন, কারণ যেকোনো রূপান্তর স্বাক্ষর পরিবর্তন করে।
- টাইমিং-সেফ তুলনা: টাইমিং আক্রমণ প্রতিরোধ করতে
crypto.timingSafeEqualব্যবহার করুন। - সিক্রেট ব্যবস্থাপনা: সিক্রেট নিরাপদে সংরক্ষণ করুন (পরিবেশ ভেরিয়েবল, সিক্রেট ম্যানেজার)।
পুনঃপ্রচেষ্টা সামলানো: ওয়েবহুক নির্ভরযোগ্য করা
নেটওয়ার্ক ব্যর্থ হয়, সার্ভার ক্র্যাশ করে এবং ডিপ্লয়মেন্ট ডাউনটাইম সৃষ্টি করে। একটি নির্ভরযোগ্য ওয়েবহুক সিস্টেমকে ব্যর্থ ডেলিভারিগুলো পুনঃপ্রচেষ্টা করতে হবে। কিন্তু সাধারণ পুনঃপ্রচেষ্টা ডুপ্লিকেট প্রসেসিং এবং আপনার সিস্টেমে অতিরিক্ত লোড সৃষ্টি করতে পারে।
পুনঃপ্রচেষ্টার কৌশল
সাধারণ পুনঃপ্রচেষ্টার প্যাটার্নগুলোর মধ্যে রয়েছে:
- এক্সপোনেনশিয়াল ব্যাকঅফ: প্রতিটি পুনঃপ্রচেষ্টার মধ্যে বেশি সময় অপেক্ষা করুন (যেমন ১ সে, ২ সে, ৪ সে, ৮ সে...)।
- সর্বোচ্চ পুনঃপ্রচেষ্টা সীমা: N বার চেষ্টার পরে থামুন (যেমন ৫) এবং ডেলিভারি ব্যর্থ হিসেবে চিহ্নিত করুন।
- জিটার: থান্ডারিং হার্ড সমস্যা এড়াতে randomness যোগ করুন।
বেশিরভাগ প্রোভাইডার ২৪ ঘণ্টায় এক্সপোনেনশিয়াল ব্যাকঅফ সহ ৫ বার পর্যন্ত পুনঃপ্রচেষ্টার মতো কিছু বাস্তবায়ন করে।
আইডেম্পোটেন্সি: নিরাপদ পুনঃপ্রচেষ্টার চাবিকাঠি
যেহেতু পুনঃপ্রচেষ্টা একই ইভেন্ট একাধিকবার ডেলিভার করতে পারে, আপনার এন্ডপয়েন্টকে অবশ্যই আইডেম্পোটেন্ট হতে হবে। পেলোডে একটি অনন্য ইভেন্ট আইডি অন্তর্ভুক্ত করুন এবং ডুপ্লিকেট এড়াতে প্রসেস করা আইডিগুলো সংরক্ষণ করুন।
একটি সাধারণ ইন-মেমরি সেট ব্যবহার করে উদাহরণ (প্রোডাকশনে ডেটাবেস ব্যবহার করুন):
const processedEvents = new Set();
app.post('/webhook', (req, res) => {
// ... স্বাক্ষর যাচাই ...
const event = JSON.parse(payload);
if (processedEvents.has(event.id)) {
return res.status(200).send('Already processed');
}
// ইভেন্ট প্রক্রিয়া করুন
processedEvents.add(event.id);
res.status(200).send('OK');
});
প্রোডাকশনের জন্য, ইভেন্ট আইডিতে একটি ইউনিক কনস্ট্রেইন্ট সহ ডেটাবেস ব্যবহার করুন।
ওয়েবহুক গ্রাহকদের জন্য সেরা অনুশীলন
- দ্রুত সাড়া দিন: ভারী প্রসেসিং করার আগে 2xx স্ট্যাটাস দিয়ে প্রাপ্তি স্বীকার করুন। অ্যাসিঙ্ক হ্যান্ডলিংয়ের জন্য ইভেন্টটি কিউতে রাখুন।
- টাইমস্ট্যাম্প যাচাই করুন: প্রোভাইডার যদি টাইমস্ট্যাম্প অন্তর্ভুক্ত করে, তবে কয়েক মিনিটের চেয়ে পুরোনো অনুরোধ প্রত্যাখ্যান করুন যাতে রিপ্লে আক্রমণ প্রতিরোধ হয়।
- HTTPS ব্যবহার করুন: ট্রানজিটে পেলোড সুরক্ষিত রাখতে সর্বদা HTTPS-এ আপনার ওয়েবহুক এন্ডপয়েন্ট প্রকাশ করুন।
- সবকিছু লগ করুন: ডিবাগিংয়ের জন্য আগত অনুরোধ, স্বাক্ষর এবং প্রসেসিং ফলাফল লগ করুন।
- ব্যর্থতা পর্যবেক্ষণ করুন: বারবার ডেলিভারি ব্যর্থতার জন্য সতর্কতা সেট আপ করুন।
পুনঃপ্রচেষ্টা নীতির তুলনা
| নীতি | সুবিধা | অসুবিধা |
|---|---|---|
| নির্দিষ্ট বিরতি | বাস্তবায়ন করা সহজ | পুনরুদ্ধারশীল সিস্টেমে অতিরিক্ত লোড দিতে পারে |
| এক্সপোনেনশিয়াল ব্যাকঅফ | আউটেজের সময় লোড কমায় | ক্ষণস্থায়ী ব্যর্থতা হলে ডেলিভারি বিলম্বিত হয় |
| জিটার সহ এক্সপোনেনশিয়াল ব্যাকঅফ | সিঙ্ক্রোনাইজড পুনঃপ্রচেষ্টা প্রতিরোধ করে | সামান্য বেশি জটিল |
সাধারণ জিজ্ঞাসা
কীভাবে একটি ওয়েবহুক স্বাক্ষর যাচাই করব?
শেয়ার্ড সিক্রেট ব্যবহার করে কাঁচা অনুরোধ বডির HMAC গণনা করুন এবং টাইমিং-সেফ ফাংশন ব্যবহার করে স্বাক্ষর হেডারের সাথে তুলনা করুন। সাধারণ সমতা দিয়ে কখনো তুলনা করবেন না।
আমার ওয়েবহুক এন্ডপয়েন্ট ডাউন হলে কী করব?
প্রোভাইডারকে এক্সপোনেনশিয়াল ব্যাকঅফ সহ পুনঃপ্রচেষ্টা করা উচিত। ডাউনটাইমের প্রভাব কমাতে আপনার এন্ডপয়েন্ট দ্রুত 2xx ফেরত দেয় এবং অ্যাসিঙ্ক্রোনাসভাবে ইভেন্ট প্রসেস করে তা নিশ্চিত করুন।
স্বাক্ষর ছাড়া ওয়েবহুক ব্যবহার করতে পারি?
সুপারিশ করা হয় না। স্বাক্ষর ছাড়া, আপনি প্রেরক যাচাই করতে পারবেন না, ফলে আপনার এন্ডপয়েন্ট জাল ইভেন্টের জন্য ঝুঁকিপূর্ণ হয়ে পড়ে। উপলব্ধ হলে সর্বদা স্বাক্ষর ব্যবহার করুন।
ওয়েবহুক পেলোড পরীক্ষা করার সময়, আপনার JSON ডেটা পরিদর্শন করার প্রয়োজন হতে পারে। পেলোডগুলো দ্রুত সুন্দরভাবে প্রিন্ট এবং যাচাই করতে JSON Formatter ব্যবহার করুন।