To support a continuous integration dashboard that is scalable, performant, and flexible, the VTS Dashboard backend must be carefully designed with a strong understanding of database functionality. Google Cloud Datastore হল একটি NoSQL ডেটাবেস যা ট্রানজ্যাকশনাল ACID গ্যারান্টি এবং এনটিটি গ্রুপের মধ্যে শক্তিশালী ধারাবাহিকতার পাশাপাশি চূড়ান্ত ধারাবাহিকতা প্রদান করে। তবে, এর স্ট্রাকচার SQL ডেটাবেস (এমনকি Cloud Bigtable)-এর থেকে অনেক আলাদা; টেবিল, সারি ও সেলের পরিবর্তে এখানে ধরন, এন্টিটি ও প্রপার্টি থাকে।
VTS ড্যাশবোর্ড ওয়েব পরিষেবার জন্য একটি কার্যকর ব্যাকএন্ড তৈরি করতে, নিম্নলিখিত বিভাগগুলি ডেটা স্ট্রাকচার এবং কোয়েরি করার প্যাটার্নের রূপরেখা দেয়।
এন্টিটি
নিম্নলিখিত এন্টিটি VTS টেস্ট রান থেকে সারসংক্ষেপ ও রিসোর্স স্টোর করে:
- টেস্ট এন্টিটি। নির্দিষ্ট পরীক্ষার টেস্ট রান সম্পর্কে মেটাডেটা স্টোর করে। এর কী হল পরীক্ষার নাম এবং এর প্রপার্টিতে ব্যর্থতার সংখ্যা, পাস করার সংখ্যা এবং অ্যালার্ট জব আপডেট করার সময় থেকে টেস্ট কেস ব্রেকেজের তালিকা অন্তর্ভুক্ত থাকে।
- টেস্ট রান এন্টিটি। নির্দিষ্ট পরীক্ষার রান থেকে পাওয়া মেটাডেটা থাকে। এতে অবশ্যই টেস্ট শুরু ও শেষ হওয়ার টাইমস্ট্যাম্প, টেস্ট বিল্ড আইডি, পাস ও ফেল করা টেস্ট কেসের সংখ্যা, রান করার ধরন (যেমন, প্রি-সাবমিট, পোস্ট-সাবমিট বা লোকাল), লগ লিঙ্কের তালিকা, হোস্ট মেশিনের নাম এবং কভারেজ সংক্রান্ত সারসংক্ষেপের সংখ্যা সেভ করতে হবে।
- ডিভাইস সংক্রান্ত তথ্য এন্টিটি। টেস্ট রান চলাকালীন ব্যবহার করা ডিভাইস সম্পর্কে বিবরণ থাকে। এর মধ্যে ডিভাইস বিল্ড আইডি, প্রোডাক্টের নাম, বিল্ড টার্গেট, ব্রাঞ্চ ও ABI সংক্রান্ত তথ্য অন্তর্ভুক্ত। এটি টেস্ট রান এন্টিটি থেকে আলাদাভাবে স্টোর করা হয় যাতে এক-থেকে-একাধিক ফ্যাশনে একাধিক ডিভাইসে টেস্ট রান করা যায়।
- প্রোফাইলিং পয়েন্ট রান এন্টিটি। টেস্ট রান চলাকালীন নির্দিষ্ট প্রোফাইলিং পয়েন্টের জন্য সংগ্রহ করা ডেটার সারসংক্ষেপ করে। এটি প্রোফাইলিং ডেটার অক্ষ লেবেল, প্রোফাইলিং পয়েন্টের নাম, ভ্যালু, ধরন ও রিগ্রেশন মোড বর্ণনা করে।
- কভারেজ এন্টিটি। একটি ফাইলের জন্য সংগ্রহ করা কভারেজ ডেটা বর্ণনা করে। এতে Git প্রোজেক্টের তথ্য, ফাইল পাথ এবং সোর্স ফাইলের প্রতিটি লাইন পিছু কভারেজ সংখ্যার তালিকা থাকে।
- টেস্ট কেস রান এন্টিটি। টেস্ট কেসের নাম ও ফলাফল সহ টেস্ট রান থেকে পাওয়া কোনও নির্দিষ্ট টেস্ট কেসের ফলাফল বর্ণনা করে।
- ব্যবহারকারীর পছন্দের এন্টিটি। প্রতিটি ব্যবহারকারীর সাবস্ক্রিপশনকে টেস্ট ও App Engine ব্যবহারকারী পরিষেবা থেকে জেনারেট করা ব্যবহারকারীর আইডি সহ একটি এন্টিটি হিসেবে দেখানো যেতে পারে। এটি দক্ষ দ্বি-দিকনির্দেশক কোয়েরি করার অনুমতি দেয় (যেমন, কোনও টেস্টে সাবস্ক্রাইব করা সমস্ত ব্যবহারকারীর জন্য এবং কোনও ব্যবহারকারীর পছন্দের সমস্ত টেস্টের জন্য)।
এন্টিটি গ্রুপিং
প্রতিটি টেস্ট মডিউল একটি এন্টিটি গ্রুপের রুটকে দেখায়। টেস্ট রান এন্টিটি এই গ্রুপের চাইল্ড এবং ডিভাইস এন্টিটি, প্রোফাইলিং পয়েন্ট এন্টিটি এবং সংশ্লিষ্ট টেস্ট ও টেস্ট রান এনসেস্টারের সাথে প্রাসঙ্গিক কভারেজ এন্টিটির পেরেন্ট।
গুরুত্বপূর্ণ: পূর্বপুরুষদের সম্পর্ক ডিজাইন করার সময়, আপনাকে অবশ্যই কার্যকর ও সামঞ্জস্যপূর্ণ কোয়েরি করার মেকানিজম প্রদান করার প্রয়োজনীয়তা এবং ডেটাবেস দ্বারা আরোপিত সীমাবদ্ধতার মধ্যে ভারসাম্য বজায় রাখতে হবে।
সুবিধা
কনসিস্টেন্সি সংক্রান্ত প্রয়োজনীয়তা এটি নিশ্চিত করে যে ভবিষ্যতের অপারেশন কোনও ট্রানজ্যাকশনের প্রভাব দেখতে পাবে না যতক্ষণ না এটি কমিট করা হয় এবং অতীতের ট্রানজ্যাকশন বর্তমান অপারেশনের ক্ষেত্রে দৃশ্যমান হয়। Cloud Datastore-এ, এন্টিটি গ্রুপিং, গ্রুপের মধ্যে রিড ও রাইট কনসিস্টেন্সির আইল্যান্ড তৈরি করে, যা এই ক্ষেত্রে হল টেস্ট মডিউল সম্পর্কিত সমস্ত টেস্ট রান ও ডেটা। এর ফলে নিম্নলিখিত সুবিধাগুলি পাওয়া যায়:
- অ্যালার্ট জব দ্বারা টেস্ট মডিউল স্টেট রিড ও আপডেট করাকে অ্যাটমিক হিসেবে বিবেচনা করা যেতে পারে
- টেস্ট মডিউলের মধ্যে টেস্ট কেসের ফলাফলের গ্যারান্টিযুক্ত সামঞ্জস্যপূর্ণ ভিউ
- বংশলতিকার মধ্যে আরও দ্রুত কোয়েরি করা
সীমাবদ্ধতা
এক সেকেন্ডে একটি এন্টিটির চেয়ে বেশি দ্রুত হারে এন্টিটি গ্রুপে লেখা হলে তা সঠিক নয়, কারণ কিছু লেখা বাতিল করা হতে পারে। অ্যালার্ট জব ও আপলোড করার হার যদি প্রতি সেকেন্ডে একটি লেখার চেয়ে বেশি না হয়, তাহলে স্ট্রাকচারটি মজবুত হয় এবং শক্তিশালী ধারাবাহিকতা নিশ্চিত করে।
পরিশেষে, প্রতি সেকেন্ডে প্রতি টেস্ট মডিউলে একটি করে লেখার সীমা যুক্তিসঙ্গত কারণ VTS ফ্রেমওয়ার্কের ওভারহেড সহ টেস্ট রান সাধারণত কমপক্ষে এক মিনিট সময় নেয় ; যদি না কোনও টেস্ট ৬০টির বেশি আলাদা আলাদা হোস্টের উপর একই সাথে ক্রমাগত এক্সিকিউট করা হয়, তাহলে লেখার ক্ষেত্রে কোনও বাধা সৃষ্টি হতে পারে না। এটি আরও বেশি অসম্ভব হয়ে ওঠে কারণ প্রতিটি মডিউল হল একটি টেস্ট প্ল্যানের অংশ যা সম্পূর্ণ করতে প্রায়শই এক ঘণ্টার বেশি সময় লাগে। হোস্ট একই সময়ে টেস্ট চালালে, একই হোস্টে অল্প সময়ের জন্য রাইট করার ফলে (যেমন, রাইট করার সময় হওয়া সমস্যা ধরা এবং আবার চেষ্টা করা) হওয়া অসঙ্গতি সহজেই ম্যানেজ করা যায়।
স্কেলিং সংক্রান্ত বিবেচনা
টেস্ট রানকে যে তার প্যারেন্ট হিসেবে টেস্ট থাকতে হবে তা নয় (যেমন, এটি অন্য কোনও কী নিতে পারে এবং প্রপার্টি হিসেবে টেস্টের নাম, টেস্ট শুরু হওয়ার সময় থাকতে পারে); তবে, এর ফলে ইভেনচুয়াল কনসিস্টেন্সির জন্য স্ট্রং কনসিস্টেন্সি এক্সচেঞ্জ করা হবে। যেমন, অ্যালার্ট জব হয়ত টেস্ট মডিউলের মধ্যে সবচেয়ে সাম্প্রতিক টেস্ট রানের পারস্পরিক সামঞ্জস্যপূর্ণ স্ন্যাপশট দেখতে পাবে না, যার অর্থ হল গ্লোবাল স্টেট হয়ত টেস্ট রানের ক্রমের সম্পূর্ণ সঠিক চিত্র তুলে ধরতে পারবে না। এটি একটি টেস্ট মডিউলের মধ্যে টেস্ট রানের ডিসপ্লেকেও প্রভাবিত করতে পারে, যা রান সিকোয়েন্সের একটি সামঞ্জস্যপূর্ণ স্ন্যাপশট নাও হতে পারে। অবশেষে স্ন্যাপশট সামঞ্জস্যপূর্ণ হবে, কিন্তু সবচেয়ে ফ্রেশ ডেটা যে থাকবেই তার কোনও গ্যারান্টি নেই।
টেস্ট কেস
আরেকটি সম্ভাব্য বাধা হল অনেক টেস্ট কেস সহ বড় পরীক্ষা। দুটি অপারেটিভ সীমাবদ্ধতা হল, কোনও এন্টিটি গ্রুপের মধ্যে সর্বাধিক রাইট থ্রুপুট এক সেকেন্ডে একটি, সাথে সর্বাধিক ট্রানজ্যাকশন সাইজ ৫০০টি এন্টিটি।
একটি উপায় হল এমন একটি টেস্ট কেস নির্দিষ্ট করা যার পূর্বপুরুষ হিসেবে টেস্ট রান আছে (কভারেজ ডেটা, প্রোফাইলিং ডেটা ও ডিভাইসের তথ্য যেভাবে সেভ করা হয়, এটিও সেইভাবে সেভ করা হয়):
এই পদ্ধতিতে অ্যাটমিসিটি ও কনসিস্টেন্সি পাওয়া গেলেও, এটি পরীক্ষার উপর কঠোর বিধিনিষেধ আরোপ করে: কোনও ট্রানজ্যাকশন যদি ৫০০টি এন্টিটির মধ্যে সীমাবদ্ধ থাকে, তাহলে কোনও পরীক্ষায় ৪৯৮টির বেশি টেস্ট কেস থাকতে পারে না (কোনও কভারেজ বা প্রোফাইলিং ডেটা নেই বলে ধরে নেওয়া হয়েছে)। কোনও পরীক্ষা এর থেকে বেশি সময় নিলে, একটি ট্রানজ্যাকশন পরীক্ষার সব ফলাফল একসাথে লিখতে পারবে না এবং পরীক্ষার কেসগুলিকে আলাদা আলাদা ট্রানজ্যাকশনে ভাগ করলে, প্রতি সেকেন্ডে একটি করে ইটারেশন করার ক্ষেত্রে সর্বাধিক এন্টিটি গ্রুপ রাইট থ্রুপুট অতিক্রম করে যেতে পারে। এই সমাধানটি পারফর্ম্যান্সের সাথে আপস না করে ভালভাবে স্কেল করা যাবে না, তাই এটি সাজেস্ট করা হয় না।
তবে, টেস্ট রান চাইল্ড হিসেবে টেস্ট কেস ফলাফল সেভ করার পরিবর্তে, টেস্ট কেস আলাদাভাবে সেভ করা যেতে পারে এবং টেস্ট রানকে সেগুলির কী প্রদান করা যেতে পারে (টেস্ট রান তার টেস্ট কেস এন্টিটির শনাক্তকারীর একটি তালিকা থাকে):
প্রথম নজরে, এটি শক্তিশালী ধারাবাহিকতা সংক্রান্ত গ্যারান্টি ভেঙেছে বলে মনে হতে পারে। তবে, ক্লায়েন্টের কাছে টেস্ট রান এন্টিটি এবং টেস্ট কেস শনাক্তকারীর তালিকা থাকলে, কোয়েরি তৈরি করার প্রয়োজন হয় না; এর পরিবর্তে এটি সরাসরি শনাক্তকারীর মাধ্যমে টেস্ট কেস পেতে পারে, যা সবসময় সামঞ্জস্যপূর্ণ হওয়ার ব্যাপারে গ্যারান্টি দেওয়া হয়। এই পদ্ধতিটি টেস্ট রান করতে পারে এমন টেস্ট কেসের সংখ্যার উপর সীমাবদ্ধতা ব্যাপকভাবে কমিয়ে দেয়, একই সাথে এন্টিটি গ্রুপের মধ্যে অতিরিক্ত লেখার ঝুঁকি ছাড়াই শক্তিশালী ধারাবাহিকতা অর্জন করে।
ডেটা অ্যাক্সেস প্যাটার্ন
VTS ড্যাশবোর্ড নিম্নলিখিত ডেটা অ্যাক্সেস প্যাটার্ন ব্যবহার করে:
- ব্যবহারকারীর পছন্দ। নির্দিষ্ট App Engine ব্যবহারকারী অবজেক্টকে প্রপার্টি হিসেবে ব্যবহার করে, ব্যবহারকারীর পছন্দের এন্টিটিতে ইকুয়ালিটি ফিল্টার ব্যবহার করে কোয়েরি করা যেতে পারে।
- টেস্ট লিস্টিং। টেস্ট এন্টিটির সহজ কোয়েরি। হোম পেজ রেন্ডার করার জন্য ব্যান্ডউইথ কমাতে, পাস ও ফেল করা সংখ্যার উপর একটি প্রজেকশন ব্যবহার করা যেতে পারে, যাতে সম্ভাব্য দীর্ঘ ফেল করা টেস্ট কেস আইডি এবং অ্যালার্টিং জব দ্বারা ব্যবহৃত অন্যান্য মেটাডেটা বাদ দেওয়া যায়।
- টেস্ট রান। টেস্ট রান এন্টিটি কোয়েরি করার জন্য কী (টাইমস্ট্যাম্প) অনুসারে সর্ট এবং টেস্ট রান প্রপার্টিতে সম্ভাব্য ফিল্টারিং যেমন বিল্ড আইডি, পাসিং কাউন্ট ইত্যাদি প্রয়োজন। টেস্ট এন্টিটি কী সহ পূর্বপুরুষ কোয়েরি পারফর্ম করার মাধ্যমে, রিড অত্যন্ত সামঞ্জস্যপূর্ণ হয়। এই পর্যায়ে, টেস্ট রান প্রপার্টিতে স্টোর করা আইডি-র তালিকা ব্যবহার করে সব টেস্ট কেস ফলাফল ফিরিয়ে আনা যাবে; এছাড়াও, datastore get অপারেশনের প্রকৃতির কারণে এটি একটি অত্যন্ত সামঞ্জস্যপূর্ণ ফলাফল হবে বলে গ্যারেন্টি দেওয়া হয়।
- প্রোফাইলিং ও কভারেজ ডেটা। কোনও টেস্টের সাথে যুক্ত প্রোফাইলিং বা কভারেজ ডেটা কোয়েরি করার সময় অন্য কোনও টেস্ট রান ডেটা (যেমন, অন্যান্য প্রোফাইলিং/কভারেজ ডেটা, টেস্ট কেস ডেটা, ইত্যাদি) নাও পেতে পারেন। টেস্ট টেস্ট এবং টেস্ট রান এন্টিটি কী ব্যবহার করে একটি পূর্বপুরুষ কোয়েরি টেস্ট রান চলাকালীন রেকর্ড করা সমস্ত প্রোফাইলিং পয়েন্ট পুনরুদ্ধার করবে; এছাড়াও প্রোফাইলিং পয়েন্টের নাম বা ফাইলের নাম ফিল্টার করে, একটি একক প্রোফাইলিং বা কভারেজ এন্টিটি পুনরুদ্ধার করা যেতে পারে। পূর্বপুরুষ কোয়েরির প্রকৃতি অনুযায়ী, এই অপারেশনটি অত্যন্ত সামঞ্জস্যপূর্ণ।
UI সম্পর্কে বিশদে জানতে এবং এইসব ডেটা প্যাটার্নের অ্যাকশনের স্ক্রিনশট দেখতে, VTS ড্যাশবোর্ড UI দেখুন।