কম্পিউটার টিউটোরিয়াল

মাইক্রোসার্ভিস মোনিটরিংে দক্ষতা: নেমস্পেস দিয়ে ডেটা স্ট্রাকচারিং

মাইক্রোসার্ভিস আর্কিটেকচার কী?

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

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

মনোলিথ থেকে মাইক্রোসার্ভিসে (From Monolith to Microservice)

এই সিরিজের প্রথম পার্টে, আমরা মনোলিথের কথা বলেছি। মনোলিথ শুরু করা সহজ। ডেভেলপমেন্ট পেস, যiewe, খুব খারাপ স্কেল করে, মূলত কারণ সব কিছু খুব টাইটলি কাপল্ড। এমনকি একটি ছোট কোড চেঞ্জ আমাদের পুরো প্রজেক্ট রিবিল্ড এবং টেস্ট করতে ফোর্স করে, যা-frustratingly long release cycles-এ নিয়ে যায়।

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

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

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

নেমস্পেস কী (What Are Namespaces)

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

AppSignal-এ, নেমস্পেস হলো সংগৃহীত মেট্রিক্সের জন্য কন্টেইনার। AppSignal তিনটি নেমস্পেস ডিফল্টলি ব্যবহার করে (web, background, এবং frontend), কিন্তু আমরা কয়েক লাইন কোড যোগ করে আমাদের নিজস্ব তৈরি করতে পারি। আমরা দেখব কীভাবে সেগুলো কাজ করে।

এক অ্যাপ্লিকেশন সবার ওপর রাজ করবে (One Application to Rule Them All)

একটি মাইক্রোসার্ভিস কম্পোনেন্ট সেট আপ করার সময়, প্রথম কাজ হলো একটি কমন অ্যাপ্লিকেশন নাম এবং এনভায়রনমেন্ট কনফিগার করা। এই কারণে, AppSignal সকল সংগৃহীত মেট্রিক্স এবং অ্যালার্ট একই ড্যাশবোর্ডে প্রেজেন্ট করে।

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

# 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 সম্পর্কে ইনফরমেশন পাওয়া যাবে:

  • নতুন অ্যাপ্লিকেশন যোগ করা
  • অ্যাপ্লিকেশন কনফিগার করা

মাইক্রোসার্ভিসে নেমস্পেস ব্যবহার করা (Using Namespaces in Microservices)

চলুন দেখি আমরা প্রতিটি মাইক্রোসার্ভিস কীভাবে কোড করব। বিলিং সিস্টেম দিয়ে শুরু করি; এই পার্টের জন্য আমরা এলিক্সির এবং ফিনিক্স ব্যবহার করব।

ফিনিক্স ইন্টিগ্রেশন সেটআপ ফলো করলে, আমরা কন্ট্রোলারগুলোর ওপর কাজ শুরু করতে পারি। নিচের স্নিপেট নেমস্পেসকে billing-এ সেট করে:

# একটি ফিনিক্স কন্ট্রোলারে, আমরা প্লাগ ব্যবহার করি নেমস্পেস ইনিশিয়ালাইজেশনের জন্য defmodule BillingPageController.PageController do use BillingPageController, :controller plug :set_appsignal_namespace defp set_appsignal_namespace(conn, _params) do # এই কন্ট্রোলারের সকল অ্যাকশনকে "billing" নেমস্পেসে রিপোর্ট করার জন্য সেট করে Appsignal.Transaction.set_namespace(:billing) conn end # কন্ট্রোলারর বাকি অংশ ... 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 # কন্ট্রোলারর বাকি অংশ ... end

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

পরবর্তী কম্পোনেন্ট হলো রিকমেন্ডেশন ইঞ্জিন। আমরা প্রোডাক্ট সাজেশন দেখানোর API এন্ডপয়েন্ট ইমপ্লিমেন্ট করব Express দিয়ে। Node.js-এ নেমস্পেস সেট করা যেন:

