8 মিনিট

এআই-নির্মিত সিস্টেমে স্কিমা পরিবর্তন ও মাইগ্রেশন: একটি গাইড

জানুন কীভাবে এআই-নির্মিত সিস্টেমে স্কিমা পরিবর্তন নিরাপদে হ্যান্ডল করবেন: ভার্সনিং, ব্যাকওয়ার্ড-কম্প্যাটিবল রোলআউট, ডেটা মাইগ্রেশন, টেস্টিং, অবজার্ভেবিলিটি ও রোলব্যাক স্ট্র্যাটেজি।

এআই-নির্মিত সিস্টেমে স্কিমা পরিবর্তন ও মাইগ্রেশন: একটি গাইড

এআই-নির্মিত সিস্টেমে “স্কিমা” কী বোঝায়

স্কিমা হলো ডেটার আকৃতি এবং প্রতিটি ফিল্ডের মানে সম্পর্কে একটি যৌথ সমঝোতা। এআই-নির্মিত সিস্টেমে সেই সমঝোতা শুধু ডাটাবেস টেবিলেই থাকে না—এটি অনেক জায়গায় উপস্থিত থাকে এবং টিমগুলো প্রত্যাশার চেয়ে বেশি ঘনঘন পরিবর্তন দেখে।

স্কিমা শুধুমাত্র ডাটাবেসের বিষয় নয়

স্কিমা কমপক্ষে চারটি স্তরে দেখা যায়:

  • ডাটাবেস: টেবিল/কোলাম নাম, ডেটা টাইপ, কনস্ট্রেইন্ট, ইনডেক্স, এবং সম্পর্ক।
  • API: রিকোয়েস্ট/রেসপন্স JSON এর আকার, বাধ্যতামূলক বনাম ঐচ্ছিক ফিল্ড, enums, এরর ফরম্যাট, পেজিনেশন কনভেনশন।
  • ইভেন্ট ও মেসেজ: স্ট্রীম, 큐, এবং ওয়েবহুকের মাধ্যমে পাঠানো পে লোড (প্রায়ই ভোক্তাদের মাধ্যমে ইমপ্লিসিটভাবে সংস্করণ করা হয়)।
  • কনফিগ এবং কনট্র্যাক্ট: ফিচার ফ্ল্যাগ, এনভায়রনমেন্ট ভ্যারিয়েবল, YAML/JSON কনফিগ, এবং "হিডেন কনট্র্যাক্ট" যেমন ফাইল ফরম্যাট ও নামকরণ কনভেনশন।

সিস্টেমের দুই অংশ যদি ডেটা আদানপ্রদান করে, সেখানে একটি স্কিমা আছে—নথি না থাকলেও।

কেন এআই-নির্মিত সিস্টেমে স্কিমা বেশি বদলে যায়

AI-জেনারেটেড কোড ডেভেলপমেন্টকে দ্রুত করে তোলে, কিন্তু একই সঙ্গে churn বাড়ায়:

  • জেনারেটেড কোড সর্বশেষ প্রম্পট ও প্রসঙ্গ প্রতিফলিত করে, তাই ছোট প্রম্পট বদলও ফিল্ডের নাম, নেস্টিং, ডিফল্ট বা ভ্যালিডেশন বদলে দিতে পারে।
  • প্রয়োজন দ্রুত বিবর্তিত হয় যখন একটি নতুন এন্ডপয়েন্ট বা পাইপলাইন ধাপ শিপ করা সস্তা হয়।
  • অনিয়মিত কনভেনশন (snake_case বনাম camelCase, id বনাম userId) দেখা যায় যখন একাধিক জেনারেশন বা রিফ্যাক্টরিং টিমের মধ্যে ঘটে।

ফলাফল হলো প্রযোজক ও ভোক্তার মধ্যে আরও ঘন “চুক্তি বিচ্যুতি”।

যদি আপনি vibe-coding ওয়ার্কফ্লো ব্যবহার করেন (উদাহরণস্বরূপ, চ্যাটের মাধ্যমে হ্যান্ডলার, DB অ্যাক্সেস লেয়ার, এবং ইন্টিগ্রেশন জেনারেট করা), তাহলে শুরু থেকেই সেই ওয়ার্কফ্লোতে স্কিমা শৃঙ্খলা (discipline) তৈরি করা দরকার। Koder.ai মত প্ল্যাটফর্ম দ্রুত করে—কিন্তু যত দ্রুত আপনি শিপ করবেন, ইন্টারফেস ভার্সনিং, পে-লোড ভ্যালিডেশন, এবং সচেতনভাবে রোলআউট করার গুরুত্ব তত বেশী।

এই গাইডের লক্ষ্য

এই পোস্টটি বাস্তব কিছু পদ্ধতির উপর ফোকাস করে যাতে প্রোডাকশন স্থিতিশীল রাখা যায় ও দ্রুত iteration করা যায়: ব্যাকওয়ার্ড কম্প্যাটিবিলিটি বজায় রাখা, নিরাপদভাবে পরিবর্তন রোল আউট করা, এবং ডেটা মাইগ্রেশন সারপ্রাইজ ছাড়া করা।

আমরা কী কভার করব না

আমরা থিওরি-ভারী মডেলিং, ফরমাল মেথড, বা ভেন্ডর-স্পেসিফিক ফিচারের গভীর বিশ্লেষণ করব না। জোর থাকবে এমন প্যাটার্নে যা স্ট্যাক জুড়ে প্রয়োগ করা যায়—হাতে লেখা কোড হোক, AI-সহায়ক বা প্রায় পুরোপুরি AI-জেনারেটেড।

কেন এআই-জেনারেটেড কোডের সঙ্গে স্কিমা পরিবর্তন বেশি ঘটে

AI-জেনারেটেড কোড স্কিমা পরিবর্তনকে "সাধারণ" মনে করায় — না যে টিমগুলো উদাসীন, বরং ইনপুটগুলো বেশি ঘন ঘন বদলে যায়। যখন আপনার অ্যাপ আচরণ আংশিকভাবে প্রম্পট, মডেল ভার্সন এবং জেনারেটেড glue কোড দ্বারা পরিচালিত হয়, ডেটার আকৃতি সময়ের সাথে ড্রিফট করার সুযোগ বাড়ে।

প্রচলিত ট্রিগারগুলো

কয়েকটি প্যাটার্ন বারংবার স্কিমা churn সৃষ্টি করে:

  • নতুন প্রোডাক্ট ফিচার: নতুন ফিল্ড যোগ করা (যেমন risk_score, explanation, source_url) বা একটি কনসেপ্ট বিভক্ত করা (যেমন address কে street, city, postal_code এ ভাগ করা)।
  • মডেল আউটপুট পরিবর্তন: নতুন মডেল বেশি বিস্তারিত স্ট্রাকচার বা আলাদা enum মান অথবা নামকরণ পরিবর্তন করতে পারে ("confidence" বনাম "score")।
  • প্রম্পট আপডেট: গুণগত মান বাড়াতে করা প্রম্পট টুইক ভুলবশত ফরম্যাটিং, বাধ্যতামূলক ফিল্ড বা নেস্টিং বদলে দিতে পারে।

ঝুঁকিপূর্ণ প্যাটার্ন যা সিস্টেম ভঙ্গুর করে

