কম্পিউটার

সাবডোমেনগুলির সাথে রেল অ্যাপে একটি মাল্টি-টেন্যান্ট রুবি তৈরি করা

মাল্টিটেন্যান্সির একটি সংজ্ঞা অনুসারে, যখন একটি অ্যাপ একাধিক ভাড়াটেদের পরিষেবা দেয়, তখন এর অর্থ হল কয়েকটি ব্যবহারকারীর গোষ্ঠী রয়েছে যারা সফ্টওয়্যার উদাহরণে সাধারণ অ্যাক্সেস শেয়ার করে। মাল্টিটেন্যান্সি সমর্থন করে এমন একটি অ্যাপের একটি চমৎকার উদাহরণ হল জিরা প্ল্যাটফর্ম, যেখানে প্রতিটি কোম্পানির সফ্টওয়্যার অ্যাক্সেস করার জন্য তার সাবডোমেন রয়েছে, উদাহরণস্বরূপ, mycompany.atlassian.net .

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

এই নিবন্ধটি পড়ার পরে, আপনি সক্ষম হবেন:

  • বিভিন্ন ধরনের মাল্টি-টেন্যান্ট অ্যাপ নিয়ে আলোচনা করুন এবং বলুন কখন প্রদত্ত পদ্ধতিটি সঠিক পছন্দ,
  • একাধিক ভাড়াটেদের সমর্থন সহ একটি রুবি অন রেল অ্যাপ্লিকেশন তৈরি করুন এবং
  • রুবি অন রেল অ্যাপ্লিকেশনের মধ্যে আপনার গ্রাহকদের জন্য কাস্টম সাবডোমেন ব্যবহার করুন৷

এই নিবন্ধটি অনুসরণ করতে এবং এর বেশিরভাগ সুবিধা পেতে রেল সম্পর্কে একটি প্রাথমিক জ্ঞান প্রয়োজন।

তত্ত্বে বহুত্ব

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

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

ডেটাবেস-সারি স্তর

আপনি যদি আপনার অ্যাপ্লিকেশনে একাধিক ডাটাবেস ব্যবহার করতে না চান, আপনি একটি কেন্দ্রীয় ডাটাবেসে কাজ করে এমন একটি পদ্ধতি নির্বাচন করতে পারেন। ডাটাবেসের প্রতিটি টেবিলে tenant_id থাকে প্রদত্ত টেন্যান্টের অন্তর্গত ডেটা টানতে অ্যাপ্লিকেশনের ভিতরে সম্পাদিত প্রতিটি প্রশ্নের কলাম ব্যবহার করা হয়।

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

স্কিমা স্তর

আপনার কাছে এখনও একটি কেন্দ্রীয় ডাটাবেস থাকতে পারে তবে প্রতিটি ভাড়াটেদের জন্য আলাদা টেবিল এবং স্কিমা সহ। ডাটাবেস-সারি স্তরের পদ্ধতির বিপরীতে, কোয়েরি সংশোধন করার পরিবর্তে ভাড়াটেদের মধ্যে স্যুইচ করার সময় আপনাকে টেবিলে অনুসন্ধানের পথ পরিবর্তন করতে হবে। PostgreSQL-এ, আপনি search_path সেটটি ব্যবহার করতে পারেন বিবৃতি, এবং MySQL এ ব্যবহার করুন স্কিমাগুলির মধ্যে পরিবর্তন করার জন্য বিবৃতি৷

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

ডাটাবেস স্তর

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

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

একটি অ্যাপ্লিকেশন কঙ্কাল তৈরি করা

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

এই নিবন্ধটি লেখার সময় রুবির সর্বশেষ সংস্করণ হল Ruby on Rails gem এর 2.7.2 এবং 6.1 RC1। নিশ্চিত করুন যে আপনার সিস্টেমে রুবির সঠিক সংস্করণ ইনস্টল করা আছে এবং ফ্রেমওয়ার্কের সঠিক সংস্করণ ইনস্টল করার চেষ্টা করুন:

gem install rails -v 6.1.0.rc1

আমরা এখন নিম্নলিখিত কমান্ড দিয়ে প্রকল্প ফাইল তৈরি করতে পারি:

rails _6.1.0.rc1_ new tenantapp -d=mysql

