যেদিন আমরা আমাদের সাইনআপ পাইপলাইন ঠিক করেছিলাম
আমাদের সাইনআপের সংখ্যা প্রতি সপ্তাহে বাড়ছিল। টিম খুব উত্তেজিত ছিল। কিন্তু ডেটা বা উপাত্তগুলো ভুল মনে হচ্ছিল। ব্যবহারকারীরা আর কখনোই ফিরে আসছিল না। ইমেল অ্যাড্রেসগুলো অদ্ভুত দেখাচ্ছিল। আমাদের অ্যাক্টিভেশন রেট কমে যাচ্ছিল।
আমি ডেটাগুলো পরীক্ষা করলাম। আমি সেখানে প্রবৃদ্ধি (growth) খুঁজে পেলাম না। আমি শুধু গোলমাল (noise) খুঁজে পেলাম।
সমস্যা
আমি আইপি (IP) অ্যাড্রেস অনুযায়ী সাইনআপগুলোকে গ্রুপ করার জন্য একটি কুয়েরি (query) চালালাম। একটি আইপি অ্যাড্রেস থেকে ২৪ ঘণ্টার মধ্যে শত শত অ্যাকাউন্ট রেজিস্টার করা হয়েছিল। এটি একই ব্রাউজার ফিঙ্গারপ্রিন্ট ব্যবহার করছিল। একটি স্ক্রিপ্ট আমাদের রেজিস্টার এন্ডপয়েন্টে (register endpoint) হিট করছিল। এটি ডিসপোজেবল (throwaway) ইমেল ডোমেইন ব্যবহার করছিল। এটি ছিল একটি বট, কোনো মানুষ নয়।
আমাদের সাইনআপ পাইপলাইনটি পুরোপুরি উন্মুক্ত ছিল।
সমাধান
আমরা একটি স্প্রিন্টের (sprint) মধ্যেই সুরক্ষার তিনটি স্তর তৈরি করেছি।
স্তর ১: থ্রটলিং (Throttling)
আমরা দুই ধরনের রেট লিমিটিং (rate limiting) ব্যবহার করেছি।
- প্রতি-আইপি (Per-IP) থ্রটলিং: আমরা একটি নির্দিষ্ট সময়ের মধ্যে একটি আইপি থেকে সাইনআপের চেষ্টা সীমিত করে দিই।
- প্রতি-ডোমেইন (Per-domain) থ্রটলিং: আমরা একটি দীর্ঘ সময়ের মধ্যে একই ইমেল ডোমেইন থেকে সাইনআপ সীমিত করি। এটি একই ডোমেইন ব্যবহার করে ভিন্ন ভিন্ন আইপি থেকে আসা বটগুলোকে থামিয়ে দেয়।
স্তর ২: ব্লক লিস্ট (Blocklists)
- ব্লক করা ইমেল ডোমেইন: আমরা ডিসপোজেবল ইমেল ডোমেইন ব্যবহার করে করা যেকোনো রেজিস্ট্রেশন প্রত্যাখ্যান করি।
- ব্লক করা ইউজার এজেন্ট (user agents): আমরা নন-ব্রাউজার টুল থেকে আসা রিকোয়েস্টগুলো প্রত্যাখ্যান করি। আমরা আক্রমণকারীকে কোনো তথ্য প্রদান করি না।
স্তর ৩: আইপি ব্লক লিস্ট (IP Blocklist)
কিছু আইপি অত্যন্ত জেদি। তারা আমাদের সিস্টেমের একাধিক অংশ অপব্যবহার করে। আমরা একটি হার্ড ব্লক লিস্ট ব্যবহার করি। এই আইপিগুলো থেকে আসা প্রতিটি রিকোয়েস্ট প্রত্যাখ্যান করা হয়। মিডলওয়্যার (middleware) তাৎক্ষণিকভাবে তাদের থামিয়ে দেয়।
ফলাফল
সমাধান করার আগে:
- একটি আইপি থেকে একদিনে শত শত অ্যাকাউন্ট তৈরি করা হয়েছিল।
- বেশিরভাগ সাইনআপই ছিল ডিসপোজেবল ডোমেইন থেকে।
- ফেক অ্যাকাউন্টগুলোর কারণে আমাদের অ্যাক্টিভেশন রেট কমে গিয়েছিল।
- আমাদের ডেটা ভুল ছিল।
সমাধান করার পরে:
- রেজিস্ট্রেশন ফার্মিং শূন্যে নেমে এসেছে।
- ডিসপোজেবল ডোমেইন থেকে সাইনআপ আসা বন্ধ হয়ে গেছে।
- সাইনআপের সংখ্যা প্রকৃত মানুষের উপস্থিতি নির্দেশ করছে।
- আমাদের অ্যাক্টিভেশন রেট আবার স্বাভাবিক অবস্থায় ফিরে এসেছে।
শিক্ষা
- ভলিউমের চেয়ে সিগন্যাল বেশি গুরুত্বপূর্ণ। বট রিটেনশন (retention) এবং রেভিনিউ (revenue)-এর মতো মেট্রিক্সগুলোকে অনির্ভরযোগ্য করে তোলে।
- ছোট কোড ফিক্স বড় সমস্যা সমাধান করতে পারে। আমরা তিনটি সহজ মেকানিজম ব্যবহার করেছি।
- স্তর বা লেয়ার থাকা প্রয়োজন। একটি সীমাবদ্ধতা যথেষ্ট নয়। একাধিক স্তরের সমন্বয় আরও কার্যকর সুরক্ষা দেয়।
- আপনার রেসপন্স নিয়ন্ত্রণ করুন। বৈধ ব্যবহারকারীদের ফিডব্যাক দিন। ক্ষতিকারকদের জন্য নীরবতা বজায় রাখুন।
প্রবৃদ্ধি মানে কেবল ব্যবহারকারী পাওয়া নয়। এটি হলো প্রকৃত ব্যবহারকারী পাওয়া। আপনার প্রোডাক্ট সংক্রান্ত সিদ্ধান্তগুলো সঠিক ডেটার ওপর নির্ভর করে। আর সেই ডেটা শুরু হয় আপনার রেজিস্ট্রেশন এন্ডপয়েন্ট থেকে।
উৎস: https://dev.to/ogeobubu/the-day-we-fixed-our-signup-pipeline-3664