AI-জেনারেটেড কোড দ্রুত কাজ করলেও তা ভঙ্গুর অনুমান এনকোড করতে পারে:

  • ইমপ্লিসিট অনুমান: কোড চুপচাপ ধরে নেয় একটি ফিল্ড সবসময় থাকবে, সবসময় নমেরিক, বা নির্দিষ্ট রেঞ্জে থাকবে।
  • হিডেন কাপলিং: একটি সার্ভিস অন্য সার্ভিসের ইন্টারনাল ফিল্ড নাম বা অর্ডারের উপর নির্ভর করে, বদলে একটি সংজ্ঞায়িত ইন্টারফেসে নির্ভর করা উচিত।
  • ডকুমেন্টেড নয় এমন ফিল্ড: মডেল একটি নতুন প্রপার্টি বের করা শুরু করে, এবং ডাউনস্ট্রিম কোড সেটার উপর নির্ভর করতে শুরু করে কেউ স্পষ্টভাবে চুক্তি মেনে নেওয়ার আগে।

কেন এআই পরিবর্তনের ফ্রিকোয়েন্সি বাড়ায়

কোড জেনারেশন দ্রুত iteration কে উৎসাহ দেয়: আপনি যখনই দরকার জেনারেটেড হ্যান্ডলার, পার্সার এবং ডাটাবেস অ্যাক্সেস লেয়ার রি-জেনারেট করেন। সেই গতি উপকারী, কিন্তু ছোট ইন্টারফেস পরিবর্তন বারবার শিপ করা সহজ করে—কখনও কখনও লক্ষ্য না করেই।

সবচেয়ে নিরাপদ মানসিকতা হলো প্রতিটি স্কিমাকে একটি চুক্তি (contract) হিসেবে দেখা: ডাটাবেস টেবিল, API পে-লোড, ইভেন্ট, এমনকি স্ট্রাকচার্ড LLM রেসপন্স। একজন ভোক্তা যদি এর উপর নির্ভরশীল হয়, তাহলে সেটাকে ভার্সন করে রাখুন, ভ্যালিডেট করুন, এবং সাবধানে পরিবর্তন করুন।

স্কিমা পরিবর্তনের ধরন: অ্যাডিটিভ বনাম ব্রেকিং

সব স্কিমা পরিবর্তন সমান নয়। সবচেয়ে সহজ প্রশ্ন: পুরনো ভোক্তারা কোনো পরিবর্তন ছাড়াই কাজ চালিয়ে যেতে পারবে কি? যদি হ্যাঁ, সাধারণত তা অ্যাডিটিভ। যদি না, তাহলে তা ব্রেকিং—এবং সমন্বিত রোলআউট প্ল্যান দরকার।

অ্যাডিটিভ পরিবর্তন (সাধারণত নিরাপদ)

অ্যাডিটিভ পরিবর্তন বিদ্যমান জিনিসকে সম্প্রসারিত করে, বিদ্যমান মানে বদলায় না।

প্রচলিত ডাটাবেস উদাহরণ:

  • কোনও কোলাম যোগ করা যেখানে ডিফল্ট আছে বা NULL অনুমোদিত (উদাহরণ: preferred_language)।
  • নতুন টেবিল বা ইনডেক্স যোগ করা।
  • JSON ব্লব-এ একটি ঐচ্ছিক ফিল্ড যোগ করা

নন-ডাটাবেস উদাহরণ:

  • API রেসপন্সে নতুন প্রোপার্টি যোগ করা (ক্লায়েন্টরা অজানা ফিল্ড উপেক্ষা করলে কাজ করবে)।
  • স্ট্রীম/কিউ মেসেজে নতুন ইভেন্ট ফিল্ড যোগ করা।
  • নতুন ফিচার ফ্ল্যাগ মান যোগ করা, পুরনো আচরণ ডিফল্ট রাখা।

অ্যাডিটিভ কেবল তখনই "নিরাপদ" যদি পুরনো ভোক্তারা সহনশীল হয়: তারা অজানা ফিল্ড উপেক্ষা করে এবং নতুন কোন জিনিস বাধ্যতামূলক না।

ব্রেকিং পরিবর্তন (ঝুঁকিপূর্ণ)

ব্রেকিং পরিবর্তন কোনো কিছুকে বদলায় বা মুছে দেয় যা ভোক্তা ইতিমধ্যেই নির্ভর করে।

সাধারণ ডাটাবেস ব্রেকিং পরিবর্তন:

  • কোলাম টাইপ বদলানো (string → integer, timestamp precision বদল)।
  • ফিল্ড/কোলাম রিনেম করা (সব কিছু পুরোনো নাম পড়বে না)।
  • কোনও কোলাম/টেবিল ড্রপ করা যা এখনও কোয়েরি করা হচ্ছে।

নন-ডাটাবেস ব্রেকিং পরিবর্তন:

  • রিকোয়েস্ট/রেসপন্স JSON ফিল্ড নাম পরিবর্তন/অপসারণ।
  • ইভেন্ট semantics পরিবর্তন (একই ফিল্ড নাম, ভিন্ন মানে)।
  • ওয়েবহুক পে-লোড স্ট্রাকচার পরিবর্তন করা ছাড়াই ভার্সন বাড়ানো না করা।

সবসময় ভোক্তা প্রভাব লিখে রাখুন

মার্জ করার আগে নথিভুক্ত করুন:

  • কে এটি খায় (সার্ভিস, ড্যাশবোর্ড, ডেটা পাইপলাইন, পার্টনার)।
  • কম্প্যাটিবিলিটি (ব্যাকওয়ার্ড/ফরওয়ার্ড, কতদিন)।
  • ফেইলিয়র মোড (পার্সিং ত্রুটি, নীরব ডেটা করাপশন, ভুল বিজনেস লজিক)।

এই সংক্ষিপ্ত "ইমপ্যাক্ট নোট" স্পষ্টতা জোরদার করে—বিশেষত যখন AI-জেনারেটেড কোড ইমপ্লিসিটভাবে স্কিমা পরিবর্তন এনে দেয়।

স্কিমা ও ইন্টারফেসগুলোর ভার্সনিং কৌশল

ভার্সনিং বলে দেয় অন্য সিস্টেমগুলো (এবং ভবিষ্যৎ আপনি) "এটা বদলে গেছে, এবং এখন কতটা ঝুঁকির।" উদ্দেশ্য কাগজপত্র নয়—এটি হচ্ছে ক্লায়েন্ট, সার্ভিস, বা ডেটা পাইপলাইন ভিন্ন গতিতে আপডেট হলে নীরব ব্রেকেজ ঠেকানো।

সাধারণ-ভাষার সেমান্টিক ভার্সনিং মাইন্ডসেট

major / minor / patch ধারণা ভাবুন, এমনকি আপনি সরাসরি 1.2.3 প্রকাশ না করলেও:

  • Major: ব্রেকিং পরিবর্তন। পুরান ভোক্তারা ব্যর্থ বা ভুল আচরণ করতে পারে।
  • Minor: নিরাপদ অ্যাডিশন। পুরান ভোক্তারা কাজ চালিয়ে যায়; নতুন ভোক্তারা নতুন ক্ষমতা ব্যবহার করে।
  • Patch: বাগ ফিক্স বা ব্যাখ্যা যা মানে বদলায় না।

একটি সহজ নিয়ম: বিদ্যমান ফিল্ডের মানে নীরবে বদলাবেন না। যদি status=\"active\" আগে "পে করা কাস্টমার" বোঝাত, তাকে "অ্যাকাউন্ট আছে" বলতে রূপান্তর করবেন না। নতুন ফিল্ড বা নতুন সংস্করণ যোগ করুন।

ভার্সন করা এন্ডপয়েন্ট বনাম ভার্সন করা ফিল্ড

বাস্তবে দুটি ব্যবহারিক অপশন থাকে:

1) ভার্সন করা এন্ডপয়েন্ট (উদাহরণ: /api/v1/orders এবং /api/v2/orders):

যখন পরিবর্তন সত্যিই ব্রেকিং বা ব্যাপক তখন ভালো। এটি পরিষ্কার, কিন্তু কপি এবং দীর্ঘমেয়াদী রক্ষণাবেক্ষণ বাড়ায়।

2) ভার্সন করা ফিল্ড / অ্যাডিটিভ বিবর্তন (উদাহরণ: new_field যোগ করে old_field রাখা):

যখন আপনি অ্যাডিটিভভাবে বদলাতে পারেন তখন ভালো। পুরোনো ক্লায়েন্ট অজানা ক্ষেত্র উপেক্ষা করে; নতুন ক্লায়েন্ট নতুন ফিল্ড পড়ে। সময়ে সময়ে পুরোনো ফিল্ড ডিপ্রিকেট ও মুছা হবে স্পষ্ট প্ল্যানে।

ইভেন্ট স্কিমা এবং রেজিস্ট্রি

স্ট্রীম, 큐, এবং ওয়েবহুকের জন্য, ভোক্তারা প্রায়ই আপনার ডিপ্লয়মেন্ট কন্ট্রোলের বাইরে থাকে। একটি স্কিমা রেজিস্ট্রি (অথবা কেন্দ্রীয় স্কিমা ক্যাটালগ যেটি কম্প্যাটিবিলিটি চেক করে) সাহায্য করে নিয়ম প্রয়োগে, যেমন "শুধু অ্যাডিটিভ পরিবর্তন অনুমোদিত" এবং বোঝায় কোন প্রডিউসার ও কনজিউমার কোন সংস্করণের উপর নির্ভর করে।

নিরাপদ রোলআউট: এক্সপ্যান্ড/ব্যাকফিল/সুইচ/কনট্রাক্ট (সবচেয়ে নির্ভরযোগ্য প্যাটার্ন)

বহু সার্ভিস, জব, এবং AI-জেনারেটেড কম্পোনেন্ট থাকলে স্কিমা পরিবর্তন শিপ করার সবচেয়ে নিরাপদ উপায় হলো expand → backfill → switch → contract প্যাটার্ন। এটি ডাউনটাইম কমায় এবং এমন "সব বা কিছুই না" ডিপ্লয়মেন্ট এড়ায় যেখানে একটি পিছিয়ে থাকা ভোক্তা প্রোডাকশন ভেঙে দেয়।

চারটি ধাপ (এবং কেন এগুলো কাজ করে)

1) Expand: নতুন স্কিমা একটি ব্যাকওয়ার্ড-কম্প্যাটিবল উপায়ে পরিচয় করান। বিদ্যমান রিডার ও রাইটার অপরিবর্তিতভাবে কাজ করতে পারবে।

2) Backfill: পুরনো ডেটার জন্য নতুন ফিল্ড পূরণ করুন (অথবা মেসেজগুলো পুনরায় প্রক্রিয়া করুন) যাতে সিস্টেম সঙ্গত হয়।

3) Switch: রাইটার ও রিডার নতুন ফিল্ড/ফরম্যাট ব্যবহার করতে আপডেট করুন। ধীরে ধীরে (ক্যানারি, শতাংশ রোলআউট) করা যেতে পারে কারণ স্কিমা দুইভাবে সাপোর্ট করে।

4) Contract: নিশ্চিত হওয়ার পর পুরোনো ফিল্ড/ফরম্যাট মুছুন।

দুই-ধাপ (expand → switch) এবং তিন-ধাপ (expand → backfill → switch) রোলআউট ডাউনটাইম কমায় কারণ এগুলো ঘন কাপলিং এড়ায়: রাইটার আগে সরতে পারে, রিডার পরে সরতে পারে, এবং উভয়ই আলাদাভাবে পরিবর্তিত হতে পারে।

উদাহরণ: একটি কোলাম যোগ করা, ব্যাকফিল করা, তারপর সেটি বাধ্যতামূলক করা

ধরা যাক আপনি customer_tier যোগ করতে চান।

  • Expand: customer_tier কে nullable হিসেবে যোগ করুন, ডিফল্ট NULL।
  • Backfill: বিদ্যমান রোদের জন্য টিয়ার হিসাব করে একটি জব চালান।
  • Switch: অ্যাপ ও পাইপলাইন আপডেট করে সবসময় customer_tier লিখবে, এবং রিডাররা এটাকেই প্রাধান্য দেবে।
  • Contract: মনিটরিংয়ের পরে এটিকে NOT NULL করুন (এবং ঐতিহ্যবাহী লজিক বাদ দিন)।

সমন্বয়: রাইটার ও রিডারকে একমত করতে হবে

প্রতিটি স্কিমাকে প্রযোজক (রাইটার) এবং ভোক্তা (রিডার) এর মধ্যে একটি চুক্তি হিসেবে বিবেচনা করুন। এআই-নির্মিত সিস্টেমে এটা সহজে মিস হয় কারণ নতুন কোড পথ দ্রুত আসে। রোলআউটগুলো স্পষ্ট করুন: কে কোন সংস্করণ লিখছে, কোন সার্ভিস দুটোই পড়তে পারে, এবং পুরোনো ফিল্ড কখন মুছা যাবে তার সঠিক "চুক্তির তারিখ" ডকুমেন্ট করুন।

ডাটাবেস মাইগ্রেশন: প্রোডাকশন ভেঙে না দিয়ে ডেটা কিভাবে পরিবর্তন করবেন

আপনার পরবর্তী স্কিমা পরিবর্তন পরিকল্পনা করুন
কোড তৈরি করার আগে expand-backfill-switch-contract মাপতে পরিকল্পনা মোড ব্যবহার করুন।

ডাটাবেস মাইগ্রেশন হলো প্রোডাকশন ডাটা ও স্ট্রাকচারকে একটি নিরাপদ অবস্থা থেকে পরের নিরাপদ অবস্থায় নিয়ে যাওয়ার নির্দেশিকা। এআই-নির্মিত সিস্টেমে এদের গুরুত্ব বেশি কারণ জেনারেটেড কোড ভুলভাবে একটি কোলাম আছে ধরে নিতে পারে, inconsistently rename করতে পারে, বা কনস্ট্রেইন্ট বদলে ফেলে বিদ্যমান রোদের কথা না ভেবে।

মাইগ্রেশন ফাইল বনাম অটো-মাইগ্রেশন

মাইগ্রেশন ফাইল (সোর্স কন্ট্রোলে চেক-ইন করা) হল স্পষ্ট স্টেপ যেমন "কোলাম X যোগ কর" বা "ইনডেক্স Y তৈরি কর"। এগুলো অডিটেবল, রিভিউ করা যায়, এবং স্টেজিং/প্রোডে পুনরায় চালানো যায়।

অটো-মাইগ্রেশন (ORM/framework দ্বারা জেনারেটেড) প্রাথমিক ডেভেলপমেন্ট ও প্রোটোটাইপের জন্য সুবিধাজনক, কিন্তু প্রোডাকশনে ঝুঁকিপূর্ণ অপারেশন (কোলাম ড্রপ, টেবিল রিবিল্ড) তৈরি করতে পারে বা পরিবর্তনগুলোর অর্ডার অনাকাঙ্ক্ষিতভাবে বদলে দিতে পারে।