প্রজেক্ট ডিরেক্টরি লিখুন, সার্ভার চালান, এবং আপনি স্বাগত স্ক্রীন দেখতে পাচ্ছেন কিনা তা পরীক্ষা করুন যাতে আমরা চালিয়ে যেতে পারি:

cd tenantapp/
rails s

এক ডাটাবেসের সাথে মাল্টি-টেন্যান্ট রেল অ্যাপ্লিকেশন

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

পরিকল্পনাটি নিম্নরূপ:

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

পরীক্ষার ডেটা প্রস্তুত করা হচ্ছে

ধরা যাক আমরা একটি ব্লগ প্ল্যাটফর্ম তৈরি করছি যেখানে ব্যবহারকারীরা একাধিক লেখকের প্রকাশিত নিবন্ধগুলি দেখতে পারেন৷

আমি প্রথমে লেখক মডেল তৈরি করব, যা লেখকের ডেটা সংরক্ষণ করবে:

rails g scaffold author slug:string name:string description:string
rake db:create
rake db:migrate

আপনি এখন https://localhost:3000/authors ঠিকানায় যেতে পারেন এবং কিছু লেখক যোগ করতে পারেন যাতে আমরা পরে তাদের নিবন্ধগুলিতে বরাদ্দ করতে পারি।

পরবর্তী ধাপ হল নিবন্ধ তৈরি করা:

rails g scaffold article title:string content:text
rake db:migrate

মাল্টিটেন্যান্সি সহায়তা যোগ করা হচ্ছে

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

ডাটাবেসে সঠিক মাইগ্রেশন তৈরি করুন

rails g migration AddTenantIdToArticle tenant_id:integer
rake db:migrate

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

ভাড়াটেকে নিবন্ধ বরাদ্দ করুন

এই ধাপে, আমি কোডটি আপডেট করতে যাচ্ছি যাতে আমরা প্রদত্ত লেখককে নিবন্ধে বরাদ্দ করতে পারি এবং পরে শুধুমাত্র নির্বাচিত লেখকের জন্য নিবন্ধগুলি রেন্ডার করতে পারি। app/controllers/articles_controller.rb খুলুন এবং নিম্নলিখিত পরিবর্তনগুলি যোগ করুন:

class ArticlesController < ApplicationController
 before_action :set_article, only: [:show, :edit, :update, :destroy]
 before_action :set_authors, only: [:edit, :update, :new, :create]
 
 # ...
 
 private
   # Only allow a list of trusted parameters through.
   def article_params
     params.require(:article).permit(:title, :content, :tenant_id)
   end
 
   def set_authors
     @authors = Author.all
   end
end

আমাদের দৃষ্টিতে আমরা এখন @authors ব্যবহার করতে পারি পরিবর্তনশীল যা আমাদের অ্যাপে যোগ করা লেখকদের সংগ্রহ ধারণ করে। আমরা এখন নির্বাচিত ক্ষেত্র যোগ করতে পারি যাতে লেখকদের নাম থাকবে এবং একটি সঠিক tenant_id বরাদ্দ করা যাবে। . app/views/articles/_form.html.erb খুলুন এবং নিম্নলিখিত বিভাগ যোগ করুন:

<div className="field">
 <%= form.label :author %>
 <%= form.select :tenant_id, options_from_collection_for_select(@authors, 'id', 'name', article.tenant_id), include_blank: true %>
</div>

এগিয়ে যান এবং কিছু লেখক তৈরি করুন এবং তারপরে কিছু নিবন্ধ তৈরি করুন যাতে নিবন্ধগুলি শুধুমাত্র প্রদত্ত লেখকের জন্য নির্ধারিত হয়৷

কাস্টম সাবডোমেনের জন্য সমর্থন যোগ করা হচ্ছে

আমরা জন ডো নাম দিয়ে লেখক তৈরি করেছি এবং স্লাগ মান johndoe সেট করেছি . আমাদের লক্ষ্য হল https://johndoe.localhost:3000/ ঠিকানায় যাওয়া এবং এই ক্ষেত্রে শুধুমাত্র প্রদত্ত ভাড়াটে জন ডো-এর সাথে সম্পর্কিত ডেটা দেখা।

সাবডোমেন কনফিগারেশন

ভাড়াটিয়া সেট করা হলে আমরা নিবন্ধগুলি পরিচালনা করতে এবং পরিদর্শন করতে চাই। আমরা config/routes.rb আপডেট করে এটি অর্জন করতে পারি ফাইল এবং সীমাবদ্ধতা ব্লকে নিবন্ধ সম্পদের সংজ্ঞা মোড়ানো:

