মাইক্রোসার্ভিস আর্কিটেকচার কি?
মাইক্রোসার্ভিস আর্কিটেকচার হল একটি সফ্টওয়্যার ডিজাইন প্যাটার্ন যেখানে আমরা কয়েকটি ছোট প্রোগ্রাম একত্রিত করে অ্যাপ্লিকেশন লিখি। এই প্রোগ্রামগুলি, যাকে মাইক্রোসার্ভিস বলা হয়, একটি সাধারণ লক্ষ্যের জন্য একসাথে কাজ করে। কিছু দলের জন্য, একটি বড় একটির চেয়ে অনেকগুলি ছোট অ্যাপ্লিকেশন লিখতে অনেক কম সময় এবং প্রচেষ্টা লাগে৷
একটি মাইক্রোসার্ভিস-ভিত্তিক প্রকল্পে ছোট ছোট অ্যাপ্লিকেশনগুলির একটি নক্ষত্রমণ্ডল থাকে, প্রত্যেকে তার অংশটি করে, একটি পৃথক প্রক্রিয়ায় চলমান, এবং প্রমিত ইন্টারফেসের মাধ্যমে বাকিদের সাথে যোগাযোগ করে। এই পদ্ধতিটি দলগুলিকে একটি ভাষা বা কাঠামোর প্রতি প্রতিশ্রুতিবদ্ধ না হয়ে প্রতিটি সমস্যার জন্য সেরা টুল বেছে নিতে দেয়। এটি আমাদের কাজকে আরও বিশেষায়িত গোষ্ঠীর মধ্যে বিভক্ত করার অনুমতি দেয়৷
মনোলিথ থেকে মাইক্রোসার্ভিস পর্যন্ত
এই সিরিজের প্রথম অংশে, আমরা মনোলিথ সম্পর্কে কথা বলেছি। মনোলিথগুলি দিয়ে শুরু করা সহজ। তবে উন্নয়নের গতি খুব খারাপভাবে পরিমাপ করে, প্রধানত কারণ সবকিছু এত শক্তভাবে সংযুক্ত। এমনকি একটি ছোট কোড পরিবর্তন আমাদের পুরো প্রকল্পের পুনর্নির্মাণ এবং পরীক্ষা করতে বাধ্য করে, যা হতাশাজনকভাবে দীর্ঘ মুক্তি চক্রের দিকে নিয়ে যায়।
আমরা কিভাবে একশিলা থেকে মাইক্রোসার্ভিসে যেতে পারি? আমাজনের কথাই ধরুন। কিছুক্ষণ আগে, তারা একটি মনোলিথ হিসাবে শুরু করেছিল এবং সময়ের সাথে সাথে মাইক্রোসার্ভিসে পরিবর্তন করেছিল। তাদের প্রাথমিক নকশা এইরকম দেখতে হতে পারে:
অবশ্যই, আমি এখানে অতিরিক্ত সরলীকরণ করছি, কিন্তু আমি বিশ্বাস করি যে আমি বেশিরভাগ মৌলিক বিষয়গুলি কভার করেছি। যদি তারা শুরু থেকেই মাইক্রোসার্ভিস প্যাটার্ন অনুসরণ করা বেছে নেয়? প্রতিটি উপাদান একটি সমস্যার উপর ফোকাস রেখে তারা অ্যাপ্লিকেশনটিকে ফাংশন দ্বারা বিভক্ত করবে।
তাদের ইন্টার-সার্ভিস কমিউনিকেশনের জন্য ইন্টারফেস এবং প্রোটোকল সংজ্ঞায়িত করতে হবে, সাধারণত RESTful API-এর মতো লাইটওয়েট মেকানিজম সহ।
নেমস্পেস কি
একটি মাইক্রোসার্ভিস ডিজাইনের চ্যালেঞ্জের একটি অনন্য সেট রয়েছে। প্রধান একটি সম্ভবত উপকরণ এবং ত্রুটি রিপোর্টিং হয়. এটি সম্পর্কে চিন্তা করুন, আমরা বিভিন্ন প্ল্যাটফর্ম এবং ভাষা জুড়ে ছড়িয়ে থাকা দশ বা শত শত উপাদান পর্যবেক্ষণ করছি। এবং আমাদের অবশ্যই তাদের সকলের উপর নজর রাখতে হবে এবং একই সাথে বড় ছবি হারানো এড়াতে হবে। নেমস্পেসগুলি আমাদেরকে একটি সুসংগত ছবিতে আলগাভাবে জোড়া মাইক্রোসার্ভিসের একটি গ্রুপ ফোকাস করতে সাহায্য করতে পারে৷
AppSignal-এ, নেমস্পেসগুলি সংগৃহীত মেট্রিক্সের ধারক। অ্যাপসিগন্যাল ডিফল্টরূপে তিনটি নামস্থান ব্যবহার করে (web
, background
, এবং frontend
), কিন্তু আমরা কোডের কয়েকটি লাইন যোগ করে আমাদের নিজস্ব তৈরি করতে পারি। আমরা দেখব তারা কিভাবে কাজ করে।
সবকে শাসন করার জন্য একটি আবেদন
একটি মাইক্রোসার্ভিস উপাদান সেট আপ করার সময়, প্রথম কাজটি হল একটি সাধারণ অ্যাপ্লিকেশন নাম এবং পরিবেশ কনফিগার করা। তাই, AppSignal একই ড্যাশবোর্ডে সমস্ত সংগৃহীত মেট্রিক্স এবং সতর্কতা উপস্থাপন করে৷
এই মানগুলি কীভাবে কনফিগার করবেন তার নির্দিষ্ট বিবরণ ভাষা এবং একীকরণের উপর নির্ভর করে। উদাহরণস্বরূপ, "নোজামা" নামটি ব্যবহার করার জন্য একটি রুবি অন রেল অ্যাপ্লিকেশন কনফিগার করতে:
# config/appsignal.yml
production:
active: true
push_api_key: "YOUR APPSIGNAL API KEY"
name: "Nozama"
যেটি আমরা কীভাবে এলিক্সির ইন্টিগ্রেশন কনফিগার করি তার সাথে খুব মিল:
# config/config.exs
config :appsignal, :config,
active: true,
name: "Nozama",
push_api_key: "YOUR APPSIGNAL API KEY",
env: "production"
Node.js-এ, অন্যদিকে, আমরা ব্যবহার করি:
const { Appsignal } = require("@appsignal/nodejs");
const appsignal = new Appsignal({
active: true,
name: "Nozama",
apiKey: "YOUR APPSIGNAL API KEY",
});
ফ্রন্টেন্ট জাভাস্ক্রিপ্ট ইন্টিগ্রেশনের জন্য, আমরা @appsignal/javascript
ব্যবহার করি পরিবর্তে:
import Appsignal from "@appsignal/javascript";
export default new Appsignal({
name: "Nozama",
key: "YOUR FRONTEND API KEY",
});
আপনি এখানে AppSignal ইনস্টল এবং কনফিগার করার তথ্য পেতে পারেন:
- নতুন অ্যাপ্লিকেশন যোগ করা হচ্ছে
- অ্যাপ্লিকেশন কনফিগার করা হচ্ছে
মাইক্রোসার্ভিসে নেমস্পেস ব্যবহার করা
আসুন দেখি কিভাবে আমরা প্রতিটি মাইক্রোসার্ভিস কোডিং করতে পারি। বিলিং সিস্টেম দিয়ে শুরু করা যাক; আমরা এই অংশের জন্য এলিক্সির এবং ফিনিক্স ব্যবহার করব।
একবার আমরা ফিনিক্স ইন্টিগ্রেশন সেটআপ অনুসরণ করার পরে, আমরা কন্ট্রোলারগুলিতে কাজ শুরু করতে পারি। নিচের স্নিপেটটি নামস্থানকে billing
-এ সেট করে :
# in a Phoenix controller, we use plug to run the namespace initialization
defmodule BillingPageController.PageController do
use BillingPageController, :controller
plug :set_appsignal_namespace
defp set_appsignal_namespace(conn, _params) do
# Sets all actions in this controller to report in the "billing" namespace
Appsignal.Transaction.set_namespace(:billing)
conn
end
# rest of the controller ...
end
মাইক্রোসার্ভিস চালু হয়ে গেলে এবং কন্ট্রোলার কিছু অ্যাক্টিভিটি দেখতে পেলে ডেটা ড্যাশবোর্ডে প্রদর্শিত হওয়া উচিত।
অবশ্যই, মানুষ কিছু না কিনলে বিলিং আমাদের বেশিদূর পাবে না। এটি একটি সমস্যা যা আমরা একটি পৃথক মাইক্রোসার্ভিসে মোকাবেলা করতে পারি। একই প্যাটার্ন অনুসরণ করে, আমরা একটি PayButtonController
সহ একটি একেবারে নতুন ফিনিক্স অ্যাপ্লিকেশন লিখব কন্ট্রোলার যেটি এভাবে শুরু হয়:
defmodule PayButtonController.PageController do
use PayButtonController, :controller
plug :set_appsignal_namespace
defp set_appsignal_namespace(conn, _params) do
Appsignal.Span.set_namespace(Appsignal.Tracer.root_span(), "pay_button")
conn
end
# rest of the controller ...
end
আমাদের এখন ড্যাশবোর্ডে দুটি নামস্থান রয়েছে। একই নাম এবং পরিবেশ ব্যবহার করা নিশ্চিত করে যে PayButtonController
থেকে ডেটা BillingPageController
এর সাথে একসাথে দেখানো হয় , এমনকি যদি সেগুলি বিভিন্ন মেশিনে চলমান পৃথক অ্যাপ্লিকেশন হয়।
পরবর্তী উপাদান সুপারিশ ইঞ্জিন. আমরা API এন্ডপয়েন্ট বাস্তবায়ন করব যা এক্সপ্রেসের সাথে পণ্যের পরামর্শ দেখায়। আমরা Node.js-এ নেমস্পেস সেট করেছি যেমন দেখানো হয়েছে:
app.get("/", (req, res) => {
const tracer = appsignal.tracer();
tracer.withSpan(
tracer.createSpan({ namespace: "recommendations" }),
(span) => {
// code to measure goes here
span.close();
}
);
});
আমরা এখন তিনটি নামস্থান পর্যন্ত।
মোবাইল এবং ফ্রন্টএন্ড দলগুলি ড্যাশবোর্ডে ত্রুটিগুলি লগ করতে চাইতে পারে৷ AppSignal এর JavaScript ইন্টিগ্রেশন স্বয়ংক্রিয়ভাবে frontend
এর সাথে ইনকামিং ডেটা বরাদ্দ করে নামস্থান কিন্তু আমরা এটিকে এভাবে পরিবর্তন করতে পারি:
try {
// code that might fail
} catch (error) {
// handle the error
// send error to AppSignal
appsignal.sendError(error, {}, "Mobile");
}
কিছুক্ষণ পরে, ডেটা Mobile
-এ প্রদর্শিত হতে শুরু করবে নামস্থান।
উদাহরণটি সাধারণ জাভাস্ক্রিপ্ট দেখায়, তবে আপনি যদি প্রতিক্রিয়া বা কৌণিকের মতো ফ্রন্টএন্ড ফ্রেমওয়ার্ক ব্যবহার করেন তবে অতিরিক্ত সেটআপ পদক্ষেপের প্রয়োজন হতে পারে।
ওয়েবসাইটের জন্য, আসুন Ruby on Rails ব্যবহার করে দেখি, একটি খুব পরিচিত MVC ফ্রেমওয়ার্ক যা AppSignal আউট-অফ-দ্য-বক্সের সাথে একীভূত করে। নামস্থানকে homepage
সেট করতে আমরা নিচের স্নিপেট দিয়ে রেল কন্ট্রোলারগুলি শুরু করব :
# in Rails we use before_action callback to change
# the namespace before the request starts
class HomepageController < ApplicationController
before_action :set_appsignal_namespace
def set_appsignal_namespace
Appsignal.set_namespace("homepage")
end
# controller actions ...
end
এর পরে, ওয়েবসাইট এবং মোবাইল অ্যাপ্লিকেশনগুলিতে ডেটা পরিবেশন করতে আমরা API এন্ডপয়েন্ট ব্যবহার করতে পারি। এর জন্য, আমরা রুবির জন্য একটি লাইটওয়েট REST API ফ্রেমওয়ার্ক Grape ব্যবহার করতে পারি। এইবার, AppSignal কনফিগার করতে একটু বেশি কাজ লাগে৷
´config/appsignal.yml´-এ রুবি ইন্টিগ্রেশন কনফিগার করার পর, যেমন আমরা আগে করেছি, আপনি এর মাধ্যমে ইভেন্ট এবং মেট্রিক্স লগ করা শুরু করতে পারেন:
Appsignal.start_logger
Appsignal.start
তারপরে, ত্রুটি হ্যান্ডলার চেইনে AppSignal মিডলওয়্যার সন্নিবেশ করুন:
require "appsignal"
require "appsignal/integrations/grape"
class API < Grape::API
insert_before Grape::Middleware::Error, Appsignal::Grape::Middleware
resource :search do
desc 'return a product search'
before do
Appsignal.set_namespace("search")
end
get :product do
# product search logic
end
end
end
আরও উদাহরণের জন্য, গ্রেপ ইন্টিগ্রেশন ডক্স দেখুন।
ছবিটি সম্পূর্ণ করতে, আমরা একটি Sidekiq ব্যাকগ্রাউন্ড কাজ দিয়ে শেষ করব। Sidekiq হল রুবির জন্য একটি জনপ্রিয় কাজের প্রসেসর এবং এভাবেই আমরা ´config/appsignal.yml´ কনফিগার করার পর এটিকে স্বতন্ত্র মোডে শুরু করতে পারি:
# config.ru
require 'appsignal'
Sidekiq.on(:startup) do
Appsignal.start
end
Sidekiq.on(:shutdown) do
Appsignal.stop('Sidekiq shutdown')
end
AppSignal স্বয়ংক্রিয়ভাবে কাজগুলি থেকে background
ডেটা বরাদ্দ করে৷ নামস্থান আমরা এটিকে আরও নির্দিষ্ট নামস্থানে পরিবর্তন করতে চাই।
require 'sidekiq'
require 'appsignal'
class PlainOldRuby
include Sidekiq::Worker
def perform()
Appsignal.set_namespace("urgent_background")
# job logic
end
end
স্বতন্ত্র এজেন্টের সাথে মেট্রিক্স সংগ্রহ করা
স্বতন্ত্র এজেন্ট যেকোন উবুন্টু, রেডহ্যাট বা CentOS মেশিন থেকে সম্পদ ব্যবহারের মেট্রিক্স সংগ্রহ করে। আমরা এজেন্টকে স্যাটেলাইট সার্ভারগুলি নিরীক্ষণ করতে ব্যবহার করতে পারি যা মাইক্রোসার্ভিস অ্যাপ্লিকেশনগুলিতে ডেটাবেস, গেটওয়ে বা বার্তা দালালের মতো সুবিধা প্রদান করে৷
AppSignal এ আমরা আমাদের নিজস্ব কাফকা সার্ভার নিরীক্ষণ করতে এজেন্ট ব্যবহার করি। সরাসরি সমর্থিত নয় এমন ভাষা এবং ফ্রেমওয়ার্কগুলিতে কাস্টম ইন্সট্রুমেন্টেশন তৈরি করার জন্যও এজেন্ট সুবিধাজনক৷
এজেন্টের সাথে শুরু করতে, ইনস্টলেশন নির্দেশাবলী অনুসরণ করে এটি ডাউনলোড এবং ইনস্টল করুন।
এটি চালু হয়ে গেলে, API কী, অ্যাপ্লিকেশনের নাম এবং পরিবেশ সেট করতে আমাদের কনফিগারেশন ফাইলটি সম্পাদনা করতে হবে। সমস্ত কিছু একটি ড্যাশবোর্ডে পেতে বাকি মাইক্রোসার্ভিসে ব্যবহৃত একই মানগুলি ব্যবহার করুন৷
৷# /etc/appsignal-agent.conf
push_api_key = "YOUR APPSIGNAL API KEY"
app_name = "Nozama"
environment = "production"
উপসংহার
নেমস্পেসগুলি একাধিক সিস্টেমের মধ্যে বিতরণ করা ডেটা সংগঠিত করার একটি দুর্দান্ত উপায়। তারা আমাদের বিজ্ঞপ্তি কনফিগার করার অনুমতি দেয় এবং সতর্কতা হ্যান্ডলিং সূক্ষ্ম-টিউন করে। এটি কীভাবে কাজ করে তা দেখতে, এই সিরিজের প্রথম অংশটি দেখুন।
অতিরিক্ত পড়া:
- নেমস্পেস দিয়ে আপনি কী করতে পারেন?
- StatsD এবং AppSignal-এর স্বতন্ত্র এজেন্ট সহ যেকোন সিস্টেম মনিটরিং
- উন্নত হোস্ট মেট্রিক্স এবং সতর্কতা