প্রায়োগিক নিয়ম: অটো-মাইগ্রেশন ব্যবহার করে ড্রাফট তৈরি করতে পারেন, কিন্তু প্রোডাকশনে যা যায় তা রিভিউ করা মাইগ্রেশন ফাইল হিসেবে রূপান্তর করুন।

আইডেম্পোটেন্সি এবং অর্ডারিং

মাইগ্রেশনগুলো যতটা সম্ভব idempotent রাখুন: আবার চালালে ডেটা করাপট বা ব্যর্থ হওয়া উচিত নয়। "create if not exists" প্যাটার্ন ব্যবহার করুন, নতুন কোলাম প্রথমে nullable রাখুন, এবং ডেটা রূপান্তর গার্ড চেক দিয়ে সুরক্ষিত করুন।

প্রতিটি পরিবেশে একই মাইগ্রেশন সিকোয়েন্স প্রয়োগ হোক—local, CI, staging, prod। ম্যানুয়াল SQL দিয়ে প্রোডাকশন ঠিক করো না, না হলে সেটি পরে একটি মাইগ্রেশনে ক্যাপচার করো।

লকিং ছাড়া দীর্ঘ-রানিং মাইগ্রেশন

কিছু স্কিমা পরিবর্তন বড় টেবিল লক করে লেখাকে ব্লক করতে পারে। ঝুঁকি কমানোর উপায়:

  • আপনার ডাটাবেসে অনলাইন/লক-মিনিমাইজিং অপারেশন ব্যবহার করুন (উদাহরণ: concurrent index builds)।
  • পরিবর্তনগুলো ধাপে ভাগ করুন: প্রথমে নতুন স্ট্রাকচার যোগ করুন, ব্যাচে ব্যাকফিল করুন, তারপর অ্যাপে সুইচ করুন।
  • ভারি অপারেশনগুলো লো-ট্রাফিক উইন্ডোতে শিডিউল করুন, টাইমআউট ও মনিটরিং রাখুন।

মাল্টি-টেন্যান্ট ও শার্ড করা সেটআপ

মাল্টি-টেন্যান্ট ডাটাবেসের জন্য, প্রতিটি টেন্যান্টের জন্য নিয়ন্ত্রিত লুপে মাইগ্রেশন চালান, প্রগ্রেস ট্র্যাকিং ও নিরাপদ রিট্রাই সহ। শার্ড হলে প্রতিটি শার্ডকে আলাদা প্রোডাকশন সিস্টেম হিসেবে বিবেচনা করুন: শার্ড-বাই-শার্ড মাইগ্রেশন চালান, হেলথ যাচাই করুন, তারপর এগিয়ে যান। এতে ব্লাস্ট রেডিয়াস সীমিত হয় এবং রোলব্যাক সম্ভব হয়।

ব্যাকফিল ও রি-প্রসেসিং: বিদ্যমান ডেটা আপডেট করা

ব্যাকফিল হলো নতুন যোগ করা ফিল্ড বা সংশোধিত ভ্যালুর জন্য বিদ্যমান রেকর্ড আপডেট করা। রি-প্রসেসিং হলো ঐতিহাসিক ডেটাকে পাইপলাইনের মধ্য দিয়ে পুনরায় চালানো—সাধারণত ব্যবসায়িক নিয়ম বদলে গেলে, বাগ ঠিক করলে, বা মডেল/আউটপুট ফরম্যাট আপডেট হলে।

স্কিমা পরিবর্তনের পরে উভয়ই সাধারণ: নতুন ডেটার জন্য নতুন আকার লেখা সহজ, কিন্তু প্রোডাকশন সিস্টেমগুলো কালগত ডেটার সঙ্গততার উপর নির্ভর করে।

সাধারণ পন্থা

অনলাইন ব্যাকফিল (প্রোডাকশনে, ধাপে ধাপে)। নিয়ন্ত্রিত জব চালিয়ে রেকর্ড আপডেট করুন ছোট ব্যাচে। এইটা ক্রিটিক্যাল সার্ভিসের জন্য নিরাপদ কারণ আপনি লোড থ্রটল করতে, পজ ও রিজিউম করতে পারেন।

ব্যাচ ব্যাকফিল (অফলাইনে বা শিডিউলড জব)। লোড বেশি হলেও বড় অংশ প্রক্রিয়া করা সহজ। অপারেশনালভাবে সরল, কিন্তু ডাটাবেস লোডে শক বা ভুল থেকে পুনরুদ্ধারতে বেশি সময় লাগতে পারে।

লেজি ব্যাকফিল অন রিড। পুরনো রেকর্ড পড়ার সময় অ্যাপ্লিকেশন অন-দ-ফ্লাই মিসিং ফিল্ড গণনা/পপুলেট করে লিখে দেয়। এটি খরচ ছড়িয়ে দেয় কিন্তু প্রথম রিড ধীর করে এবং অনেক পুরনো ডেটা দীর্ঘ সময় না কনভার্টেড থাকা ঝুঁকি থাকে।

প্রকৃত পক্ষে, টিমগুলো প্রায়শই মিলিত পদ্ধতি ব্যবহার করে: লং-টেইল রেকর্ডের জন্য লেজি ব্যাকফিল এবং সবচেয়ে অ্যাক্সেস হওয়া ডেটার জন্য অনলাইন জব।

ব্যাকফিল কিভাবে যাচাই করবেন

ভ্যালিডেশন স্পষ্ট ও পরিমাপযোগ্য হওয়া উচিত:

  • কাউন্টস: কতটি রো/ইভেন্ট আপডেট হওয়া উচিত বনাম কতটি আপডেট হয়েছে।
  • চেকসাম/অ্যাগ্রিগেটস: টোটালগুলোর তুলনা (যেমন পরিমাণের যোগফল, ডিস্টিঙ্ক্ট আইডি) আগে/পরে।
  • স্যাম্পলিং: একটি স্ট্যাটিস্টিক্যালি অর্থবহ স্যাম্পল স্পট-চেক করুন, এজ কেসসহ।

ডাউনস্ট্রিম প্রভাবও যাচাই করুন: ড্যাশবোর্ড, সার্চ ইন্ডেক্স, ক্যাশ, এবং যেসব এক্সপোর্ট আপডেট হওয়া ফিল্ডের উপর নির্ভর করে।

খরচ, সময়, এবং গ্রহণযোগ্যতার মানদণ্ড

ব্যাকফিল গতিকে (শীঘ্র শেষ করা) বনাম ঝুঁকি ও খরচে (লোড, কম্পিউট, অপারেশনাল ওভারহেড) ট্রেড-অফ করে। আগে থেকেই ক্লিয়ার কিউট করুন: "ডান" হওয়ার মানে কী, প্রত্যাশিত রানটাইম, সর্বোচ্চ অনুমোদিত ত্রুটি হার, এবং ভ্যালিডেশন ফেইল হলে কী করবেন (পজ, রেট্রাই, বা রোলব্যাক)।

ইভেন্ট ও মেসেজ স্কিমা বিবর্তন (স্ট্রীম, 큐, ওয়েবহুক)

স্কিমা শৃঙ্খলা ধরে নির্মাণ করুন
চ্যাটে React, Go এবং PostgreSQL অ্যাপ তৈরি করুন, স্কিমা ও মাইগ্রেশনগুলো স্পষ্ট রেখে।

স্কিমা শুধু ডাটাবেসেই থাকে না। যখন একটি সিস্টেম অন্যটির কাছে ডেটা পাঠায়—Kafka টপিক, SQS/RabbitMQ 큐, ওয়েবহুক পে-লোড, এমনকি অস্তিত্বগত স্টোরেজে লেখা "ইভেন্ট"—আপনি একটি চুক্তি তৈরি করেছেন। প্রযোজক ও ভোক্তা স্বাধীনভাবে চলার কারণে এই চুক্তিগুলো প্রায়ই একটি অ্যাপের অভ্যন্তরীণ টেবিলের চেয়ে বেশি ভাঙ্গে।