Rails.application.routes.draw do
 constraints subdomain: /.*/ do
   resources :articles
 end
 
 resources :authors
end

ডিফল্টরূপে, রেলগুলি শীর্ষ-স্তরের ডোমেনের দৈর্ঘ্য 1 এ সেট করে, কিন্তু আমরা এই সেটিংটি 0 এ সেট করতে স্থানীয় হোস্ট ব্যবহার করতে চাই। আমরা config/environments/development.rb<ফাইলে নিম্নলিখিত লাইনটি যোগ করে এটি করতে পারি। /কোড> :

config.action_dispatch.tld_length = 0

সাবডোমেন তৈরি করা মাল্টিটেনেন্সির সাথে কাজ করে

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

 
class ArticlesController < ApplicationController
 before_action :set_author
 before_action :set_article, only: [:show, :edit, :update, :destroy]
 
 # GET /articles
 # GET /articles.json
 def index
   @articles = Article.where(tenant_id: @author.id)
 end
 
 # ...
 
 private
   def set_article
     @article = Article.find_by!(id: params[:id], tenant_id: @author.id)
   end
 
   # ...
 
   def set_author
     @author = Author.find_by!(slug: request.subdomain)
   end
end

আমি কন্ট্রোলারে কিছু পরিবর্তন করেছি:

  • set_authors এর পরিবর্তে পদ্ধতি, আমি set_author সংজ্ঞায়িত করেছি পদ্ধতি, যা লেখক সাবডোমেনের মাধ্যমে অনুরোধ করা সেট করে। এই পদ্ধতিটিকে before_filter-এ কল করা অত্যন্ত গুরুত্বপূর্ণ set_article এর আগে বলা হয়. আমরা নিবন্ধটি সেট করার চেষ্টা করার আগে লেখককে নিয়োগ করতে হবে।
  • আমি set_article আপডেট করেছি প্রদত্ত আইডি এবং নির্ধারিত লেখকের সাথে নিবন্ধটি সন্ধান করার পদ্ধতি। আমাদের বর্তমান ভাড়াটে জন থাকাকালীন আমরা টমের তৈরি নিবন্ধগুলি রেন্ডার করতে চাই না৷
  • আমাদের বর্তমান ভাড়াটেকে বরাদ্দ করা নিবন্ধগুলি নির্বাচন করার জন্য আমি সূচী ক্রিয়া আপডেট করেছি৷

আপনি যখন একটি মাল্টিটেন্যান্ট অ্যাপে কাজ করেন এবং একটি স্কিমা সহ একটি ডাটাবেস ব্যবহার করেন, তখন আপনাকে সবসময় মনে রাখতে হবে যে কোনো প্রশ্ন tenant_id এর মাধ্যমে করতে হবে কলাম; অন্যথায়, আপনি এমন ডেটা প্রদান করবেন যা অনুরোধ করা ভাড়াটেকে বরাদ্দ করা হয়নি।

কন্ট্রোলার আপডেট করা হয়েছে, তাই পরবর্তী ধাপ হল ফর্ম ভিউ আপডেট করা। app/views/articles/_form.html.erb খুলুন ফাইল করুন এবং সাধারণ লুকানো ক্ষেত্র দিয়ে পূর্ববর্তী বিভাগটি প্রতিস্থাপন করুন:

<%= form.hidden_field :tenant_id, value: @author.id %>

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

আপনি এখন আমাদের তৈরি কোড পরীক্ষা করতে পারেন. একটি নতুন লেখক তৈরি করুন, উদাহরণস্বরূপ, জন ডো এবং স্লগ johndoe নামে . https://johndoe.localhost:3000/articles/new ঠিকানা দেখুন এবং একটি নতুন নিবন্ধ যোগ করুন। একটি নতুন নিবন্ধ যোগ করার পরে, আপনি এটিকে https://johndoe.localhost:3000/articles-এর অধীনে উপলব্ধ তালিকায় দেখতে পারেন৷

অভিনন্দন! আপনি এইমাত্র একটি মাল্টি-টেন্যান্ট অ্যাপ তৈরি করেছেন যেখানে প্রতিটি লেখকের সাবডোমেন রয়েছে৷

আরো উন্নতি

