ওয়েবহুক ব্যাখ্যা: সাইনড পেলোড ও রিট্রাই
আপনি সবেমাত্র ওয়েবহুক ব্যবহার করে একটি পেমেন্ট গেটওয়ে ইন্টিগ্রেট করেছেন। টেস্টিংয়ে সবকিছু কাজ করে, কিন্তু প্রোডাকশনে কখনও কখনও ইভেন্ট হারিয়ে যায়, বা আপনি ডুপ্লিকেট নোটিফিকেশন পান যা ডাবল চার্জ সৃষ্টি করে। মূল কারণ প্রায়শই সাইনড পেলোড এবং রিট্রাই কীভাবে পরিচালনা করেন তার মধ্যে থাকে। এই নিবন্ধটি ওয়েবহুকের কার্যপ্রণালী ব্যাখ্যা করে এবং একটি শক্তিশালী, নিরাপদ ইন্টিগ্রেশন তৈরির জন্য ব্যবহারিক পদক্ষেপ প্রদান করে।
ওয়েবহুক কী?
ওয়েবহুক হল ব্যবহারকারী-সংজ্ঞায়িত HTTP কলব্যাক। যখন সোর্স সিস্টেমে (যেমন, একটি পেমেন্ট প্রসেস হয়) একটি ইভেন্ট ঘটে, তখন এটি আপনার নির্দিষ্ট করা একটি URL-এ ইভেন্ট ডেটা সহ একটি HTTP POST রিকোয়েস্ট পাঠায়। পোলিংয়ের বিপরীতে, ওয়েবহুক প্রায় রিয়েল-টাইমে ডেটা পুশ করে, লেটেন্সি এবং সার্ভার লোড কমায়।
যাইহোক, ওয়েবহুক চ্যালেঞ্জ নিয়ে আসে: সত্যতা যাচাই, ব্যর্থতা পরিচালনা এবং এক্স্যাক্টলি-ওয়ান্স প্রসেসিং নিশ্চিত করা। আসুন প্রতিটি মোকাবেলা করি।
সাইনড পেলোড: সত্যতা যাচাই
যেহেতু ওয়েবহুক এন্ডপয়েন্টগুলি সর্বজনীনভাবে অ্যাক্সেসযোগ্য, যে কেউ জাল রিকোয়েস্ট পাঠাতে পারে। এটি প্রতিরোধ করতে, প্রদানকারীরা একটি সিক্রেট কী দিয়ে পেলোড সাইন করে। রিকোয়েস্টটি আসল কিনা তা নিশ্চিত করতে আপনি সিগনেচার যাচাই করেন।
HMAC সিগনেচার কীভাবে কাজ করে
বেশিরভাগ প্রদানকারী SHA-256 সহ HMAC (হ্যাশ-ভিত্তিক মেসেজ অথেন্টিকেশন কোড) ব্যবহার করে। প্রদানকারী রিকোয়েস্ট বডি এবং একটি শেয়ার্ড সিক্রেট ব্যবহার করে একটি সিগনেচার গণনা করে, তারপর এটি একটি হেডারে (যেমন, X-Signature) অন্তর্ভুক্ত করে। আপনি আপনার দিকে সিগনেচার পুনরায় গণনা করেন এবং তুলনা করেন।
পাইথনে উদাহরণ:
import hmac
import hashlib
def verify_signature(payload, secret, received_signature):
expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, received_signature)
গুরুত্বপূর্ণ: কাঁচা রিকোয়েস্ট বডি ব্যবহার করুন, পার্স করা JSON নয়, কারণ পার্সিং হোয়াইটস্পেস পরিবর্তন করতে পারে এবং সিগনেচার ভেঙে দিতে পারে।
সাধারণ ভুল
- পার্স করা ডেটা ব্যবহার: সর্বদা কাঁচা বাইটের বিরুদ্ধে যাচাই করুন।
- টাইমিং অ্যাটাক: কনস্ট্যান্ট-টাইম তুলনা ব্যবহার করুন (যেমন,
hmac.compare_digest)। - টাইমস্ট্যাম্প উপেক্ষা: কিছু প্রদানকারী রিপ্লে অ্যাটাক প্রতিরোধ করতে সিগনেচারে একটি টাইমস্ট্যাম্প অন্তর্ভুক্ত করে। এটি একটি সহনশীলতার উইন্ডোর মধ্যে (যেমন, ৫ মিনিট) আছে কিনা যাচাই করুন।
রিট্রাই: ব্যর্থতা সুন্দরভাবে পরিচালনা
আপনার এন্ডপয়েন্ট সাময়িকভাবে ডাউন হতে পারে, বা নেটওয়ার্ক সমস্যা ব্যর্থতার কারণ হতে পারে। নির্ভরযোগ্য ওয়েবহুক সিস্টেম এক্সপোনেনশিয়াল ব্যাকঅফ সহ ব্যর্থ ডেলিভারি রিট্রাই করে।
রিট্রাই স্ট্র্যাটেজি
প্রদানকারীরা সাধারণত নন-2xx রেসপন্স বা টাইমআউটে রিট্রাই করে। সাধারণ প্যাটার্ন:
| স্ট্র্যাটেজি | বর্ণনা | উদাহরণ |
|---|---|---|
| নির্দিষ্ট ইন্টারভাল | প্রতি N সেকেন্ডে রিট্রাই | প্রতি ৩০ সেকেন্ডে, ৫ বার পর্যন্ত |
| এক্সপোনেনশিয়াল ব্যাকঅফ | প্রতিটি প্রচেষ্টায় বিলম্ব দ্বিগুণ | ১s, ২s, ৪s, ৮s... |
| জিটার সহ এক্সপোনেনশিয়াল | থান্ডারিং হার্ড এড়াতে র্যান্ডমনেস যোগ করুন | ১s ± ০.৫s, ২s ± ১s... |
একজন রিসিভার হিসেবে, আপনি প্রেরকের রিট্রাই পলিসি নিয়ন্ত্রণ করতে পারবেন না, তবে আপনি আপনার এন্ডপয়েন্টকে স্থিতিস্থাপক করে ডিজাইন করতে পারেন।
রিসিভারদের জন্য সেরা অনুশীলন
- দ্রুত সাড়া দিন: কয়েক সেকেন্ডের মধ্যে 2xx ফেরত দিন। প্রসেসিং একটি ব্যাকগ্রাউন্ড জবে অফলোড করুন।
- আইডেম্পোটেন্ট হন: ডুপ্লিকেট প্রসেসিং এড়াতে পেলোড থেকে একটি আইডেম্পোটেন্সি কী ব্যবহার করুন।
- সবকিছু লগ করুন: ডিবাগিং এবং রিপ্লের জন্য আগত ওয়েবহুক সংরক্ষণ করুন।
- ব্যর্থতা মনিটর করুন: বারবার ব্যর্থতার জন্য অ্যালার্ট সেট আপ করুন।
আইডেম্পোটেন্সি বাস্তবায়ন
ডুপ্লিকেট ঘটে: আপনার রেসপন্স ধীর ছিল বলে প্রেরক রিট্রাই করতে পারে, অথবা আপনি ভুলবশত একই ইভেন্ট দুবার প্রসেস করতে পারেন। আইডেম্পোটেন্সি নিশ্চিত করে যে একটি ইভেন্ট একাধিকবার প্রসেস করলে একবারের মতোই একই প্রভাব পড়ে।
একটি অনন্য ইভেন্ট আইডি (প্রায়শই পেলোড বা হেডারে প্রদান করা হয়) ব্যবহার করুন এবং একটি অনন্য সীমাবদ্ধতা সহ ডেটাবেসে সংরক্ষণ করুন। প্রসেস করার আগে, আইডি বিদ্যমান কিনা পরীক্ষা করুন; যদি থাকে, এড়িয়ে যান।
def process_event(event_id, data):
if EventLog.exists(event_id):
return # already processed
EventLog.create(event_id)
# process data...
উচ্চ-থ্রুপুট সিস্টেমের জন্য, রেস কন্ডিশন এড়াতে একটি ডিস্ট্রিবিউটেড লক বা ডেটাবেস ট্রানজ্যাকশন ব্যবহার করুন।
নিরাপত্তা বিবেচনা
সিগনেচার যাচাইয়ের বাইরেও বিবেচনা করুন:
- HTTPS: ইভসড্রপিং প্রতিরোধ করতে সর্বদা TLS ব্যবহার করুন।
- IP অ্যালাউলিস্টিং: যদি প্রদানকারী IP রেঞ্জ প্রকাশ করে, আগত রিকোয়েস্ট সীমাবদ্ধ করুন।
- রেট লিমিটিং: আপনার এন্ডপয়েন্টকে অপব্যবহার থেকে রক্ষা করুন।
- পেলোড ভ্যালিডেশন: সিগনেচার যাচাইয়ের পরেও, ইনজেকশন আক্রমণ এড়াতে ডেটা স্কিমা যাচাই করুন।
স্থানীয়ভাবে ওয়েবহুক পরীক্ষা
ডেভেলপমেন্টের সময়, ওয়েবহুক গ্রহণ করতে আপনার একটি পাবলিক URL প্রয়োজন। ngrok বা localtunnel এর মতো টুল আপনার স্থানীয় সার্ভার প্রকাশ করে। বিকল্পভাবে, অনেক প্রদানকারী আপনার localhost-এ ইভেন্ট ফরওয়ার্ড করার জন্য একটি CLI অফার করে।
রিট্রাই হ্যান্ডলিং পরীক্ষা করতে ব্যর্থতা সিমুলেট করুন: ইচ্ছাকৃতভাবে 500 এরর ফেরত দিন এবং প্রদানকারীর রিট্রাই প্যাটার্ন পর্যবেক্ষণ করুন।
FAQ
আমি কীভাবে একটি ওয়েবহুক সিগনেচার যাচাই করব?
শেয়ার্ড সিক্রেট সহ HMAC ব্যবহার করুন। কাঁচা রিকোয়েস্ট বডির হ্যাশ গণনা করুন এবং একটি কনস্ট্যান্ট-টাইম তুলনা ফাংশন ব্যবহার করে সিগনেচার হেডারের সাথে তুলনা করুন।
আমি ডুপ্লিকেট ওয়েবহুক পেলে কী করব?
ইভেন্ট আইডি সংরক্ষণ করে আইডেম্পোটেন্সি বাস্তবায়ন করুন। ব্যবসায়িক লজিক কার্যকর করার আগে ইভেন্টটি ইতিমধ্যে প্রসেস করা হয়েছে কিনা পরীক্ষা করুন।
নির্ভরযোগ্যতার জন্য আমি কি শুধুমাত্র ওয়েবহুক রিট্রাইয়ের উপর নির্ভর করতে পারি?
না। রিট্রাই সাহায্য করে কিন্তু ডেলিভারি গ্যারান্টি দিতে পারে না। গুরুত্বপূর্ণ ইভেন্টের জন্য, ওয়েবহুককে একটি পোলিং ফলব্যাক বা একটি মেসেজ কিউ যা ইভেন্ট স্থায়ী করে তার সাথে একত্রিত করুন।
ওয়েবহুক পেলোড ডিবাগ করার সময়, আপনার JSON ডেটা পরিদর্শন করার প্রয়োজন হতে পারে। পেলোড দ্রুত সুন্দরভাবে প্রিন্ট এবং যাচাই করতে আমাদের JSON Formatter ব্যবহার করুন।