সবচেয়ে নিরাপদ ডিফল্ট: ইভেন্টকে ব্যাকওয়ার্ড-কম্প্যাটিবলি বিবর্তিত করুন

ইভেন্ট স্ট্রীম ও ওয়েবহুক পে-লোডের জন্য, পুরোনো ভোক্তা উপেক্ষা করতে পারে এমন পরিবর্তন পছন্দ করুন এবং নতুন ভোক্তা গ্রহণ করতে পারে।

প্রায়োগিক নিয়ম: ফিল্ড যোগ করুন, মুছবেন না বা রিনেম করবেন না। যদি কিছু ডিপ্রিকেট করতে হয়, কিছু সময় ধরে সেটি পাঠাতে থাকুন এবং ডকুমেন্ট করুন ডিপ্রিকেটেড হিসেবে।

উদাহরণ: একটি OrderCreated ইভেন্টকে অপশনাল ফিল্ড যোগ করে সম্প্রসারিত করা।

{
  \"event_type\": \"OrderCreated\",
  \"order_id\": \"o_123\",
  \"created_at\": \"2025-12-01T10:00:00Z\",
  \"currency\": \"USD\",
  \"discount_code\": \"WELCOME10\"
}

পুরোনো কনজিউমাররা order_id এবং created_at পড়ে এবং বাকিটা উপেক্ষা করে।

কনজিউমার-চালিত কনট্র্যাক্ট (সাদামাঠা ভাষায়)

প্রডিউসার অনুমান না করে, কনজিউমাররা প্রকাশ করে তারা কীতে নির্ভর করে (ফিল্ড, টাইপ, বাধ্যতামূলক/ঐচ্ছিক নিয়ম)। প্রডিউসার তখন শিপ করার আগে সেই প্রত্যাশার বিরুদ্ধে পরিবর্তন ভ্যালিডেট করে। এটি বিশেষভাবে কাজে লাগে AI-জেনারেটেড কোডবেসে, যেখানে মডেল হয়ত সহায়তামূলকভাবে ফিল্ডের নাম বদলে দিতে বা টাইপ পরিবর্তন করতে পারে।

“অজানা ফিল্ড” নিরাপদে হ্যান্ডল করা

পার্সারগুলো টলারেন্ট রাখুন:

  • অজানা ফিল্ড উপেক্ষা করুন ডিফল্টভাবে (নতুন কী আসলে ফেইল করবেন না)।
  • নতুন ফিল্ডকে ঐচ্ছিক ধরে নিন যতক্ষণ আপনি প্রকৃতপক্ষে তাদের প্রয়োজন করেন না।
  • অপ্রত্যাশিত ফিল্ডগুলো কম-স্তরের লগে লগ করুন যাতে গ্রহণের ইস্যু দেখা যায় পেজিং ছাড়াই।

যখন ব্রেকিং পরিবর্তন দরকার, নতুন ইভেন্ট টাইপ বা ভার্সন করা নাম ব্যবহার করুন (উদাহরণ OrderCreated.v2) এবং সব কনজিউমার মাইগ্রেট না করা পর্যন্ত দুটো একসাথে চালান।

AI আউটপুটকে স্কিমা হিসেবে দেখা: প্রম্পট, মডেল, এবং স্ট্রাকচার্ড রেসপন্স

আপনি যখন সিস্টেমে একটি LLM যোগ করেন, তার আউটপুট দ্রুত একটি ডি-ফ্যাক্টো স্কিমা হয়ে যায়—যদিও কেউ আনুষ্ঠানিক স্পেসিফিকেশন না লিখতেও পারে। ডাউনস্ট্রিম কোড শুরু করে ধরে নেওয়া যে "একটা summary ফিল্ড থাকবে", "প্রথম লাইন হল শিরোনাম", বা "বুলেট - দিয়ে পৃথক করা"। সেই অনুমানগুলো সময়ের সাথে শক্ত হয়ে যায়, এবং মডেলের আচরণ সামান্য পরিবর্তিত হলেই সেগুলো ভেঙে পড়ে, ঠিক যেমন একটি ডাটাবেস কোলাম রিনেম হলে ভেঙে পড়ে।

স্পষ্ট স্ট্রাকচার পছন্দ করুন (এবং ভ্যালিডেট করুন)

"প্রিটি টেক্সট প্যার্স করা" থেকে বিরত থেকে স্ট্রাকচার্ড আউটপুট (সাধারণত JSON) জিজ্ঞাসা করুন এবং সেগুলো পুরো সিস্টেমে ঢোকার আগে ভ্যালিডেশন করুন। এটাকে ভাবুন "বেস্ট-এফোর্ট" থেকে একটি চুক্তিতে উন্নীত করার মতো।

প্রায়োগিক পদ্ধতি:

  • মডেল রেসপন্সের জন্য একটি JSON schema (অথবা টাইপেড ইন্টারফেস) সংজ্ঞায়িত করুন।
  • অবৈধ রেসপন্স অগ্রাহ্য করুন বা কয়ারেন্টাইন করুন (চুপচাপ কোরস করা নয়)।
  • ভ্যালিডেশন ত্রুটিগুলো লগ করুন যাতে আপনি কী বদলে যাচ্ছে তা দেখতে পান।

এটি বিশেষভাবে গুরুত্বপূর্ণ যখন LLM আউটপুট ডেটা পাইপলাইন, অটোমেশন, বা ইউজার-ফেসিং কন্টেন্টে খাওয়ানো হয়।

মডেল ড্রিফটের জন্য পরিকল্পনা করুন