আপনি এখন নতুন বৈশিষ্ট্য যোগ করে অ্যাপ্লিকেশনের কোড প্রসারিত করতে পারেন। আমাদের ব্লগ প্ল্যাটফর্ম সোজা; সম্ভবত এটি কিছু মন্তব্য বিভাগ যোগ করার সময়? আপনি যে কার্যকারিতা যোগ করুন না কেন, আপনাকে অবশ্যই tenant_id যোগ করার কথা মনে রাখতে হবে নতুন মডেলে কলাম করুন এবং সম্পদ অনুসন্ধান করার সময় এটি ব্যবহার করুন।

আপনি একটি বিশেষ সুযোগ তৈরি করতে পারেন এবং এটি উদ্বেগের মধ্যে মোড়ানো করতে পারেন:

module Tenantable
 extend ActiveSupport::Concern
 
 included do
   scope :for_author, -> (author) { where(tenant_id: author.id) }
 end
end

এবং তারপরে ভাড়াটেদের জন্য ডেটা রয়েছে এমন প্রতিটি মডেলে এটি ব্যবহার করুন:

class Article < ApplicationRecord
 include Tenantable
end
 
author = Author.find(1)
Article.for_author(author)

উপরের পদ্ধতির সাহায্যে, tenant_id-এর নাম পরিবর্তন করার ক্ষেত্রে আপনাকে শুধুমাত্র একটি জায়গা আপডেট করতে হবে ভাড়াটে-সম্পর্কিত ডেটা জিজ্ঞাসা করার ক্ষেত্রে কলাম বা আরও শর্ত প্রবর্তন করা।

একাধিক ডেটাবেস সহ মাল্টি-টেন্যান্ট রেল অ্যাপ্লিকেশন

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

ভাল খবর হল রুবি অন রেল ফ্রেমওয়ার্কের নতুন সংস্করণে একাধিক ডাটাবেস পরিচালনার জন্য অন্তর্নির্মিত সমর্থন রয়েছে। আমি এটি অন্বেষণ করব এবং আপনাকে দেখাব কিভাবে আপনি অসংখ্য ডাটাবেস এবং কাস্টম সাবডোমেন সহ একটি মাল্টি-টেন্যান্ট রেল অ্যাপ্লিকেশন তৈরি করতে এটি ব্যবহার করতে পারেন৷

পরিকল্পনাটি নিম্নরূপ:

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

পরীক্ষার ডেটা প্রস্তুত করা হচ্ছে

ধরা যাক আমরা একটি ব্লগ প্ল্যাটফর্ম তৈরি করছি যেখানে ব্যবহারকারীরা একাধিক লেখকের প্রকাশিত নিবন্ধগুলি দেখতে পারেন। প্রতিটি লেখকের একটি ডেডিকেটেড ডাটাবেস থাকবে৷

লেখক তৈরি করে শুরু করুন স্ক্যাফোল্ড বৈশিষ্ট্য সহ মডেল যা আমাদের দেখতে এবং নতুন লেখক তৈরি করতে সাহায্য করবে:

rails g scaffold author slug:string name:string description:string
rake db:create
rake db:migrate

আপনি এখন https://localhost:3000/authors পরিদর্শন করতে পারেন এবং রেলগুলি আমাদের জন্য কী তৈরি করেছে তা দেখতে পারেন৷

একজন নতুন লেখক যোগ করা হচ্ছে

আমি জন ডো এবং স্লগ johndoe নামে একজন নতুন লেখক তৈরি করেছি . সাবডোমেন ব্যবহার করে কোন লেখককে আমাদের তথ্য প্রদর্শন করা উচিত তা সনাক্ত করতে পরে স্লাগ মান ব্যবহার করা হবে।

কারণ প্রতিটি লেখকের একটি পৃথক ডাটাবেস থাকবে, আমাদের জন এর জন্য ম্যানুয়ালি নতুন ডাটাবেস যোগ করতে হবে। config/database.yml খুলুন এবং নিম্নলিখিত পরিবর্তনগুলি যোগ করুন:

development:
 primary:
   <<: *default
   database: tenantapp_development
 primary_johndoe:
   <<: *default
   database: tenantapp_johndoe_development
   migrations_paths: db/tenants_migrations

