বিভাজন
যে সীমানা ডেটাবেজ ধরে রাখে, কোড নয়
প্রতিটি CRM নিজেকে মাল্টি-টেনান্ট দাবি করে। দাবিটা সস্তা; আসল প্রশ্ন কোন স্তর সীমানা ধরে রাখছে। যদি উত্তর হয় "আমাদের অ্যাপ্লিকেশন সবসময় সঠিক ফিল্টার যোগ করে", তাহলে গ্যারান্টিটি ততটাই ভালো যতটা সেই সবচেয়ে কম বিশ্রাম নেওয়া ডেভেলপার, যিনি কখনো একটি কোয়েরি লিখেছেন।
iKonekt প্রথম মাইগ্রেশন থেকেই মাল্টি-টেনান্ট ছিল, পরে বসানো হয়নি — যা শোনায় অহংকারের মতো, কিন্তু আসলে একটি স্বীকারোক্তি: পরে এটি বসানো বোধগম্যভাবে করা প্রায় অসম্ভব, আর যে চেষ্টা করেছে তার প্রত্যেকের কাছে একটি গল্প আছে।
পৃথকীকরণ বাস করে ডেটাবেজে। ছাব্বিশটি টেবিলের প্রতিটিই বহন করে তার অন্তর্ভুক্ত টেনান্ট, আর তা যাচাইকারী নীতিটি প্রতিটি পড়া ও প্রতিটি লেখায় চলে, সম্পূর্ণভাবে অ্যাপ্লিকেশনের নিচে। সীমানা ভুলে যাওয়া একটি কোয়েরি অন্য কারো গ্রাহক ফেরত দেয় না। তা কিছুই ফেরত দেয় না।
রো-লেভেল সিকিউরিটি, বাধ্যতামূলক
কোনো রীতি নয়, কোনো কোড রিভিউয়ের নিয়ম নয়। ডেটাবেজ অস্বীকার করে। দশ হাজার নয়, আটাত্তরটি নীতি, একে একে লেখা — কারণ জেনারেট করা নীতি এমন নীতি যা কেউ পড়েনি।
যৌগিক কী
একটি চাইল্ড রেকর্ড তার টেনান্ট এবং তার প্যারেন্ট — দুটোকেই একসাথে, জোড়া হিসেবে রেফারেন্স করে। ভুল প্রতিষ্ঠানের একটি বিচ্ছিন্ন আইডেন্টিফায়ার মীমাংসা হয় না — তা সহজভাবে একটি বৈধ রেফারেন্সই নয়।
কোনো ডিফল্ট টেনান্ট নেই, কখনোই না
স্কোপহীন একটি রিকোয়েস্ট নীরবে টেনান্ট জিরোর রিকোয়েস্টে পরিণত হয় না। তা ডেটাবেজে পৌঁছানোর আগেই এক্সসেপশন ছোড়ে। "আনস্কোপড" নামে কোনো মোড নেই যা বন্ধ করতে ভুলে যাওয়া যায়।
যে বাগ নিজের অস্তিত্ব ঘোষণা করতে পারত না
টেনেন্সির কাজ চলাকালীন বেশিরভাগ ভুলই ছিল জোরে। দুটি কোম্পানিকে একই গ্রাহক ডোমেইন দিন এবং ডেটাবেস অবজেক্ট সঙ্গে সঙ্গে দিন — একটি ত্রুটি কোড ও স্ট্যাক ট্রেস সহ; আপনি দুপুরের আগেই তা ঠিক করে ফেলবেন।
একটি আপত্তি করেনি। সম্পাদনাযোগ্য প্রম্পট ওভাররাইডের একটি টেবিল কেবল প্রম্পটের ধরন দিয়ে কী-কৃত ছিল — ধরন এবং টেনেন্ট দিয়ে নয়। দ্বিতীয় কোম্পানি তাদের নিজস্ব কপি সম্পাদনা করলে সম্পূর্ণ বৈধ SQL-এর মাধ্যমে নীরবে প্রথম কোম্পানির কপিটি মুছে যেত — কোনো ত্রুটি নেই, কোনো সতর্কতা নেই, কোনো ব্যর্থ টেস্ট নেই। এটি ধরা পড়েছিল একটি কী পরিবর্তনের পর অবশিষ্ট প্রতিটি ইউনিক ইনডেক্স একে একে পড়ে দেখার মাধ্যমে, এই সন্দেহে যে জোরে যেগুলো ছিল তাদের সঙ্গীও থাকতে পারে।
আমরা এটি উল্লেখ করছি কারণ এটিই এই কাজের সৎ রূপ। বিচ্ছেদ এমন কোনো ফিচার নয় যা আপনি চালু করেন; এটি স্কিমার নীরস অংশগুলো পড়ার অভ্যাস, এই ধারণায় যে তার ভেতরের কিছু একটি আপনার সঙ্গে দ্বিমত পোষণ করে।
টেস্টগুলো, রেকর্ডের জন্য: মোট ৯৪২টি, প্রতিটি পরিবর্তনে শূন্য থেকে পুনর্নির্মিত ডেটাবেসের বিরুদ্ধে চালানো হয়। এগুলো প্রমাণ করতে নেই যে ডিজাইনটি চতুর। এগুলো আছে কারণ এই নির্দিষ্ট ডিজাইনের ব্যর্থতার ধরনটি নীরব, আর নীরব ব্যর্থতার পক্ষে কাউকে চিৎকার করে সাড়া দিতে হয়।
একজন সাধারণ মানুষ বিচ্ছেদ থেকে কী পান
- একটি গ্রুপ একটি ইনস্টল থেকে বেশ কয়েকটি কোম্পানি চালাতে পারে, আর একটির বিক্রেতা অন্যটির গ্রাহক কখনো দেখবেন না — নীতির কারণে নয়, গঠনের কারণে।
- একটি পার্টনার প্রোগ্রাম, প্রম্পটের একটি সেট, একটি গ্রাহকের উপর দাবি: সবই প্রতি কোম্পানির সুযোগে সীমাবদ্ধ, তাই এক টেনেন্টের কনফিগারেশন সবার হয়ে যেতে পারে না।
- একটি তথ্যমুছে অনুরোধ একটি সীমানার ভেতরে পূরণ হয়, ভাগ করা স্তূপের উপর দিয়ে নয় — এটিই সৎভাবে উত্তর দেওয়া সম্ভব করে তোলে।
- আর কাউকে এর কিছুই মনে রাখতে হয় না। এটিই মূল কথা — মনে রাখার উপর নির্ভরশীল কোনো প্রতিশ্রুতি প্রতিশ্রুতিই নয়।
আরেকটি লাইন, যা ডেটাবেস সম্পর্কে নয়
পরিবারের প্রতিটি সিবলিং সার্ভিস নিজস্ব নামকৃত ক্রেডেনশিয়াল ধারণ করে। কোনো কিছুই ভাগ করা একটি দিয়ে কথা বলে না, তাই কোনো সার্ভিস ভুলবশত অন্যটির রূপে কাজ করতে পারে না — একটি ছোট শৃঙ্খলা, যা সরাসরি এসেছে একসময় ভাগ করা টোকেন থাকার অভিজ্ঞতা থেকে এবং তা উপভোগ না করা থেকে।
এটি ডেটাবেস নিয়মের মতোই একই অন্তর্দৃষ্টি। ভুল জিনিসটি নিরুৎসাহিত না করে অসম্ভব করে দিন, আর আপনি সজাগতার বদলে গ্রাহকদের উপর মনোযোগ দেবেন।
- 1২৬টি টেবিলপ্রতিটিতে তার টেনেন্ট রয়েছে, চেক বাধ্যতামূলকভাবে চালু।
- 2৭২টি পলিসিএকে একে লেখা, তাই প্রতিটি একজন মানুষ পড়েছেন।
- 3৯৪২টি টেস্টশূন্য থেকে পুনর্নির্মিত ডেটাবেসের বিরুদ্ধে, প্রতিটি পরিবর্তনে।
- 4০টি ডিফল্ট টেনেন্টসুযোগহীন কোনো অনুরোধ ডেটায় পৌঁছায় না।
লাইভ বিল্ডে পরিমাপকৃত

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