একই প্রম্পট থাকলেও আউটপুট সময়ের সাথে পরিবর্তিত হতে পারে: ফিল্ড বাদ পড়ে, অতিরিক্ত কী আসে, এবং টাইপ বদলে যায় (\"42\" বনাম 42, অ্যারে বনাম স্ট্রিং)। এগুলোকে স্কিমা বিবর্তন ইভেন্ট হিসেবে বিবেচনা করুন।

কাজ করা কিছু খাঁচা:

  • যেখানে যৌক্তিক, ফিল্ডগুলোকে ঐচ্ছিক রাখুন এবং ডিফল্ট স্পষ্টভাবে সেট করুন।
  • অজানা কী কে অনুমোদন দিন কিন্তু নিরাপদে উপেক্ষা করুন (যদি আপনি কড়া না হন কমপ্লায়েন্স কারণে)।
  • "গার্ডরেল" চেক যোগ করুন (যেমন বাধ্যতামূলক ফিল্ড, সর্বোচ্চ লম্বা, enum মান)।

প্রম্পট পরিবর্তনকে API পরিবর্তনের মতই আচরণ করুন

একটি প্রম্পট হল একটি ইন্টারফেস। যদি আপনি এটাকে এডিট করেন, ভার্সন করুন। prompt_v1, prompt_v2 রাখুন এবং ধাপে ধাপে রোলআউট করুন (ফিচার ফ্ল্যাগ, ক্যানারিজ, বা পার-টেন্যান্ট টগল)। পরিবর্তন প্রোমোট করার আগে একটি ফিক্সড ইভালুয়েশন সেট দিয়ে টেস্ট করুন, এবং যতক্ষণ না ডাউনস্ট্রিম কনজিউমার অভিযোজিত হচ্ছে পুরোনো ভার্সন চালিয়ে রাখুন। নিরাপদ রোলআউট মেকানিক্স সম্পর্কে আরও জানতে, আপনার পদ্ধতিকে /blog/safe-rollouts-expand-contract এর সঙ্গে লিংক করুন।

স্কিমা পরিবর্তনের জন্য টেস্টিং ও ভ্যালিডেশন

স্কিমা পরিবর্তন সাধারণত কাহিনীহীন, ব্যয়বহুল উপায়ে ব্যর্থ হয়: একটি কোলাম এক পরিবেশে মিস, একটি কনজিউমার পুরোনো ফিল্ড আশা করে, বা মাইগ্রেশন খালি ডেটায় ঠিক চলে কিন্তু প্রোডাকশনে টাইমআউট করে। টেস্টিংই সেই 'সারপ্রাইজ'-গুলোকে পূর্বানুমেয় করে তোলে।

তিন স্তরের টেস্ট (এবং প্রতিটি কী ধরবে)

ইউনিট টেস্ট লোকাল লজিক রক্ষা করে: ম্যাপিং ফাংশন, সিরিয়ালাইজার/ডিসিরিয়ালাইজার, ভ্যালিডেটর, এবং কোয়েরি বিল্ডার। ফিল্ড রিনেম হলে বা টাইপ বদলে গেলে ইউনিট টেস্ট লজিকের কাছাকাছি ব্যর্থ হওয়া উচিত।

ইন্টিগ্রেশন টেস্ট নিশ্চিত করে অ্যাপ আসল ডিপেন্ডেন্সিগুলোর সাথে কাজ করে: প্রকৃত ডাটাবেস ইঞ্জিন, রিয়েল মাইগ্রেশন টুল, এবং রিয়েল মেসেজ ফরম্যাট। এখানে আপনি ধরেন "ORM মডেল পরিবর্তিত কিন্তু মাইগ্রেশন নয়" বা "নতুন ইনডেক্স নাম সংঘর্ষ করে"।

এন্ড-টু-এন্ড টেস্ট সার্ভিস জুড়ে ইউজার বা ওয়ার্কফ্লো আউটকাম সিমুলেট করে: ডেটা তৈরি করুন, মাইগ্রেট করুন, API দিয়ে পড়ে নিন, এবং যাচাই করুন ডাউনস্ট্রিম কনজিউমার সঠিক আচরণ করে।

প্রডিউসার ও কনজিউমারের জন্য কনট্র্যাক্ট টেস্ট

স্কিমা বিবর্তন প্রায়ই বাউন্ডারিতে ভেঙে: সার্ভিস-টু-সার্ভিস API, স্ট্রীম, 큐, ওয়েবহুক। কনট্র্যাক্ট টেস্ট যোগ করুন যা দুপক্ষেই চলে:

  • প্রডিউসার প্রমাণ করে তারা এক সম্মত কনট্র্যাক্ট মেলে এমন ইভেন্ট/রেসপন্স ইমিট করতে পারে।
  • কনজিউমার প্রমাণ করে রোলআউটের সময় তারা পুরোনো ও নতুন উভয় ভার্সন পার্স করতে পারে।

মাইগ্রেশন টেস্টিং: ফ্রেশ এনভায়রনমেন্টে অ্যাপলি ও রোলব্যাক

মাইগ্রেশনগুলো যেভাবে ডিপ্লয় হয়, তেমনভাবেই টেস্ট করুন:

  • ক্লিন ডাটাবেস স্ন্যাপশট দিয়ে শুরু করুন।
  • সব মাইগ্রেশন অর্ডারে প্রয়োগ করুন।
  • অ্যাপ পড়তে/লিখতে পারে তা যাচাই করুন।
  • রোলব্যাক (যদি সাপোর্ট করা থাকে) বা ডাউন মাইগ্রেশন চালিয়ে নিশ্চিত করুন এটি কাজ করে।

পুরোনো ও নতুন স্কিমা সংস্করণের জন্য ফিক্সচার

কিছু ছোট ফিক্সচার রাখুন যা:

  • পূর্ববর্তী স্কিমার অধীনে লেখা ডেটা (লিগ্যাসি রো/ইভেন্ট) দেখায়।
  • নতুন স্কিমার অধীনে লেখা ডেটা দেখায়।

এই ফিক্সচারগুলো রিগ্রেশন স্পষ্ট করে, বিশেষত যখন AI-জেনারেটেড কোড সূক্ষ্মভাবে ফিল্ড নাম, ঐচ্ছিকতা, বা ফরম্যাট পরিবর্তন করে।

অবজার্ভেবিলিটি: ভঙ্গন দ্রুত আবিষ্কার করা

ইভেন্ট স্কিমা সাবধানে বিকাশ করুন
অজানা ফিল্ড সহ্য করতে পারে এমন ইভেন্ট পে-লোড ডিজাইন করুন এবং কনজিউমার ভাঙা থেকে বিরত রাখুন।

স্কিমা পরিবর্তন সাধারণত ডেপ্লয় হওয়ার সাথে সঙ্গেই জোরে ভেঙে পড়ে না। পরিবর্তনের পরে পার্সিং ত্রুটি, অজানা ফিল্ড সতর্কতা, মিসিং ডেটা, বা ব্যাকগ্রাউন্ড জব বিলম্ব বেড়ে যাওয়া ধীরে ধীরে দেখা যায়। ভাল অবজার্ভেবিলিটি সেই সূক্ষ্ম সিগন্যালগুলোকে কার্যকর প্রতিক্রিয়ায় পরিণত করে যখন আপনি এখনও রোলআউট পজ করতে পারেন।

রোলআউট চলাকালীন কী মনিটর করবেন

বেসিক (অ্যাপ হেলথ) থেকে শুরু করে স্কিমা-স্পেসিফিক সিগন্যাল যোগ করুন:

  • এরর: 4xx/5xx স্পাইক, কিন্তু JSON পার্সিং ব্যর্থতা, ডিসিরিয়ালাইজেশন ত্রুটি, এবং রিট্রাই-ও।
  • লেটেন্সি: p95/p99 রেসপন্স টাইম এবং 큐 প্রসেসিং টাইম।
  • ডেটা কোয়ালিটি সিগন্যাল: গুরুত্বপূর্ণ কোলামে null-রেট বৃদ্ধি, ইভেন্ট ভলিউমে হঠাৎ পতন, নতুন ডিফল্ট মান খুব বেশি দেখা, বা পুরোনো বনাম নতুন রূপায়নের মধ্যে মিসম্যাচ।
  • পাইপলাইন ল্যাগ: কনজিউমার ল্যাগ, ওয়েবহুক ডেলিভারি ব্যাকলগ, এবং মাইগ্রেশন জব থ্রুপুট।

কী গুরুত্বপূর্ণ তা হলো আগে বনাম পরে তুলনা করা এবং ক্লায়েন্ট ভার্সন, স্কিমা ভার্সন, ও ট্রাফিক সেগমেন্ট (ক্যানারি বনাম স্টেবল) দ্বারা স্লাইস করা।

দরকারি ড্যাশবোর্ড

দুইটি ড্যাশবোর্ড ভিউ তৈরি করুন:

  1. অ্যাপ্লিকেশন আচরণ ড্যাশবোর্ড

    • রিকুয়েস্ট রেট, এরর রেট, লেটেন্সি (RED)
    • টপ এক্সসেপশন (মেসেজ দ্বারা গ্রুপ করা)
    • ভ্যালিডেশন/পার্সিং এরর কাউন্ট ও শতাংশ
    • পে-লোড সাইজ ডিস্ট্রিবিউশন (অপ্রত্যাশিত বড় মেসেজ ধরার জন্য)
  2. মাইগ্রেশন ও ব্যাকগ্রাউন্ড জব ড্যাশবোর্ড

    • মাইগ্রেশন জব প্রগ্রেস (% complete), রোজ প্রসেসড/সেক, ETA
    • ফেলিয়ার রেট ও রিট্রাই কাউন্ট
    • 큐 ডেপথ / কনজিউমার ল্যাগ
    • ডেড-লেটার 큐 ভলিউম (যদি প্রযোজ্য)

যদি আপনি expand/contract রোলআউট চালান, একটি প্যানেল রাখুন যা পুরোনো বনাম নতুন স্কিমা দ্বারা রিড/রাইট বিভাজন দেখায় যাতে আপনি দেখতে পান কখন পরবর্তী ধাপে যাওয়া নিরাপদ।

স্কিমা-স্পেসিফিক ত্রুটির জন্য অ্যালার্ট

এসব ইস্যুতে পেজ করুন যা ডেটা ড্রপ বা ভুল পড়ার ইঙ্গিত দেয়:

  • স্কিমা ভ্যালিডেশন এরর রেট একটি নিম্ন থ্রেশহোল্ডের উপরে (প্রায় \u003c0.1% থেকেও অর্থপূর্ণ)।
  • পার্সিং/ডিসিরিয়ালাইজেশন ব্যর্থতা (বিশেষত যদি একটি প্রডিউসার/কনজিউমারে συγκ集中 হয়)।
  • অপ্রত্যাশিত ফিল্ড / অনুপস্থিত বাধ্যতামূলক ফিল্ড সতর্কতা বাড়ছে।
  • মাইগ্রেশন জব আটকে গেছে (N মিনিট কোনো প্রগ্রেস নেই) বা ল্যাগ থ্রুপুটের চেয়ে দ্রুত বাড়ছে

কাঁচা 500s নিয়ে নয়রেনপ্রস্তুত অ্যালার্ট এড়িয়ে চলুন; অ্যালার্টগুলোকে স্কিমা রোলআউটের সাথে ট্যাগ করে (যেমন স্কিমা ভার্সন ও এন্ডপয়েন্ট) কনটেক্সট দিন।

ডিবাগ দ্রুত করার জন্য ভার্সন লগ করুন

ট্রানজিশনের সময় লগে অন্তর্ভুক্ত ও লগ করুন:

  • স্কিমা ভার্সন (উদাহরণ: X-Schema-Version হেডার, মেসেজ মেটাডাটা ফিল্ড)
  • প্রডিউসার ও কনজিউমার অ্যাপ ভার্সন
  • মডেল ভার্সন / প্রম্পট ভার্সন যখন AI-জেনারেটেড আউটপুট স্ট্রাকচার্ড ডেটা খাওয়ায়

এই একটি বিবরণঘটনা করে "কেন এই পে-লোড ব্যর্থ হলো?" উত্তর মিনিটে পাওয়া যায়, দিন নয়—বিশেষত যখন একাধিক সার্ভিস বা মডেল ভার্সন একইসময় লাইভ আছে।

রোলব্যাক, রিকভারি, এবং চেঞ্জ ম্যানেজমেন্ট

স্কিমা পরিবর্তন দুইভাবে ব্যর্থ হয়: পরিবর্তনটি নিজেই ভুল, অথবা চারপাশের সিস্টেম প্রত্যাশার মতো আচরণ করে না (বিশেষত যখন AI-জেনারেটেড কোড সূক্ষ্ম অনুমান নিয়ে আসে)। যাইই হোক, প্রতিটি মাইগ্রেশনের আগে একটি রোলব্যাক গল্প থাকা উচিত—যদিও সেই গল্পটি স্পষ্টভাবে "কোন রোলব্যাক নেই"ও হতে পারে।

"নো রোলব্যাক" সিদ্ধান্ত তখনই বৈধ যখন পরিবর্তন অব্যাহত (উদাহরণ: কোলাম ড্রপ করা, আইডেন্টিফায়ার পুনরলিখন, বা ডুপলিকেট্স ডেস্ট্রাকটিভভাবে সরিয়ে ফেলা)। কিন্তু "নো রোলব্যাক" মানে পরিকল্পনা নেই না; এটি সিদ্ধান্তকে ফরওয়ার্ড ফিক্স, রিস্টোর, এবং কনটেইনমেন্টের দিকে সরিয়ে দেয়।

ব্যবহারিক রোলব্যাক অপশন যা বাস্তবে কাজ করে

ফিচার ফ্ল্যাগ / কনফিগ গেটস: নতুন রিডার, রাইটার, ও API ফিল্ডগুলো ফ্ল্যাগের পিছনে রাখুন যাতে নতুন আচরণ ছাড়া ডিফল্টে ফিরিয়ে আনা যায়। এআই-জেনারেটেড কোড সিনট্যাকটিকভাবে সঠিক হলেও সেমান্টিকভাবে ভুল হলে এটা বিশেষভাবে সহায়ক।

ডুয়াল-রাইট বন্ধ করার সুইচ: expand/contract রোলআউটে যদি আপনি পুরোনো ও নতুন দুটো স্কিমায় লিখেন, একটি কিল-সুইচ রাখুন। নতুন রাইট পাথ বন্ধ করলে আরও বিচ্যুতি থামবে যখন আপনি তদন্ত করছেন।

রিডার রিভার্ট করুন (শুধু রাইটার নয়): অনেক ইন্সিডেন্ট হয় কারণ কনজিউমাররা নতুন ফিল্ড বা নতুন টেবিল পড়তে শুরু করে অকালেই। সার্ভিসগুলোকে সহজে পূর্ববর্তী স্কিমা ভার্সনে পয়েন্ট করা বা নতুন ফিল্ড উপেক্ষা করার সুবিধা রাখুন।

reveribility এর সীমা জানুন

কিছু মাইগ্রেশন পরিষ্কারভাবে উল্টানো যায় না:

  • ধ্বংসাত্মক রূপান্তর (উদাহরণ: হ্যাশিং, লসি নরমালাইজেশন)।
  • কপি না রেখে ড্রপ/রিনেম।
  • ব্যাকফিল যা "সোর্স অফ ট্রুথ" ভ্যালুকে ওভাররাইট করে।

এগুলোর জন্য ব্যাকআপ থেকে রিস্টোর, ইভেন্ট থেকে রিপ্লে, অথবা রো র ইনপুট থেকে রিকম্পিউট পরিকল্পনা রাখুন—এবং নিশ্চিত করুন ঐ ইনপুটগুলো এখনো আছে।

শিপ করার আগে প্রি-ফ্লাইট চেকলিস্ট

  • রোলব্যাক সিদ্ধান্ত ডকুমেন্ট করা ("রিভার্ট", "ফরওয়ার্ড ফিক্স", বা "নো রোলব্যাক + রিস্টোর পাথ")।
  • স্পষ্ট স্টপ বাটন: ফ্ল্যাগ বা ডুয়াল-রাইট ডিসেবল সুইচ।
  • ব্যাকআপ/স্ন্যাপশট যাচাই; রিস্টোর একবার টেস্ট করা।
  • মাইগ্রেশন idempotent; পুনরায় চালালেও ডেটা করাপট হবে না।
  • মনিটরিং ও অ্যালার্টিং কনফিগারেড (এরর রেট, স্কিমা ভ্যালিডেশন ব্যর্থতা, ল্যাগ)।
  • মালিকানা স্পষ্ট: কে aprob করে, কে চালায়, কে অন-কলে রোলআউট চলাকালীন।

ভাল চেঞ্জ ম্যানেজমেন্ট রোলব্যাককে বিরল করে তোলে—এবং রিকভারি হলে সেটাকে সাধারণ কাজ বানায়।

যদি আপনার টিম AI-সহায়ক ডেভেলপমেন্ট নিয়ে দ্রুত iteration করে, এই পদ্ধতিগুলোকে এমন টুলিংয়ের সঙ্গে জোড়া দিলে কাজে আসে যা নিরাপদ এক্সপেরিমেন্টেশন সাপোর্ট করে। উদাহরণস্বরূপ, Koder.aiplanning mode আছে আগাম পরিবর্তন ডিজাইনের জন্য এবং snapshots/rollback দ্রুত পুনরুদ্ধারের জন্য যখন একটি জেনারেটেড পরিবর্তন ভুল করে কনট্র্যাক্ট সরিয়ে দেয়। একসাথে ব্যবহার করলে দ্রুত কোড জেনারেশন ও শৃঙ্খলাবদ্ধ স্কিমা বিবর্তন আপনাকে দ্রুত অগ্রসর করতে দেয় প্রোডাকশনে পরীক্ষা করার মতো আচরণ না করেই

সাধারণ প্রশ্ন

AI দিয়ে তৈরি সিস্টেমে স্কিমা বলতে কী বোঝায়?

একটি স্কিমা কোনো সিস্টেমের বিভিন্ন অংশে ব্যবহৃত ফিল্ড, ধরন ও অর্থ নির্ধারণ করে। এটি একটি ডেটাবেস টেবিল, API প্রতিক্রিয়া, ইভেন্ট পেলোড, কনফিগ ফাইল বা কাঠামোবদ্ধ AI আউটপুট বর্ণনা করতে পারে।

AI-তৈরি কোডে স্কিমা বেশি ঘন ঘন বদলায় কেন?

AI টুল ছোট প্রম্পট বা পণ্যের পরিবর্তনের পর হ্যান্ডলার, মডেল ও ইন্টিগ্রেশন দ্রুত আবার তৈরি করতে পারে। এসব পরিবর্তনে ফিল্ডের নাম, ডিফল্ট মান, নেস্টিং বা ভ্যালিডেশন বদলে যেতে পারে, তাই প্রকাশের আগে দলকে কনট্র্যাক্ট পরীক্ষা করতে হয়।

অ্যাডিটিভ ও ব্রেকিং স্কিমা পরিবর্তনের মধ্যে পার্থক্য কী?

অ্যাডিটিভ পরিবর্তন এমন কিছু যোগ করে যা পুরোনো কনজিউমাররা নিরাপদে উপেক্ষা করতে পারে, যেমন একটি ঐচ্ছিক API ফিল্ড বা নাল হতে পারে এমন ডেটাবেস কলাম। ব্রেকিং পরিবর্তন কনজিউমাররা আগে থেকেই ব্যবহার করে এমন কিছু সরিয়ে দেয়, নাম বদলায়, ধরন বদলায় বা তার অর্থ পাল্টায়।

এক্সপ্যান্ড, ব্যাকফিল, সুইচ ও কনট্র্যাক্ট কীভাবে কাজ করে?

পুরোনোটি কাজ করার সময় আগে নতুন ফিল্ড বা কাঠামো যোগ করুন। এরপর পুরোনো ডেটা পূরণ করুন, ধীরে ধীরে রিডার ও রাইটার আপডেট করুন, ব্যবহার পর্যবেক্ষণ করুন এবং প্রতিটি কনজিউমার সরে যাওয়ার পরেই পুরোনো পথটি সরান।

প্রয়োজনীয় একটি ডেটাবেস কলাম কীভাবে নিরাপদে যোগ করব?

নতুন কলামটিকে আগে নাল হতে দিন, তারপর ছোট ব্যাচে বিদ্যমান সারিগুলো পূরণ করুন। অ্যাপ্লিকেশনটি যেন এতে লেখা ও পড়া করে তা আপডেট করুন, ডেটা যাচাই করুন এবং কোনো মান অনুপস্থিত না থাকলেই কেবল আবশ্যিক কনস্ট্রেইন্ট যোগ করুন।

প্রোডাকশনে মাইগ্রেশন ফাইল নাকি স্বয়ংক্রিয় মাইগ্রেশন ব্যবহার করা উচিত?

প্রোডাকশন পরিবর্তনের জন্য সোর্স কন্ট্রোলে রাখা পর্যালোচিত মাইগ্রেশন ফাইল ব্যবহার করুন। এগুলো সব পরিবেশে একই ক্রমে ধাপ দেয় এবং ডিপ্লয়মেন্টের আগে রিভিউয়ারদের টেবিল লক, অনিরাপদ ড্রপ ও ডেটা রূপান্তর শনাক্ত করতে দেয়।

ইভেন্ট ও ওয়েবহুক পেলোড কীভাবে পরিবর্তন করব?

ফিল্ডের নাম বদলানো বা সরানোর বদলে ফিল্ড যোগ করুন এবং কনজিউমারদের অজানা ফিল্ড উপেক্ষা করতে দিন। কোনো পরিবর্তনে সামঞ্জস্য ভাঙতেই হলে নতুন ইভেন্ট টাইপ বা সংস্করণ প্রকাশ করুন এবং কনজিউমাররা মাইগ্রেট না করা পর্যন্ত দুই সংস্করণ চালান।

LLM আউটপুট যাতে ডাউনস্ট্রিম সিস্টেম নষ্ট না করে, তা কীভাবে নিশ্চিত করব?

মডেলকে JSON-এর মতো নির্দিষ্ট কাঠামোতে আউটপুট দিতে বলুন, তারপর ডাউনস্ট্রিম কোড ফলাফলটি ব্যবহারের আগে আবশ্যিক ফিল্ড, ধরন, দৈর্ঘ্য ও অনুমোদিত মান যাচাই করুন। আউটপুট কোনো কনট্র্যাক্টে ব্যবহৃত হলে প্রম্পট ও মডেলের পরিবর্তনের সংস্করণ রাখুন।

স্কিমা রোলআউটের সময় কী পর্যবেক্ষণ করা উচিত?

ভ্যালিডেশন ও পার্সিং ত্রুটি, লেটেন্সি, কিউ ল্যাগ, মাইগ্রেশনের অগ্রগতি, নাল রেট এবং স্কিমা সংস্করণ অনুযায়ী রিড বা রাইট ট্র্যাক করুন। ক্যানারি ট্র্যাফিককে স্থিতিশীল ট্র্যাফিকের সঙ্গে তুলনা করুন, যাতে দল দ্রুত কোনো পরিবর্তন থামাতে পারে।

স্কিমা মাইগ্রেশনের জন্য বাস্তবসম্মত রোলব্যাক পরিকল্পনা কী?

ডিপ্লয়মেন্টের আগে ঠিক করুন আপনি পরিবর্তন ফিরিয়ে নিতে পারবেন কি না, সামনের দিকে সংশোধন লাগবে কি না, নাকি ডেটা পুনরুদ্ধার করতে হবে। নতুন রিডার ও রাইটারকে ফ্ল্যাগের আড়ালে রাখুন, ডুয়াল রাইট বন্ধ করার ব্যবস্থা রাখুন এবং অপরিবর্তনীয় কাজের আগে ব্যাকআপ বা স্ন্যাপশট যাচাই করুন।

Related posts