আমরা মাইগ্রেশনের জন্য একটি পৃথক ডিরেক্টরি ব্যবহার করতে যাচ্ছি যা আমাদের ভাড়াটেদের দ্বারা ব্যবহৃত হয়। আমাদের কেন্দ্রীয় ডাটাবেসে তাদের প্রয়োজন নেই। আপনি এখন ডিফল্ট কমান্ড ব্যবহার করে জন এর জন্য একটি ডাটাবেস তৈরি করতে পারেন:

rake db:create

নিবন্ধ যোগ করা হচ্ছে

আমরা এখন আর্টিকেল ভাঁজ করতে পারি নিয়ামক এবং ভিউ সহ মডেল:

rails g scaffold article title:string content:text
rake db:migrate

আমি --ডেটাবেস পাস করেছি রেলগুলিকে জানাতে প্যারাম যে মাইগ্রেশন ডিফল্ট db/migrations এ রাখা উচিত নয় প্রাথমিক ডাটাবেস দ্বারা ব্যবহৃত ডিরেক্টরি। আমরা এখন মাইগ্রেট কমান্ড চালাতে পারি:

rake db:migrate

এই মুহূর্তে, আমাদের দুটি স্কিমা আছে:db/schema.rb এবং db/primary_johndoe_schema.rb . আপনি যদি ভাড়াটেদের জন্য বিভিন্ন টেবিল তৈরি করতে চান, তাহলে আপনি একটি অনন্য migrations_path সেট করে এটি অর্জন করতে পারেন config/database.yml-এ মান প্রদত্ত ভাড়াটে জন্য ফাইল. এই নিবন্ধে, আমরা সকল ভাড়াটেদের জন্য একই টেবিল রাখতে চাই, তাই মাইগ্রেশনের পথ একই হবে।

মাল্টি-টেনেন্সি সহায়তা যোগ করা হচ্ছে

যে অ্যাপ্লিকেশানে মাল্টি-টেন্যান্সি একটি ডাটাবেস দ্বারা সমর্থিত, প্রদত্ত টেন্যান্টের জন্য ডেটা পেতে, আমাদের শুধুমাত্র সঠিক tenant_id দিয়ে ডেটাবেসে ক্যোয়ারী আপডেট করতে হবে। মান আমাদের ক্ষেত্রে, প্রতিটি ভাড়াটে তাদের ডাটাবেস আছে, তাই আমাদের ডাটাবেসের মধ্যে পরিবর্তন করতে হবে।

Rails 6.1 অনুভূমিক শার্ডিংয়ের জন্য অন্তর্নির্মিত সমর্থন সহ আসে। Shard হল একটি অনুভূমিক ডেটা পার্টিশন যাতে মোট ডেটাসেটের একটি উপসেট থাকে। আমরা একটি ডাটাবেসের মধ্যে একটি টেবিলে সমস্ত লেখকের নিবন্ধগুলি সংরক্ষণ করতে পারি, তবে শার্ডিংয়ের জন্য ধন্যবাদ, আমরা একই কাঠামোর সাথে একাধিক টেবিলে ডেটা বিভক্ত করতে পারি তবে আলাদা ডেটাবেসে স্থাপন করতে পারি৷

আসুন সকল মডেলের জন্য প্যারেন্ট ক্লাসে আমাদের শার্ডগুলি সংজ্ঞায়িত করি। সেগুলি app/models/application_record.rb এর অধীনে সংরক্ষণ করা হয় :

ActiveRecord::Base.connected_to(role: :reading, shard: :johndoe) do
  Article.all # get all articles created by John
end

আমাদের কলটি সংযুক্ত_টু-এ মোড়ানো ছাড়াই ব্লক, ডিফল্ট শার্ড ব্যবহার করা হবে। আমরা এগিয়ে যাওয়ার আগে, আমাদের আরও একটি পরিবর্তন প্রবর্তন করতে হবে। যেহেতু সমস্ত শার্ড একই ডেটা স্ট্রাকচার শেয়ার করে, তাই আমরা app/models/primary_johndoe_record.rb মুছে ফেলতে পারি মডেল স্বয়ংক্রিয়ভাবে তৈরি যখন আমরা নিবন্ধ ভারা ছিল.

এছাড়াও আমাদের app/models/article.rb সম্পাদনা করতে হবে মডেল করুন এবং PrimaryJohndoeRecord থেকে প্যারেন্ট ক্লাস পরিবর্তন করুন ApplicationRecord এ :

class Article < ApplicationRecord
end

আরো ভাড়াটে যোগ করা হচ্ছে