app.get("/", (req, res) => { const tracer = appsignal.tracer(); tracer.withSpan( tracer.createSpan({ namespace: "recommendations" }), (span) => { // মেজার করার কোড يذهب এখানে span.close(); } ); });

এখন আমাদের তিনটি নেমস্পেস আছে।

মোবাইল এবং ফ্রন্টএন্ড টিমরা ড্যাশবোর্ডে এরর লগ করতে চাইতে পারে। AppSignal-এর জাভাস্ক্রিপ্ট ইন্টিগ্রেশন অটোমেটিক্যালি ইনকামিং ডেটাকে frontend নেমস্পেসে অ্যাসাইন করে। কিন্তু আমরা এটা চেঞ্জ করতে পারি যেন:

try { // কোড যা ফেল করতে পারে } catch (error) { // এরর হ্যান্ডেল করুন // AppSignal-এ এরর পাঠান appsignal.sendError(error, {}, "Mobile"); }

একটু সময়ের পর, ডেটা Mobile নেমস্পেসে দেখতে শুরু করবে।

উদাহরণটি প্লেইন জাভাস্ক্রিপ্ট দেখাচ্ছে, কিন্তু আপনি যদি React বা Angularের মতো ফ্রন্টএন্ড ফ্রেমওয়ার্ক ব্যবহার করেন তবে অতিরিক্ত সেটআপ স্টেপ দরকার হতে পারে।

ওয়েবসাইটের জন্য, আসুন রুবি অন রেইলস ট্রাই করি, একটি খুব পরিচিত MVC ফ্রেমওয়ার্ক যা AppSignal আউট-অফ-দ-বক্স ইন্টিগ্রেট করে। আমরা রেইলস কন্ট্রোলারগুলো নিচের স্নিপেট দিয়ে শুরু করব নেমস্পেস homepage-এ সেট করার জন্য:

# রেইলসে আমরা before_action কলব্যাক ব্যবহার করি রিকোয়েস্ট শুরু হওয়ার আগে নেমস্পেস চেঞ্জ করার জন্য class HomepageController < ApplicationController before_action :set_appsignal_namespace def set_appsignal_namespace Appsignal.set_namespace("homepage") end # কন্ট্রোলার অ্যাকশনগুলো ... end

পরবর্তী, আমরা API এন্ডপয়েন্ট ব্যবহার করতে পারি ওয়েবসাইট এবং মোবাইল অ্যাপ্লিকেশনের জন্য ডেটা সার্ভ করতে। এর জন্য, আমরা Grape ব্যবহার করতে পারি, রুবির জন্য একটি লাইটওয়েট REST API ফ্রেমওয়ার্ক। এইবার, 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 # প্রোডাক্ট সার্চ লজিক end end end

আরো উদাহরণের জন্য, Grape ইন্টিগ্রেশন ডক্স চেক করুন।

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

# 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") # জব লজিক end end

স্ট্যান্ডআলোন এজেন্ট দিয়ে মেট্রিক্স সংগ্রহ (Collecting Metrics With the Standalone Agent)

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

AppSignal-এ আমরা আমাদের নিজস্ব Kafka সার্ভার মোনিটর করার জন্য এজেন্ট ব্যবহার করি। এজেন্ট কাস্টম ইনস্ট্রুমেন্টেশন তৈরি করার জন্যও হ্যান্ডি যেসব ল্যাঙ্গুয়েজ এবং ফ্রেমওয়ার্ক সরাসরি সাপোর্টেড নয়।

এজেন্ট দিয়ে শুরু করতে, ডাউনলোড এবং ইনস্টল করুন ইনস্টলেশন ইনস্ট্রাকশন ফলো করে।

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

# /etc/appsignal-agent.conf push_api_key = "YOUR APPSIGNAL API KEY" app_name = "Nozama" environment = "production" 

উপসংহার (Conclusion)

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

অতিরিক্ত পড়া:

  • নেমস্পেস দিয়ে আপনি কী কী করতে পারেন?
  • Monitoring Any System with StatsD and AppSignal's Standalone Agent
  • উন্নত হোস্ট মেট্রিক্স এবং অ্যালার্ট
  1. E.F. Codd-এর ১২টি নিয়ম RDBMS-এর জন্য

  2. অ্যান্ড্রয়েডে SQLite ব্যবহার করে ডেটা সংরক্ষণ করার পদ্ধতি

  3. পাইথন: Bokeh লাইব্রেরি দিয়ে ডেটা ভিজ্যুয়ালাইজেশন

  4. রুবি ডেভেলপারদের জন্য অপরিহার্য ডেটা স্ট্রাকচার: একটি প্র্যাক্টিক্যাল গাইড