ZSTD বনাম Brotli বনাম GZIP: API কম্প্রেশন নির্বাচন
API-এর জন্য ZSTD, Brotli এবং GZIP তুলনা: গতি, কমপ্রেশন অনুপাত, CPU খরচ, এবং JSON ও বাইনারি পে-লোডের জন্য প্রোডাকশনে ব্যবহারযোগ্য ডিফল্টস।

API কমপ্রেশন কি (আর কখন এটি মূল্যবান)
API রেসপন্স কমপ্রেশন মানে আপনার সার্ভার রেসপন্স বডি (সাধারণত JSON) পাঠানোর আগে ছোট বাইট স্ট্রিমে এনকোড করে। ক্লায়েন্ট (ব্রাউজার, মোবাইল অ্যাপ, SDK, বা অন্য সার্ভিস) তারপর সেটি ডিকমপ্রেস করে। HTTP-এ এটি Accept-Encoding (ক্লায়েন্ট কী সমর্থন করে) এবং Content-Encoding (সার্ভার কোনটি বেছে নিয়েছে) মতো হেডার দিয়ে আলোচনা করা হয়।
API-র জন্য এটি কী করে
কমপ্রেশন মূলত আপনাকে তিনটি জিনিস দেয়:
- কম ব্যান্ডউইথ: ছোট রেসপন্সগুলো ক্যালকুলেশনের হিসেবে কম বাইট নেয়।
- সংকীর্ণ লিঙ্কে কম লেটেন্সি: কম বাইট হার্ডওয়্যার বা নেটওয়ার্কে (মোবাইল, বদ্ধ Wi‑Fi, ক্রস-রিজন কল) দ্রুত ডাউনলোড বোঝায়।
- কম egress খরচ: যদি আপনি আউটবাউন্ড ডাটা পে করে থাকেন, ট্রান্সফার সাইজ কমালে সরাসরি বিল কমে।
বিনিময় সরল: কমপ্রেশন ব্যান্ডউইথ বাঁচায় কিন্তু CPU (কমপ্রেস/ডিকমপ্রেস) এবং কখনও কখনও মেমোরি (বাফার) খরচ করে। উপযুক্ততা নির্ভর করে আপনার বটলনেকের ওপর।
কখন কমপ্রেশন সবচেয়ে সাহায্য করে
কমপ্রেশন সাধারণত জ্বলে ওঠে যখন রেসপন্সগুলো:
- টেক্সট-ভিত্তিক এবং পুনরাবৃত্তিমূলক, যেমন JSON, GraphQL রেসপন্স, HTML, বা লগ।
- মধ্যম থেকে বড়, যেখানে দশ বা শতকিলোবাইট কেটে নেওয়া গুরুত্বপূর্ণ।
- ধীর বা খরচবহুল নেটওয়ার্কে সার্ভ করা হয়, যেমন মোবাইল, আন্তর্জাতিক ক্লায়েন্ট, বা ক্রস-রিজন ট্রাফিক।
বড় JSON তালিকা (ক্যাটালগ, সার্চ রেজাল্ট, অ্যানালিটিক্স) ফিরিয়ে দিলে কমপ্রেশন প্রায়ই সহজ যে কোনো ফল।
কখন এটি কম সাহায্য করে
কমপ্রেশন সাধারণত CPU-এর দিক থেকে খারাপ ব্যবহার যখন রেসপন্সগুলো:
- খুব ছোট (উদাহরণ: কয়েকশ বাইট)। হেডার + CPU ওভারহেড বাঁচাতে পারে।
- আগে থেকেই কমপ্রেস করা (JPEG/PNG, MP4, ZIP, অনেক PDF)। পুনরায় কমপ্রেস করলে সাধারণত সামান্যই অবনতি হয় বা আকার বাড়তে পারে।
- CPU-বাউন্ড সার্ভিস (হট এন্ডপয়েন্ট যা আগে থেকেই কম্পিউট দিয়ে ব্যস্ত)। কমপ্রেশন যোগ করলে টেইল লেটেন্সি বাড়তে পারে।
এই গাইডে ব্যবহৃত সিদ্ধান্তের মূল অক্ষ
ZSTD vs Brotli vs GZIP বেছে নেওয়ার সময় বাস্তব সিদ্ধান্ত সাধারণত তিন জিনিসের মধ্যে ভারসাম্য:
- আকার হ্রাস (কমপ্রেশন রেশিও)
- লেটেন্সি (সার্ভার টু‑ফার্স্ট‑বাইট + ক্লায়েন্ট ডিকোড)
- ক্লায়েন্ট সাপোর্ট (আপনার কলার এবং ইন্টারমিডিয়ারিগুলি কীভাবে হ্যান্ডেল করে)
নিচের সব কিছুই এই তিনটির ভারসাম্য নিয়ে—আপনার API এবং ট্রাফিক প্যাটার্ন অনুযায়ী।
ZSTD বনাম Brotli বনাম GZIP: সংক্ষিপ্ত তুলনা
তিনটি কিছুকিছুই পে-লোড সাইজ কমায়, কিন্তু আলাদা কনস্ট্রেইন্টে অনুকূলিত: গতি, কমপ্রেশন রেশিও, এবং সামঞ্জস্য।
এক-দৃষ্টিতে সারসংক্ষেপ
- ZSTD (Zstandard): যখন আপনি কম লেটেন্সি এবং পূর্বানুমেয় CPU চান তখন API-র জন্য প্রায়ই সেরা ভারসাম্য। ভালো রেশিও দেয় কিন্তু ধীর নয়।
- Brotli: সাধারণত টেক্সট-ভিত্তিক রেসপন্সে (JSON, HTML-এর মতো) সবচেয়ে ছোট বাইট দেয়। উচ্চ সেটিং-এ CPU বাড়তে পারে।
- GZIP: "প্রতিটি জায়গায় কাজ করে" অপশন। ব্যাপকভাবে সমর্থিত এবং অপারেশনাল করা সহজ, কিন্তু সমকক্ষ CPU বাজেটে আধুনিক বিকল্পগুলোর তুলনায় সাধারণত ধীরে বা বড় আকারে থাকে।
সাধারণ শক্তি (এবং API-র জন্য তার অর্থ)
ZSTD গতি: যখন আপনার API টেইল লেটেন্সির প্রতি সংবেদনশীল বা সার্ভার CPU-কনসার্ন থাকে তখন বেশ উপকারী। এটি এত দ্রুত কমপ্রেস করতে পারে যে ওভারহেড প্রায়শই নেটওয়ার্ক সময়ের তুলনায় নগণ্য—বিশেষত মধ্যম-থেকে-বড় JSON রেসপন্সে।
Brotli কমপ্রেশন রেশিও: যখন ব্যান্ডউইথ প্রধান বাধা (মোবাইল ক্লায়েন্ট, খরচবহুল egress, CDN-হেভি ডেলিভারি) এবং রেসপন্সগুলো মূলত টেক্সট হলে এটি প্রায়ই জিতে যায়। ছোট পে-লোডগুলোও মূল্যবান হতে পারে যদি কমপ্রেশন একটু বেশি সময় নেয়।
GZIP সামঞ্জস্য: যখন সর্বোচ্চ ক্লায়েন্ট সাপোর্ট দরকার এবং আলোচনা ঝুঁকি কম রাখতে হবে (পুরানো SDK, এমবেডেড ক্লায়েন্ট, লিগ্যাসি প্রক্সি) তখন উপযুক্ত। এটি সর্বদাই সুরক্ষিত বেসলাইন যদিও এটি সর্বোত্তম পারফর্মার না।
"কমপ্রেশন লেভেল" আসলে কী পরিবর্তন করে
কমপ্রেশন "লেভেল" হলো প্রিসেট যা CPU টাইম বনাম আউটপুট ছোট করা-এর মধ্যে ট্রেড করে:
- নিম্ন স্তর: দ্রুত কমপ্রেস, বড় পে-লোড। রিয়েল-টাইম API-র জন্য ভাল।
- উচ্চ স্তর: ছোট আউটপুট, ধীর কমপ্রেস (এবং কখনও কখনও বেশি মেমোরি)। বড়, ক্যাশেবল রেসপন্সের জন্য ভালো।
তিনটোর জন্যই ডিকমপ্রেশন সাধারণত অনেক সস্তা, কিন্তু খুব উচ্চ স্তরগুলো ক্লায়েন্ট CPU/ব্যাটারিতেও প্রভাব ফেলতে পারে—বিশেষত মোবাইলে।
সাধারণ নিয়ম-আপ
- ডিফল্ট পছন্দ: যেখানে লেটেন্সি জরুরি, সেখানে অধিকাংশ JSON/REST/GraphQL API-র জন্য ZSTD ব্যবহার করুন।
- Brotli-এ স্যুইচ করুন: যখন আপনি নূন্যতম বাইট চাইছেন (টেক্সট-ভিত্তিক রেসপন্স, CDN ডেলিভারি, ধীর নেটওয়ার্ক) এবং অতিরিক্ত CPU মঞ্জুর করতে পারেন।
- GZIP রাখুন: যখন আপনি বিচিত্র ক্লায়েন্টসাপোর্ট চান বা আপনার ইনফ্রা/টুলিং নতুন এনকোডিং সাপোর্ট করে না।
সাইজ বনাম লেটেন্সি: মূল ট্রেড-অফ
কমপ্রেশন প্রায়ই বিক্রি করা হয় "ছোট রেসপন্স = দ্রুত API" হিসেবে। এটি অনেক সময় সত্য, বিশেষত ধীর বা খরচবহুল নেটওয়ার্কে—কিন্তু স্বয়ংক্রিয় নয়। যদি কমপ্রেশন সার্ভার-সাইডে যথেষ্ট CPU সময় যোগ করে, তাহলে আপনি কম বাইট থাকা সত্ত্বেও ধীর অনুরোধ পেতে পারেন।
সময় কোথায় খরচ হয়
এটি দুটি খরচ আলাদা করে দেখলে সুবিধা হয়:
- কমপ্রেশন সময় (সার্ভার-সাইড): সার্ভার বাইট পাঠানো শুরু করার আগে করা কাজ। এটি সরাসরি রেসপন্স সময় (TTFB) বাড়াতে পারে।
- ডিকমপ্রেশন সময় (ক্লায়েন্ট-সাইড): বাইট পাওয়ার পর করা কাজ। সাধারণত কমপ্রেশনের তুলনায় সস্তা, কিন্তু কম-শক্তিশালী ডিভাইস বা উচ্চ থ্রুপুট ক্লায়েন্টে এটি গুরুত্বপূর্ণ হতে পারে।
উচ্চ কমপ্রেশন রেশিও ট্রান্সফার টাইম কমাতে পারে, কিন্তু যদি কমপ্রেশন প্রতি রেসপন্সে (উদাহরণস্বরূপ) 15–30 ms CPU যোগ করে, আপনি দ্রুত সংযোগে সময় হারাতে পারেন।
লোডে টেইল-লেটেন্সি ট্যাপ
লোড বাড়লে, কমপ্রেশন পি৯৫/পি৯৯ লেটেন্সিকে গড় পি৫০-এর তুলনায় বেশি ক্ষতি করতে পারে। CPU ব্যবহার বাড়লে অনুরোধগুলো কিউতে লাগে। কিউয়িং ছোট পার‑রিকুয়েস্ট খরচগুলো বড় দেরিতে রূপান্তর করে—গড় লেটেন্সি ঠিক থাকতে পারে, কিন্তু সবচেয়ে ধীর ব্যবহারকারীরা কষ্ট পায়।
এটি একটি পারফরম্যান্স ফিচার হিসেবে পরিমাপ করুন
অনুমান করবেন না। A/B টেস্ট বা স্টেজড রোলআউট চালান এবং তুলনা করুন:
- p50 এবং p95 লেটেন্সি (এবং সম্ভব হলে p99)
- API ইন্সট্যান্সগুলোর CPU ব্যবহার ও স্যাচুরেশন
- রেসপন্স সাইজ এবং time-to-first-byte
বাস্তব ট্র্যাফিক প্যাটার্ন ও পে-লোড দিয়ে পরীক্ষা করুন। "সেরা" কমপ্রেশন লেভেলটি সেটি যা মোট সময় কমায়, কেবল বাইট নয়।
সার্ভার ও ক্লায়েন্টে CPU ও মেমরি খরচ
কমপ্রেশন "ফ্রি" নয়—এটি কাজকে নেটওয়ার্ক থেকে CPU ও মেমরির দিকে সরায়। API-তে এটি রিকোয়েস্ট হ্যান্ডলিং টাইম বাড়ানো, বড় মেমরি ফুটপ্রিন্ট, এবং কখনও ক্লায়েন্ট-সাইড ধীরতা হিসেবে দেখা দেয়।
CPU কোথায় খরচ হয়
সর্বাধিক CPU খরচ হয় রেসপন্সগুলো কমপ্রেস করতে। কমপ্রেশন প্যাটার্ন খুঁজে বের করে, স্টেট/ডিকশনারি বানায়, এবং এনকোডেড আউটপুট লেখে।
ডিকমপ্রেশন সাধারণত সস্তা, কিন্তু এখনও প্রাসঙ্গিক:
- সার্ভার মাঝে মাঝে রিকোয়েস্ট ডিকমপ্রেস করে (JSON API-তে বিরল, আপলোড বা ব্যাচ ইভেন্টে বেশি দেখা যায়)।
- ক্লায়েন্ট রেসপন্স পেয়ে ডিকমপ্রেস করে তারপর JSON পার্স করে—কৌশলগত পথ।
যদি আপনার API আগে থেকেই CPU-বাউন্ড হয়, উচ্চ কমপ্রেশন স্তর চালু করলে টেইল লেটেন্সি বাড়তে পারে।
মেমরি বিবেচনা
কিছুভাবে কমপ্রেশন মেমরি ব্যবহার বাড়াতে পারে:
- বাফার: ইমপ্লিমেন্টেশন ইনপুট/আউটপুট বাফার ব্যবহার করতে পারে; বড় পে-লোডের মানে বড় বাফার।
- ফুল বাফারিং বনাম স্ট্রিমিং: স্ট্রিমিং কমপ্রেশন বড় রেসপন্সে আগেই ডাটা পাঠানো শুরু করতে পারে এবং পিক মেমরি কম রাখে, অথচ ফুল বাফারিং প্রত্যেক অনুরোধে পিক মেমরি বাড়ায়।
কনটেইনারাইজড পরিবেশে, উচ্চ পিক মেমরি OOM কিল বা ডেন্সিটি কমায়।
অটোস্কেলিং ও কনটেইনার লিমিটে প্রভাব
কমপ্রেশন প্রতি রেসপন্সে CPU চক্র বাড়ায়, প্রতি ইন্সট্যান্স থ্রুপুট কমায়। ফলে অটোস্কেলিং তাড়াতাড়ি ট্রিগার হতে পারে এবং খরচ বাড়তে পারে। সাধারণ প্যাটার্ন: ব্যান্ডউইথ কমে, কিন্তু CPU খরচ বাড়ে—সুতরাং কোন রিসোর্স আপনার জন্য দামী তা বিবেচনা করে সিদ্ধান্ত নিন।
ক্লায়েন্টে ডিকমপ্রেশন গতি কেন গুরুত্বপূর্ণ
মোবাইল বা কম শক্তির ডিভাইসে ডিকম্প্রেশন রেন্ডারিং, JavaScript এক্সিকিউশন, এবং ব্যাটারির সাথে প্রতিযোগিতা করে। একটি ফরম্যাট যা কয়েক KB বাঁচায় কিন্তু ডিকমপ্রেস করতে বেশি সময় নেয় তা ধীর অনুভুত হতে পারে, বিশেষত যখন "ব্যবহারযোগ্য ডেটা" পর্যন্ত সময় গুরত্বপূর্ণ।
API-র জন্য ZSTD: শক্তি, সীমাবদ্ধতা, এবং ভাল ডিফল্টস
Zstandard (ZSTD) একটি আধুনিক কমপ্রেশন ফরম্যাট যা শক্তিশালী রেশিও দিতে ডিজাইন করা হয়েছে যতক্ষণ না আপনার API ধীর হয়ে যায়। অনেক JSON-ভিত্তিক API-র জন্য এটি একটি শক্তিশালী "ডিফল্ট": GZIP-র চেয়ে লক্ষণীয়ভাবে ছোট রেসপন্স একই বা নীচের লেটেন্সিতে, এবং ক্লায়েন্টে অত্যন্ত দ্রুত ডিকমপ্রেশন।
ZSTD সবচেয়ে ভাল কোন ক্ষেত্রে
ZSTD সবচেয়ে মূল্যবান যখন আপনি এন্ড-টু-এন্ড সময় নিয়ে চিন্তা করেন, কেবল ছোট বাইট নিয়ে নয়। এটি সাধারণত দ্রুত কমপ্রেস করে এবং খুব দ্রুত ডিকমপ্রেস করে—API যেখানে প্রতিটি মিলিসেকেন্ড গুরুত্বপূর্ণ সেখানে উপকারী।
এটি বিভিন্ন পে-লোড সাইজে ভাল কাজ করে: ছোট-থেকে-মধ্যম JSON প্রায়ই লক্ষ্যনীয় লাভ দেয়, আর বড় রেসপন্স আরও উপকৃত হতে পারে।
API-র জন্য বুদ্ধিমান স্তর
অধিকাংশ API-র জন্য নীচু স্তর দিয়ে শুরু করুন (সাধারণত level 1–3)। এগুলো প্রায়ই লেটেন্সি/সাইজ ট্রেড-অফে সেরা।
উচ্চ স্তর ব্যবহার করুন যদি:
- পে-লোড বড় (শতকিলোবাইট থেকে মেগাবাইট)
- ব্যান্ডউইথ মূল্যবান বা সীমাবদ্ধ
- আপনি পরিমাপ করে দেখেছেন CPU বটলনেক নয়
প্রগম্যাটিক কৌশল: একটি নীচু গ্লোবাল ডিফল্ট, তারপর নির্দিষ্ট "বড় রেসপন্স" এন্ডপয়েন্টগুলোর জন্য স্তর বাড়ান।
স্ট্রিমিং এবং ডিকশনারি মোড
ZSTD স্ট্রিমিং সাপোর্ট করে, যা বড় রেসপন্সে পিক মেমরি কমাতে এবং আগেই ডাটা পাঠানো শুরু করতে সাহায্য করে।
ডিকশনারি মোড তাদের জন্য বড় লাভ করতে পারে যারা অনেক অনুরূপ অবজেক্ট ফেরত দেয় (পুনরাবৃত্তি কী, স্থিতিশীল স্কিমা)। এটি সবচেয়ে কার্যকর যখন:
- পে-লোডগুলো তুলনামূলকভাবে ছোট কিন্তু ঘনবারি
- আপনি ভার্সনড ডিকশনারি নিরাপদে পরিচালনা করতে পারেন
সামঞ্জস্য সীমা
সার্ভার-সাইডে সাপোর্ট বহু স্ট্যাকে সহজ, কিন্তু ক্লায়েন্ট সামঞ্জস্যই শেষ সিদ্ধান্তের কথা। কিছু HTTP ক্লায়েন্ট, প্রক্সি, এবং গেটওয়ে এখনও ডিফল্টভাবে Content-Encoding: zstd অ্যাডভারটাইস বা গ্রহণ করে না।
তৃতীয় পক্ষ কনজিউমার থাকলে একটা ফ্যালব্যাক (সাধারণত GZIP) রাখুন এবং Accept-Encoding-এ স্পষ্টভাবে থাকলে ZSTD চালু করুন।
API-র জন্য Brotli: কখন এটি জিতে এবং কখন নয়
Brotli টেক্সট হাড়ানোর জন্য ডিজাইন করা—JSON, HTML, এবং অন্যান্য "শব্দসমৃদ্ধ" পে-লোডে এটি প্রায়ই GZIP-কে হারায়, বিশেষত উচ্চ লেভেলে।
Brotli কোথায় জিতে
টেক্সট-ভিত্তিক রেসপন্স হল Brotli-র স্বার্থক্ষেত্র। বড় JSON ডকুমেন্ট (ক্যাটালগ, সার্চ রেজাল্ট, কনফিগ ব্লব) পাঠালে Brotli উল্লেখযোগ্যভাবে বাইট কাটতে পারে, যা ধীর নেটওয়ার্কে ও egress খরচ কমাতে সাহায্য করে।
যখন আপনি একবার কমপ্রেস করে বহুবার সার্ভ করতে পারেন (ক্যাশেবল রেসপন্স, ভার্সনড রিসোর্স), উচ্চ-লেভেল Brotli মূল্যবান—কারণ CPU খরচ বহু অনুরোধে আমর্টাইজ করা যায়।
Brotli কোথায় হতাশ করে
ডাইনামিক API রেসপন্স (প্রতিটি অনুরোধে জেনারেট করা) ক্ষেত্রে Brotli-র সেরা রেশিও প্রায়ই উচ্চ স্তর চাইবে যা CPU-মহন্ত করে এবং লেটেন্সি বাড়ায়। কমপ্রেশন সময় যুক্ত করলে বাস্তব জগতের জয় ZSTD (বা ভাল-টিউন করা GZIP)-এর উপরে অপেক্ষাকৃত ছোট হতে পারে।
এটি সেইসব পে-লোডে কম আকর্ষণীয় যা ভালভাবে কমপ্রেস করে না (আগেই কমপ্রেস করা ডাটা, অনেক বাইনারি ফরম্যাট)। সে ক্ষেত্রে কেবল CPU নষ্ট হবে।
ব্যবহারিক স্তর নির্দেশিকা
- রানটাইম কমপ্রেশন: CPU spike এড়াতে নিম্ন স্তর (সাধারণত 1–4) ব্যবহার করুন।
- প্রীকমপ্রেসড/স্ট্যাটিক: উচ্চ স্তর (সাধারণত 8–11) অনেক অনুরোধে আমর্টাইজ করলে অর্থবহ।
ক্লায়েন্ট সাপোর্ট নোট
ব্রাউজার সাধারণত HTTPS-এ Brotli ভালভাবে সাপোর্ট করে, তাই ওয়েব ট্রাফিকের জন্য জনপ্রিয়। নন-ব্রাউজার API ক্লায়েন্ট (মোবাইল SDK, IoT ডিভাইস, পুরানো HTTP স্ট্যাক) এ সাপোর্ট অনিয়মিত হতে পারে—ঠিকভাবে Accept-Encoding সংবাদ বিনিময় করুন এবং একটি ফ্যালব্যাক (সাধারণত GZIP) রাখুন।
API-র জন্য GZIP: সামঞ্জস্য এবং ব্যবহারিক কর্মক্ষমতা
GZIP এখনও ডিফল্ট উত্তর API কম্প্রেশনের কারণ এটি সর্বজনীনভাবে সমর্থিত। প্রায় প্রতিটি HTTP ক্লায়েন্ট, ব্রাউজার, প্রক্সি, এবং গেটওয়ে Content-Encoding: gzip বুঝে, এবং এই পূর্বানুমেয়তা গুরুত্বপূর্ণ যখন আপনি সম্পূর্ণভাবে নিয়ন্ত্রণ করেন না যে আপনার সার্ভার ও ব্যবহারকারীর মধ্যে কী আছে।
কেন এটি সাধারণত প্রচলিত আছে
সুবিধা এ না যে GZIP "সেরা"—বরং এটি খুব কমই ভুল। অনেক প্রতিষ্ঠান বছরের অভিজ্ঞতা, ওয়েব সার্ভারে সংবেদনশীল ডিফল্ট এবং কম সারপ্রাইজ নিয়ে কাজ করে।
API-এর জন্য ব্যবহারিক স্তর
API পে-লোডের (সাধারণত JSON) জন্য মাঝারি-থেকে-নীচু স্তরই সেরা। স্তর 1–6 সাধারণত বেশিরভাগ সাইজ হ্রাস দেয় এবং CPU যুক্তিযুক্ত রাখে।
উচ্চ স্তর (8–9) সামান্য বাড়তি সাইজ কেটে দিতে পারে, কিন্তু ডাইনামিক অনুরোধ-প্রতিস্বরের ক্ষেত্রে অতিরিক্ত CPU সাধারণত লাভজনক নয়।
আধুনিক CPU-তে এটি কিভাবে তুলনা করে
আধুনিক হার্ডওয়্যারে, GZIP সাধারণত ZSTD-এর তুলনায় ধীর এবং Brotli-র সেরা রেশিও মেলাতে পারে না টেক্সট-ভিত্তিক কনটেন্টে। বাস্তব API লোডে এর অর্থ:
- ZSTD প্রায়শই প্রতি বাইট-সংরক্ষণের জন্য দ্রুততায় জিতে যায়।
- Brotli টেক্সটের জন্য সাইজে জিততে পারে, কিন্তু সেটিং অনুযায়ী CPU বাড়তে পারে।
- GZIP প্রতিযোগিতামূলক থাকে কারণ এটি "পর্যাপ্ত দ্রুত" এবং বহু স্ট্যাকে অপ্টিমাইজ করা আছে।
সামঞ্জস্য এজ-কেস (পুরানো ক্লায়েন্ট ও ইন্টারমিডিয়ারি)
পুরানো ক্লায়েন্ট, এমবেডেড ডিভাইস, কর্পোরেট প্রক্সি, বা লিগ্যাসি গেটওয়ে সাপোর্ট করতে হলে GZIP নিরাপদ পছন্দ। কিছু ইন্টারমিডিয়ারি অজানা এনকোডিং স্ট্রিপ করবে, ঠিকভাবে পাস-through করবে না, বা আলোচনা ভাঙিয়ে দিতে পারে—GZIP-এ এমন সমস্যাগুলি কম দেখা যায়।
মিশ্র বা অনিশ্চিত পরিবেশে GZIP দিয়ে শুরু করে (এবং যেখানে আপনি পুরো পথটি নিয়ন্ত্রণ করেন সেখানে ZSTD/Brotli যোগ করা) সাধারণত সবচেয়ে যেখানে নিরাপদ রোলআউট কৌশল।
পে-লোড টাইপ: কী ভালোভাবে কমপ্রেস হয় (আর কী নয়)
কমপ্রেশন জয় কেবল অ্যালগরিদমের উপর নির্ভর করে না। সবচেয়ে বড় চালক হলো আপনি কী ধরণের ডাটা পাঠান। কিছু পে-লোড ZSTD, Brotli, বা GZIP দিয়ে উল্লেখযোগ্যভাবে ছোট হয়; অন্যগুলো প্রায়ই অচল এবং কেবল CPU জ্বালায়।
মহান প্রার্থী (উচ্চ রিটার্ন)
টেক্সট-ভিত্তিক রেসপন্স খুব ভাল কমপ্রেস করে কারণ এতে পুনরাবৃত্ত কী, হোয়াইটস্পেস, এবং পূর্বানুমেয় প্যাটার্ন থাকে।
- JSON (রেস্ট রেসপন্স)
- GraphQL রেসপন্স (প্রায়ই বারবার ফিল্ড নাম থাকে)
- XML ও HTML
- বড় প্লেইন‑টেক্সট লগ ও এরর ট্রেস
নিয়ম: যত বেশি পুনরাবৃত্তি ও স্ট্রাকচার, তত ভালো অনুপাত।
বাইনারি পে-লোড: “হয়তো” (প্রথমে পরিমাপ করুন)
Protocol Buffers এবং MessagePack মতো বাইনারি ফরম্যাট JSON-র চেয়ে কমপ্যাক্ট, কিন্তু তারা "র্যান্ডম" নয়। তবুও এদের মধ্যে বারবার ট্যাগ, সাদৃশ্যপূর্ণ রেকর্ড লেআউট, এবং পূর্বানুমেয় সিকোয়েন্স থাকতে পারে।
অর্থাৎ এগুলো প্রায়ই এখনও কমপ্রেসযোগ্য, বিশেষত বড় রেসপন্স বা লিস্ট-ভিত্তিক এন্ডপয়েন্টে। একমাত্র নির্ভরযোগ্য উত্তর হলো আপনার বাস্তব ট্র্যাফিক নিয়ে পরীক্ষা করা: একই এন্ডপয়েন্টে কমপ্রেশন চালু/বন্ধ করে সাইজ এবং লেটেন্সি তুলুন।
সাধারণত কমপ্রেস না করা ভালো (আগে থেকেই কমপ্রেসড)
অनेक ফরম্যাট নিজের মধ্যে আগে থেকেই কমপ্রেস করে। উপরন্তু HTTP রেসপন্সে আবার কমপ্রেস করলে সামান্যই লাভ হয় কিংবা আকার বাড়তে পারে।
- ইমেজ: JPEG, PNG, WebP
- ভিডিও/অডিও: MP4
- আর্কাইভ: ZIP, gzip ফাইল
- PDF: প্রায়ই নিজেই কমপ্রেস ব্যবহার করে
এসবের জন্য সাধারণত কনটেন্ট টাইপ অনুযায়ী কমপ্রেশন ডিসেবল করা হয়।
ব্যবহারিক হিউরিস্টিক্স (সহজ রাখুন)
সরল পদ্ধতি: শুধুমাত্র যখন রেসপন্স একটি ন্যূনতম আকার পেরিয়ে যায় তখন কমপ্রেশন চালু করুন।
- একটি ন্যূনতম রেসপন্স সাইজ থ্রেশহোল্ড সেট করুন (উদাহরণ: কয়েক কেবি) আগে
Content-Encodingসক্ষম করা। - বড় টেক্সট রেসপন্স সর্বদা কমপ্রেস করুন; ছোট JSON-এ যেখানে হেডার ওভারহেড প্রাধান্য পায় সেখানে স্কিপ বিবেচনা করুন।
এটি CPU-কে তাদের কাজগুলিতেই রাখে যেখানে কমপ্রেশন প্রকৃতপক্ষে ব্যয়/লাভ যোগ করে।
HTTP হেডার এবং আলোচনা: সঠিকভাবে করা
কমপ্রেশন তখনই মসৃণভাবে কাজ করে যখন ক্লায়েন্ট ও সার্ভার এনকোডিং নিয়ে একমত হয়। এই সম্মতি Accept-Encoding (ক্লায়েন্ট পাঠায়) এবং Content-Encoding (সার্ভার জানায়) দিয়ে হয়।
Accept-Encoding এবং Content-Encoding (সরল উদাহরণ)
ক্লায়েন্ট কী ডিকোড করতে পারে তা বিজ্ঞাপন করে:
GET /v1/orders HTTP/1.1
Host: api.example
Accept-Encoding: zstd, br, gzip
সার্ভার একটি বেছে নিয়ে জানায়:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: zstd
যদি ক্লায়েন্ট `Accept-Encoding: gzip` পাঠায় এবং আপনি `Content-Encoding: br` পাঠান, সেই ক্লায়েন্ট হয়তো বডি পার্স করতে ব্যর্থ হবে। ক্লায়েন্ট যদি `Accept-Encoding` না পাঠায়, সাধারণত নিরাপদ ডিফল্ট হলো কোন কমপ্রেশন না পাঠানো।
### সার্ভার-সাইড অগ্রাধিকারের ক্রম বেছে নেওয়া
API-র জন্য একটি ব্যবহারিক অর্ডার প্রায়ই হতে পারে:
- প্রথমে `zstd` (দ্রুত/ভালো রেশিও ব্যালান্স)
- তারপর `br` (প্রায়ই ছোট, কখনও ধীর)
- তারপর `gzip` (সর্বাধিক সামঞ্জস্য)
অর্থাত্: `zstd > br > gzip`.
এটি সার্বজনীন নয়: যদি আপনার ট্র্যাফিক প্রায়ই ব্রাউজার-ভিত্তিক হয় তবে `br`-কে বেশি অগ্রাধিকার দিতে পারেন; যদি পুরানো মোবাইল ক্লায়েন্ট বেশি থাকে, `gzip` নিরাপদে টেনে রাখুন।
### Vary: Accept-Encoding এবং ক্যাশিং
যদি একটি রেসপন্স বিভিন্ন এনকোডিংয়ে পরিবেশিত হতে পারে, যোগ করুন:
```http
Vary: Accept-Encoding
না হলে CDN বা প্রক্সি gzip (বা zstd) ভার্শন ক্যাশ করে এমন ক্লায়েন্টকে সেটাই দেবে যারা সেই এনকোডিং চায় না বা ডিকোড করতে পারে না।
এজ-কেস ও নিরাপদ ফ্যালব্যাক
কিছু ক্লায়েন্ট সাপোর্ট দাবি করে কিন্তু বাগি ডিকোডার থাকতে পারে। টেকসই থাকার জন্য:
- যদি
zstdডিকোড ত্রুটি বাড়ে তবে সাময়িকভাবেgzip-এ ফ্যালব্যাক করুন। - “প্রব্লেম” ইউজার‑এজেন্ট বা SDK ভার্সনের জন্য allowlist/denylist বিবেচনা করুন।
- গুরুত্বপূর্ণ এন্ডপয়েন্ট (auth, webhooks)‑এর জন্য কমপ্রেশন নিষ্ক্রিয় বা সবচেয়ে সামঞ্জস্যপূর্ণ অপশন ব্যবহার করুন।
আলোচনাকে প্রতিটি ক্লায়েন্ট ভাঙা না করা এই লক্ষ্যেই—প্রতি বাইট না কাটা।
HTTP/2, HTTP/3, CDN, এবং গেটওয়েজ
API কমপ্রেশন শূন্যস্থান নয়। আপনার ট্রান্সপোর্ট প্রোটোকল, TLS ওভারহেড, এবং কোন CDN বা গেটওয়ে মাঝখানে আছে তা বাস্তব ফলাফল পরিবর্তন করতে পারে—বা ভুল কনফিগে ক্ষেত্রে ভেঙে দিতে পারে।
HTTP/2 এবং HTTP/3: মাল্টিপ্লেক্সিং, হেড‑অফ‑লাইন, এবং কমপ্রেশন কী বদলে দেয়
HTTP/2-এ একক TCP সংযোগে একাধিক অনুরোধ শেয়ার হয়। এটি কানেকশন ওভারহেড কমায়, কিন্তু প্যাকেট লস হলে সব স্ট্রিম স্টল হতে পারে TCP হেড‑অফ‑লাইন ব্লকিং-এর কারণে। কমপ্রেশন রেসপন্স বডি ছোট করে এই সমস্যার পরিমাণ কমাতে পারে—নেটওয়ার্ক-স্টাকেই আটকে থাকা ডাটা কমে।
HTTP/3 QUIC (UDP)-এর উপর চলে এবং স্ট্রিমগুলোর মধ্যে TCP-র মতো হেড‑অফ‑লাইন ব্লকিং এড়ায়। তবে পে-লোড সাইজ এখনও গুরুত্বপূর্ণ—হারে-ফলে লাভটা প্রায়শই ব্যান্ডউইথ সাশ্রয় ও "টাইম টু লাস্ট বাইট" তে দ্রুততা হিসেবে দেখা যায়, নাটকীয় লেটেন্সি হ্রাস নয়। বাস্তবে, কমপ্রেশন এখনও মূল্যবান।
TLS ইন্টারঅ্যাকশন: CPU বাজেটকে অগ্রাহ্য করবেন না
TLS নিজেও CPU খরচ করে (হ্যান্ডশেক, এনক্রিপশন/ডিক্রিপশন)। উচ্চ স্তরের কমপ্রেশন যোগ করলে বিশেষত স্পাইক সময়ে CPU সীমা ছাড়িয়ে যেতে পারে। এজন্যই প্রোডাকশনে "দ্রুত কমপ্রেস+ভাল রেশিও" সেটিংগুলি প্রায়ই "সর্বোচ্চ রেশিও"-র চেয়ে ভাল ফল দেয়।
CDN এবং API গেটওয়ে: অটো‑কমপ্রেস, পাস‑থ্রু, না হলে স্ট্রিপ
কিছু CDN/gateway নির্দিষ্ট MIME টাইপ অটোম্যাটিকালি কমপ্রেস করে, অন্যরা অরিজিন যা পাঠায় তা পাস করে। কিছু কনফিগারেশন ভুল হলে Content-Encoding-ই নর্মালাইজ বা রিমুভ করতে পারে।
প্রতি রুটে আচরণ যাচাই করুন, এবং নিশ্চিত করুন Vary: Accept-Encoding রাখা হয় যাতে ক্যাশ সঠিক থাকে।
ক্যাশিং স্ট্রাটেজি: এজ বনাম অরিজিন (এবং একাধিক ভ্যারিয়েন্ট)
এজে ক্যাশ করলে আলাদা এনকোডিং অনুযায়ী আলাদা ভ্যারিয়েন্ট স্টোর করা বিবেচনা করুন (gzip/br/zstd) যাতে প্রতি হিট‑এ আবার কমপ্রেস না করতে হয়। অরিজিনে ক্যাশ করলে ওয়াজ এজে নেগোসিয়েট করে একাধিক এনকোডিং ক্যাশ করতে পারেন।
মূল কথা: সঙ্গতি—সঠিক Content-Encoding, সঠিক Vary, এবং কে কমপ্রেশন করছে তা স্পষ্ট।
প্রস্তাবিত ডিফল্টস এবং টিউনিং প্লেবুক
দৃশ্য অনুযায়ী সুপারিশকৃত ডিফল্টস
- ব্রাউজার-ফেসিং API: ক্লায়েন্ট
Accept-Encoding: brএডভারটাইস করলে Brotli পছন্দ করুন। ব্রাউজারগুলো সাধারণত Brotli দক্ষভাবে ডিকোড করে এবং টেক্সট রেসপন্সে সাইজ‑রিডাকশনে উপকারী। - ইন্টারনাল সার্ভিস‑টু‑সার্ভিস API: উভয় পাশ আপনার নিয়ন্ত্রণে থাকলে ZSTD ডিফল্ট করুন। এটি সাধারণত GZIP‑এর তুলনায় দ্রুত এবং অনুপাতেও ভাল।
- পাবলিক API যা বিভিন্ন SDK ব্যবহার করে: বিস্তৃত সামঞ্জস্য বজায় রাখতে GZIP রাখুন এবং অপশনালভাবে ZSTD যোগ করুন ক্লায়েন্ট‑সাইড স্পষ্ট সমর্থন থাকলে। এতে পুরানো HTTP স্ট্যাক ভেঙে যাবে না।
রক্ষণশীল শুরু স্তর
শুরুতেই এমন স্তর বেছে নিন যা পরিমাপযোগ্য ও অবাক করবে না:
- Brotli: ডাইনামিক API রেসপন্সের জন্য স্তর 4–6 (উচ্চ স্তর সার্ভার CPU বাড়ায়)
- ZSTD: সাধারণ‑উদ্দেশ্যের জন্য স্তর 3–5
- GZIP: স্তর 5–6 (উচ্চ স্তরে লাভ কম)
যদি শক্তিশালী অনুপাত দরকার হয়, প্রোড‑লাইক নমুনা নিয়ে যাচাই করে p95/p99 মনিটর করুন।
ন্যূনতম সাইজ থ্রেশহোল্ড (এবং টিউনিং)
ছোট রেসপন্সে কমপ্রেস করা CPU‑এর চেয়ে কম সাশ্রয় হয়। একটি ব্যবহারিক শুরু পয়েন্ট:
- অধিকাংশ API-এ 1–2 KB নিচে কমপ্রেস না করা
- আপনি যদি CPU‑বাউন্ড হন বা খুব চ্যাটি হন: বিবেচনা করুন 4 KB
টিউন করুন: (1) বাইটস সেভড, (2) যোগ করা সার্ভার সময়, (3) এন্ড‑টু‑এন্ড লেটেন্সি পরিবর্তন তুলনা করে।
কিভাবে কন্ট্রোল উন্মুক্ত করবেন
কমপ্রেশন একটি ফিচার ফ্ল্যাগ-এর পেছনে চালু করুন, তারপর per-route config দিন (উদাহরণ: /v1/search‑এ চালু, ছোট এন্ডপয়েন্টে বন্ধ)। ক্লায়েন্ট‑অপ্ট‑আউট দিন Accept-Encoding: identity দিয়ে ডিবাগিং ও এজ ক্লায়েন্টের জন্য। সর্বদা Vary: Accept-Encoding রাখুন।
আধুনিক বিল্ড‑এবং‑শিপ ওয়ার্কফ্লোতে এটি কোথায় আসে
যদি আপনি দ্রুত API তৈরি করে প্রোডাকশনে টিউন করেন (উদাহরণ: React frontend + Go backend), কমপ্রেশন হলো সেই "ছোট কনফিগ, বড় প্রভাব" নইব। কডার.ai-র মতো প্ল্যাটফর্মে টিমগুলো দ্রুত প্রোটোটাইপ ডেপ্লয় করে তারপর প্রোডাকশনে টিউন করে—কমপ্রেশন ও ক্যাশ হেডারের মতো সেটিংস তখনই রূপান্তর করে। বাস্তব শিক্ষা: কমপ্রেশনকে একটি পরফরম্যান্স ফিচার হিসেবে আচরণ করুন, ফ্ল্যাগের পেছনে শিপ করুন, এবং p95/p99 মেপে সিদ্ধান্ত নিন।
রোলআউট, মনিটরিং, এবং ট্রাবলশুটিং
কমপ্রেশন চেঞ্জ সহজে শিপ করা যায় কিন্তু প্রোডে ভুল করা সহজ। এটিকে প্রোডাকশন ফিচার হিসেবে চালান: ধীরে রোলআউট, প্রভাব মাপুন, এবং রোলব্যাক সহজ রাখুন।
নিরাপদ রোলআউট প্ল্যান
ক্যানারিতে শুরু করুন: নতুন Content-Encoding (যেমন zstd) ট্র্যাফিকের ছোট অংশে বা একটি অভ্যন্তরীণ ক্লায়েন্টে চালু করুন।
তারপর ধীরে র্যাম্প করুন (1% → 5% → 25% → 100%), যদি মেট্রিকগুলো খারাপ হয় থামান।
সহজ রোলব্যাক রাখুন:
- গেটওয়ে/সার্ভিসে ফিচার ফ্ল্যাগ যা কমপ্রেশন বন্ধ করে বা
gzip-এ ফ্যালব্যাক করে - নির্দিষ্ট এন্ডপয়েন্ট বাদ দেওয়ার উপায়
- দ্রুত কনফিগারেশন-মাত্র ডিপ্লয়
কী মনিটর করবেন (এবং কেন)
কমপ্রেশনকে পরফরম্যান্স ও রিলায়েবিলিটি দুটোই হিসেবে মনিটর করুন:
- CPU (সার্ভার এবং সম্ভব হলে ক্লায়েন্ট): উচ্চ স্তর CPU স্পাইক ঘটাতে পারে
- লেটেন্সি পারসেন্টাইল (p50/p95/p99) ও TTFB: কমপ্রেশন গড়ে উপকারী হলেও টেইলে ক্ষতি করতে পারে
- রেসপন্স সাইজ: ওয়ায়ার বাইটস প্রতিটি এন্ডপয়েন্টে, কমপ্রেসড বনাম আনকমপ্রেসড ডেল্ট
- এরর রেট: 4xx/5xx, ক্লায়েন্ট ডিকোড ত্রুটি, টাইমআউট
ট্রাবলশুটিং চেকলিস্ট
যখন কিছু ভেঙে যায়, সাধারণত:
- ডাবল-কমপ্রেশন: upstream কমপ্রেস করে, তারপর gateway আবার কমপ্রেস করে
- ভুল হেডার:
Content-Encodingআছে কিন্তু বডি কমপ্রেস করা নেই (বা উল্টো) - ভুল আলোচনা:
Accept-Encodingউপেক্ষা করা বা ক্লায়েন্ট না চাওয়া এনকোডিং ফেরত দেয়া - বিপৎসংকেত স্ট্রিম: কাটা বডি, ভুল
Content-Length, বা প্রক্সি/CDN হস্তক্ষেপ
ক্লায়েন্ট প্রত্যাশা ডকুমেন্ট করুন
ক্লিয়ারলি ডকুমেন্ট করুন সমর্থিত এনকোডিং:
- ক্লায়েন্ট কী পাঠাবে:
Accept-Encoding: zstd, br, gzip - তারা কী পাবে:
Content-Encoding: zstd(বা ফ্যালব্যাক)
যদি আপনি SDK শিপ করেন, ছোট কপি‑পেস্টযোগ্য ডিকোড উদাহরণ দিন এবং কোন মিনিমাম ভার্সন ব্রোলি/জিএসটিডি সাপোর্ট করে তা উল্লেখ করুন।
সাধারণ প্রশ্ন
When is API response compression actually worth enabling?
যখন রেসপন্সগুলি টেক্সট-ভিত্তিক (JSON/GraphQL/XML/HTML), মধ্যম থেকে বড় আকারের, এবং ব্যবহারকারীরা ধীর/খরচবহুল নেটওয়ার্কে থাকে বা আপনি উল্লেখযোগ্য egress খরচ দেন— তখন রেসপন্স কমপ্রেশন চালু করা যুক্তিযুক্ত।
যখন রেসপন্স খুব ছোট, আগেই কম্প্রেস করা মিডিয়া (JPEG/MP4/ZIP/PDF), অথবা আপনার সার্ভিস CPU-বাউন্ড এবং প্রতিটি অনুরোধে অতিরিক্ত কাজ করলে p95/p99 লেটেন্সি বাড়বে— সেইসব ক্ষেত্রে কমপ্রেশন বাদ দেওয়া বা উচ্চ থ্রেশহোল্ড রাখা বুদ্ধিমানের কাজ।
Why can compression make an API slower even though responses are smaller?
কারণ এটি ব্যান্ডউইথকে CPU এবং কখনও কখনও মেমোরির বিপরীতে বিনিময় করে। কমপ্রেশন সময় সার্ভারকে বাইট পাঠানো শুরু করার আগে অতিরিক্ত CPU সময় নেয় (TTFB বাড়াতে পারে), এবং লোড বাড়লে এটি কিউয়িং বাড়িয়ে দিতে পারে—ফলে পুটির-লেটেন্সি (tail latency) খারাপ হতে পারে, যদিও মোট বা গড় লেটেন্সি উন্নত হতে পারে। সুতরাং সর্বোত্তম সেটিংটি সেইটি যা সর্বসমেত "এন্ড-টু-এন্ড" সময় কমায়, কেবল বাইট নয়।
How should I choose between ZSTD, Brotli, and GZIP?
অনেক API-র জন্য ব্যবহারিক ডিফল্ট অগ্রাধিকার হতে পারে:
zstdপ্রথম (দ্রুত, ভালো অনুপাত)- তারপর
br(টেক্সটের জন্য প্রায়ই ছোট, কিন্তু CPU বেশি লাগতে পারে) - তারপর
gzip(সবচেয়ে ব্যাপক সামঞ্জস্য)
সবসময় ক্লায়েন্টের Accept-Encoding অনুযায়ী সিদ্ধান্ত নিন এবং একটি নিরাপদ ফ্যালব্যাক রাখুন (সাধারণত gzip বা identity)।
What compression levels are sensible defaults for dynamic API responses?
কম শুরু করুন এবং পরিমাপ করুন।
- ZSTD: সাধারণ গতিশীল JSON API-এর জন্য স্তর 1–3 (বা কিছু ক্ষেত্রে 3–5)।
- Brotli: রানটাইম কমপ্রেশনের জন্য স্তর 1–4; পূর্বকমপ্রেস করা/স্ট্যাটিক কনটেন্টের জন্য 8–11 সংরক্ষণ করুন।
- GZIP: একটি ভাল ডিফল্ট হিসেবে স্তর 5–6।
উচ্চ স্তরগুলো সাধারণত আকার বাড়ানোর সামান্য লাভ দেয় কিন্তু CPU বাড়ায় এবং p95/p99 খারাপ করতে পারে—পরিমাপ করে নিন।
Should I compress every response, or only above a certain size?
হ্যাঁ—একটি ন্যূনতম রেসপন্স সাইজ থ্রেশহোল্ড ব্যবহার করুন যাতে আপনি খুব ছোট পে-লোডে CPU নষ্ট না করেন।
- সাধারণ শুরু পয়েন্ট: 1–2 KB
- যদি আপনি CPU-বাউন্ড হন বা খুব চ্যাটি API থাকে: বিবেচনা করুন 4 KB
এন্ডপয়েন্ট অনুযায়ী টিউন করুন: সংরক্ষিত বাইট বনাম যোগ করা সার্ভার সময় এবং p50/p95/p99 লেটেন্সির ওপর প্রভাব তুলনা করুন।
What payload types compress well (and which usually don’t)?
সংরচিত ও পুনরাবৃত্তিমূলক কনটেন্ট ভাল কমপ্রেস হয়, উদাহরণ:
- দুর্দান্ত: JSON, GraphQL, XML, HTML, বড় টেক্সট লগ
- “হয়তো”: Protobuf/MessagePack (প্রায়ই এখনও কমপ্রেসযোগ্য—পরিমাপ করুন)
- সাধারণত মূল্যহীন: JPEG/PNG/WebP, MP4, ZIP/gz, অনেক PDF
সাধারণ পন্থা: টেক্সট-জাতীয় Content-Type-গুলোর জন্য কম্প্রেশন চালু রাখুন এবং ইতিমধ্যে কমপ্রেস করা ফরম্যাটগুলোর জন্য নিষ্ক্রিয় করুন।
How do Accept-Encoding and Content-Encoding work for APIs?
সংকোচন HTTP আলোচনার মাধ্যমে হওয়া উচিত:
- ক্লায়েন্ট
Accept-Encodingপাঠায় (উদাহরণ:zstd, br, gzip) - সার্ভার একটি সমর্থিত
Content-Encodingদিয়ে উত্তর দেয়
ক্লায়েন্ট যদি Accept-Encoding না পাঠায়, সাধারণত নিরাপদ ডিফল্ট হলো কোনও কমপ্রেশন নয়। এমন Content-Encoding ফেরত দেবেন না যা ক্লায়েন্ট জানায়ইনি—তার ফলে ক্লায়েন্ট ব্যর্থ হতে পারে।
Why is Vary: Accept-Encoding important when using compression?
অবশ্যই যোগ করুন:
Vary: Accept-Encoding
এটি CDN/proxy-কে প্রতিক্রিয়া কিভাবে ক্যাশ করতে হবে তা নির্দেশ করে—যেন একটি gzip ভ্যারিয়েন্ট ভুল করে সেই ক্লায়েন্টকে সার্ভ না করা হয় যিনি gzip ডিকোড করতে পারবেন না (বা ভিন্ন এনকোডিং চান)। যদি আপনি একাধিক এনকোডিং সাপোর্ট করেন, এই হেডারটি সঠিক ক্যাশিংয়ের জন্য অপরিহার্য।
What are the most common compression bugs in production?
সাধারণ ত্রুটি-মোডগুলি হলো:
- ডাবল-কমপ্রেশন (অরিজিন কমপ্রেস করে, তারপর গেটওয়ে/CDN আবার কমপ্রেস করে)
- হেডার/বডি মিল নেই (
Content-Encodingসেট করা আছে কিন্তু বডি কমপ্রেস করা নেই বা উল্টো) - ভুল আলোচনার আচরণ (
Accept-Encodingউপেক্ষা করা) - প্রক্সি/CDN হস্তক্ষেপ (হেডার কেটে ফেলা বা পরিবর্তন করা)
- স্ট্রিমিং/কমপ্রেসিং-এ ভুল
Content-Length
ডিবাগ করতে: কাঁচা রেসপন্স হেডারগুলো ধরুন এবং একটি পরিচিত টুল/ক্লায়েন্ট দিয়ে ডিকোমপ্রেশন যাচাই করুন।
How should I roll out and monitor API compression safely?
ক্যানারি দিয়ে শুরু করুন: নতুন Content-Encoding (উদাহরণ: zstd) ছোট ট্র্যাফিক স্লাইসে অথবা একটি অভ্যন্তরীণ ক্লায়েন্টের জন্য চালু করুন।
তারপর ধীরে ধীরে র্যাম্প করুন (উদাহরণ: 1% → 5% → 25% → 50% → 100%), এবং যদি মূল মেট্রিকগুলো খারাপ দিকে যায় তবে বিরতি দিন।
সহজ রোলব্যাক রাখুন:
- গেটওয়ে/সার্ভিসে একটি ফিচার ফ্ল্যাগ যা কমপ্রেশন বন্ধ করে দেয় (বা
gzip-এ ফ্যালব্যাক করে) - নির্দিষ্ট এন্ডপয়েন্ট বাদ দেওয়ার উপায় (ফাইল ডাউনলোড, ইতিমধ্যেই কমপ্রেস করা মিডিয়া)
- কনফিগারেশন-মাত্র ডিপ্লয় যা দ্রুত ফেরত নেওয়া যায়
মনিটরিং: CPU, পি৫০/পি৯৫/পি৯৯ লেটেন্সি ও TTFB, ওয়ায়ার বাইটস (কমপ্রেসড বনাম আনকমপ্রেসড), এবং এরর/টাইমআউট/ক্লায়েন্ট ডিকোড ত্রুটি লক্ষ করবেন।