বর্তমানে, আমাদের ডাটাবেসে শুধুমাত্র একজন লেখক আছে। আমাদের ভাড়াটেদের (ডাটাবেস) মধ্যে পরিবর্তনের কার্যকারিতা পরীক্ষা করার জন্য, আমাদের আরও একজন লেখক যোগ করতে হবে। https://localhost:3000/authors/new ঠিকানা খুলুন এবং একটি নতুন লেখক যোগ করুন। আমি লেখককে টিম ডো এবং স্লগ timdoe নামের সাথে যুক্ত করেছি .

আমাদের কাছে নতুন লেখকের জন্য একটি রেকর্ড আছে, তাই আমাদের একটি নতুন ডাটাবেস সংজ্ঞায়িত করতে হবে:

development:
 primary:
   <<: *default
   database: tenantapp_development
 primary_johndoe:
   <<: *default
   database: tenantapp_johndoe_development
   migrations_paths: db/tenants_migrations
 primary_timdoe:
   <<: *default
   database: tenantapp_timdoe_development
   migrations_paths: db/tenants_migrations

এখন একটি নতুন ডাটাবেস তৈরি করুন এবং মাইগ্রেশন চালান:

rake db:create
rake db:migrate

শেষ ধাপ হল ApplicationRecord আপডেট করা মডেল এবং একটি নতুন শার্ড সংজ্ঞায়িত করুন:

class ApplicationRecord < ActiveRecord::Base
 self.abstract_class = true
 
 connects_to shards: {
   default: { writing: :primary, reading: :primary },
   johndoe: { writing: :primary_johndoe, reading: :primary_johndoe },
   timdoe: { writing: :primary_timdoe, reading: :primary_timdoe },
 }
end

আপনি এখন প্রতিটি লেখকের জন্য নিবন্ধ তৈরি করতে পারেন:

ActiveRecord::Base.connected_to(role: :writing, shard: :johndoe) do
  Article.create!(title: 'Article from John', content: 'content')
end
 
ActiveRecord::Base.connected_to(role: :writing, shard: :timdoe) do
  Article.create!(title: 'Article from Tim', content: 'content')
end

একটি কাস্টম সাবডোমেনের জন্য সমর্থন যোগ করা

আমরা এখনও প্রদত্ত লেখকের নিবন্ধের তালিকা দেখতে পারি না কারণ আমরা জানি না কখন আমাদের জন এবং টিমের নিবন্ধগুলি দেখাতে হবে। আমরা কাস্টম সাবডোমেন প্রয়োগ করে এই সমস্যার সমাধান করব। https://johndoe.localhost:3000/articles পরিদর্শন করার সময়, আমাদের জনের নিবন্ধগুলি দেখা উচিত এবং যখন https://timedoe.localhost:3000/articles টিম থেকে নিবন্ধগুলি পরিদর্শন করা উচিত৷

সাবডোমেন কনফিগারেশন

ভাড়াটিয়া সেট করা হলে আমরা নিবন্ধগুলি পরিচালনা করতে এবং পরিদর্শন করতে চাই। আমরা config/routes.rb আপডেট করে এটি অর্জন করতে পারি ফাইল এবং সীমাবদ্ধতা ব্লকে নিবন্ধ সম্পদের সংজ্ঞা মোড়ানো:

Rails.application.routes.draw do
 constraints subdomain: /.*/ do
   resources :articles
 end
 
 resources :authors
end

ডিফল্টরূপে, রেলগুলি শীর্ষ-স্তরের ডোমেনের দৈর্ঘ্য 1 এ সেট করে, কিন্তু আমরা এই সেটিংটি 0 এ সেট করতে স্থানীয় হোস্ট ব্যবহার করতে চাই। আমরা config/environments/development.rb<ফাইলে নিম্নলিখিত লাইনটি যোগ করে এটি করতে পারি। /কোড> :

config.action_dispatch.tld_length = 0

সাবডোমেন তৈরি করা মাল্টিটেনেন্সির সাথে কাজ করে

বর্তমান ভাড়াটেদের জন্য ডেটাবেস পড়ার মানসম্মত করার জন্য, আমি Tenantable নামে একটি কন্ট্রোলার উদ্বেগ তৈরি করব . এটি read_with_tenant প্রদান করে পদ্ধতি, যা একটি ব্লক গ্রহণ করে এবং অনুরোধকৃত ভাড়াটেদের প্রসঙ্গে এটি কার্যকর করে:

module Tenantable
 extend ActiveSupport::Concern
 
 private
 
 def read_with_tenant(&block)
   author = Author.find_by!(slug: request.subdomain)
 
   ActiveRecord::Base.connected_to(role: :reading, shard: author.slug.to_sym) do
     block.call
   end
 end
end

এই ফাইলটিকে app/controllers/concerns/tenantable.rb হিসাবে সংরক্ষণ করুন এবং ArticlesController-এ অন্তর্ভুক্ত করুন :

class ArticlesController < ApplicationController
 include Tenantable
 
 before_action :set_article, only: [:show, :edit, :update, :destroy]
 
 def index
   read_with_tenant do
     @articles = Article.all
   end
 end
 # ...
end

এখন আপনি https://johndoe.localhost:3000/articles বা https://timdoe.localhost:3000/articles-এ যেতে পারেন এবং আপনি তালিকায় প্রদর্শিত বিভিন্ন নিবন্ধ দেখতে পাবেন।

আপনি যদি ফর্ম ব্যবহার করে নতুন নিবন্ধ তৈরি করতে চান, তাহলে আপনাকে write_with_tenant নামে একটি নতুন পদ্ধতি নির্ধারণ করতে হবে। এবং ArticlesController-এর ভিতরে Tenantable উদ্বেগ এবং পদ্ধতিগুলি আপডেট করুন সেই অনুযায়ী।

আরো উন্নতি

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

ActiveRecord::Base.establish_connection(:primary_timdoe)

চূড়ান্ত সমাধান নির্ভর করে আপনার চাহিদা এবং নির্দিষ্ট ভাড়াটেদের জন্য নির্ধারিত ডেটা ব্যবহার করতে চান এমন জায়গার সংখ্যার উপর।

সারাংশ

অভিনন্দন, আপনি একটি মাল্টি-টেন্যান্ট রেল অ্যাপ্লিকেশনের দুটি সংস্করণ তৈরি করেছেন এবং একটি আধুনিক ওয়েব অ্যাপ্লিকেশনে একাধিক ভাড়াটেদের সাথে ডিল করার বিভিন্ন উপায় সম্পর্কে জ্ঞান অর্জন করেছেন৷

এই নিবন্ধের সময় আমরা যা শিখেছি তা দ্রুত সংক্ষিপ্ত করা যাক:

  • একটি ওয়েব অ্যাপ্লিকেশনে তিনটি প্রাথমিক মাল্টি-টেনেন্সি লেভেল আছে - ডাটাবেস-সারি, স্কিমা এবং ডাটাবেস লেভেল।
  • প্রতিটি পদ্ধতির সুবিধা এবং অসুবিধা রয়েছে এবং আপনার পছন্দ হার্ডওয়্যারের সম্ভাবনা এবং ভাড়াটে তথ্যের বিচ্ছিন্নতার স্তরের উপর নির্ভর করে৷
  • কোন বাহ্যিক লাইব্রেরি ছাড়াই রুবি অন রেল ফ্রেমওয়ার্কের মধ্যে সমস্ত মাল্টি-টেনেন্সি লেভেল বাস্তবায়ন করা সম্ভব৷
  • Ruby on Rails বক্সের বাইরে কাস্টম সাবডোমেন সমর্থন করে, তাই এটি একটি মাল্টি-টেন্যান্ট অ্যাপ্লিকেশনের জন্য একটি নিখুঁত সংযোজন যেখানে প্রতিটি ভাড়াটে তার সাবডোমেন বরাদ্দ করতে পারে।

আমি আশা করি আপনি এই নিবন্ধটি পড়ে উপভোগ করেছেন এবং মাল্টি-টেন্যান্ট রুবি অন রেল অ্যাপ্লিকেশন তৈরি করেছেন৷

পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্টও মিস করবেন না!


  1. Vue, Vuex এবং Rails সহ একটি সম্পূর্ণ-স্ট্যাক অ্যাপ্লিকেশন তৈরি করা

  2. রেলে প্রতিক্রিয়া:একটি সহজ অ্যাপ তৈরি করা

  3. রেলের সাথে কৌণিক ব্যবহার 5

  4. রুবি দিয়ে কীভাবে কমান্ড-লাইন অ্যাপ্লিকেশন (সিএলআই) তৈরি করবেন