माइक्रोसर्विस आर्किटेक्चर क्या है?
माइक्रोसर्विस आर्किटेक्चर एक सॉफ्टवेयर डिज़ाइन पैटर्न है जिसमें हम कई छोटे प्रोग्रामों को मिलाकर एप्लिकेशन लिखते हैं। ये प्रोग्राम, जिन्हें माइक्रोसर्विसेज कहा जाता है, एक समान लक्ष्य के लिए मिलकर काम करते हैं। कुछ टीमों के लिए, एक बड़े की तुलना में कई छोटे अनुप्रयोगों को लिखने में बहुत कम समय और प्रयास लगता है।
एक माइक्रोसर्विस-ओरिएंटेड प्रोजेक्ट में छोटे अनुप्रयोगों का एक समूह होता है, प्रत्येक अपना काम करता है, एक अलग प्रक्रिया में चलता है, और बाकी के साथ मानकीकृत इंटरफेस के माध्यम से संचार करता है। यह दृष्टिकोण टीमों को एक भाषा या ढांचे के बिना प्रत्येक समस्या के लिए सबसे अच्छा टूल चुनने देता है। यह हमें कार्य को अधिक विशिष्ट समूहों में विभाजित करने की भी अनुमति देता है।
मोनोलिथ से माइक्रोसर्विस तक
इस श्रृंखला के पहले भाग में, हमने मोनोलिथ के बारे में बात की थी। मोनोलिथ से शुरू करना आसान है। विकास की गति, हालांकि, खराब पैमाने पर होती है, मुख्यतः क्योंकि सब कुछ बहुत कसकर युग्मित होता है। यहां तक कि एक छोटा सा कोड परिवर्तन हमें पूरी परियोजना के पुनर्निर्माण और परीक्षण के लिए मजबूर करता है, जो निराशाजनक रूप से लंबे रिलीज चक्र की ओर जाता है।
हम मोनोलिथ से माइक्रोसर्विस में कैसे जाते हैं? अमेज़न का ही मामला लें। कुछ समय पहले, उन्होंने एक मोनोलिथ के रूप में शुरुआत की और समय के साथ माइक्रोसर्विसेज में बदल गए। उनका प्रारंभिक डिज़ाइन कुछ इस तरह दिखाई दे सकता है:
निःसंदेह, मैं यहाँ पर अधिक सरलीकरण कर रहा हूँ, लेकिन मेरा मानना है कि मैंने अधिकांश बुनियादी बातों को शामिल कर लिया है। क्या होगा अगर उन्होंने शुरू से ही माइक्रोसर्विस पैटर्न का पालन करना चुना था? उन्होंने प्रत्येक घटक को एक समस्या पर ध्यान केंद्रित करते हुए, फ़ंक्शन द्वारा एप्लिकेशन को विभाजित किया होगा।
उन्हें इंटर-सर्विस कम्युनिकेशन के लिए इंटरफेस और प्रोटोकॉल को परिभाषित करने की भी आवश्यकता होगी, आमतौर पर RESTful APIs जैसे हल्के तंत्र के साथ।
नाम स्थान क्या हैं
एक माइक्रोसर्विस डिज़ाइन में चुनौतियों का एक अनूठा सेट होता है। मुख्य शायद इंस्ट्रूमेंटेशन और त्रुटि रिपोर्टिंग है। इसके बारे में सोचें, हम विभिन्न प्लेटफार्मों और भाषाओं में फैले दसियों या सैकड़ों घटकों की निगरानी कर रहे हैं। और हमें किसी न किसी तरह उन सभी पर नजर रखनी चाहिए, और साथ ही, बड़ी तस्वीर को खोने से बचना चाहिए। नेमस्पेस शिथिल-युग्मित माइक्रोसर्विसेज के समूह को एक सुसंगत चित्र में केंद्रित करने में हमारी सहायता कर सकता है।
AppSignal में, नाम स्थान एकत्रित मीट्रिक के लिए कंटेनर होते हैं। 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
. के साथ एक साथ दिखाया जाता है , भले ही वे अलग-अलग मशीनों पर चलने वाले अलग-अलग एप्लिकेशन हों।
अगला घटक सिफारिश इंजन है। हम एपीआई एंडपॉइंट लागू करेंगे जो एक्सप्रेस के साथ उत्पाद सुझाव दिखाता है। हमने 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
में दिखना शुरू हो जाना चाहिए नाम स्थान।
उदाहरण सादा जावास्क्रिप्ट दिखाता है, लेकिन अगर आप रिएक्ट या एंगुलर जैसे फ्रंटएंड फ्रेमवर्क का उपयोग कर रहे हैं तो अतिरिक्त सेटअप चरणों की आवश्यकता हो सकती है।
वेबसाइट के लिए, रूबी ऑन रेल्स का प्रयास करें, जो एक बहुत ही प्रसिद्ध एमवीसी ढांचा है जिसे ऐपसिग्नल आउट-ऑफ-द-बॉक्स के साथ एकीकृत करता है। हम नेमस्पेस को 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
इसके बाद, हम वेबसाइट और मोबाइल एप्लिकेशन को डेटा प्रदान करने के लिए एपीआई एंडपॉइंट का उपयोग कर सकते हैं। इसके लिए, हम रूबी के लिए हल्के आरईएसटी एपीआई ढांचे, अंगूर का उपयोग कर सकते हैं। इस बार, 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
अधिक उदाहरणों के लिए, अंगूर एकीकरण दस्तावेज़ देखें।
चित्र को पूरा करने के लिए, हम एक साइडकीक पृष्ठभूमि कार्य के साथ समाप्त करेंगे। साइडकीक रूबी के लिए एक लोकप्रिय जॉब प्रोसेसर है और 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
स्टैंडअलोन एजेंट के साथ मीट्रिक एकत्रित करना
स्टैंडअलोन एजेंट किसी भी Ubuntu, RedHat, या CentOS मशीन से संसाधन उपयोग मेट्रिक्स एकत्र करता है। हम एजेंट का उपयोग उपग्रह सर्वरों की निगरानी के लिए कर सकते हैं जो माइक्रोसर्विस अनुप्रयोगों को डेटाबेस, गेटवे, या संदेश दलाल जैसी सुविधाएं प्रदान करते हैं।
AppSignal में हम अपने स्वयं के काफ्का सर्वर की निगरानी के लिए एजेंट का उपयोग करते हैं। एजेंट उन भाषाओं और फ़्रेमवर्क पर कस्टम इंस्ट्रुमेंटेशन बनाने के लिए भी आसान है जो सीधे समर्थित नहीं हैं।
एजेंट के साथ आरंभ करने के लिए, इंस्टॉलेशन निर्देशों का पालन करते हुए इसे डाउनलोड और इंस्टॉल करें।
एक बार यह चलने के बाद, हमें एपीआई कुंजी, एप्लिकेशन का नाम और पर्यावरण सेट करने के लिए कॉन्फ़िगरेशन फ़ाइल को संपादित करने की आवश्यकता होगी। सब कुछ एक डैशबोर्ड पर लाने के लिए बाकी माइक्रोसर्विस में उपयोग किए गए समान मानों का उपयोग करें।
# /etc/appsignal-agent.conf
push_api_key = "YOUR APPSIGNAL API KEY"
app_name = "Nozama"
environment = "production"
निष्कर्ष
नेमस्पेस कई प्रणालियों के बीच वितरित डेटा को व्यवस्थित करने का एक शानदार तरीका है। वे हमें सूचनाओं को कॉन्फ़िगर करने और अलर्ट हैंडलिंग को फाइन-ट्यून करने की भी अनुमति देते हैं। यह देखने के लिए कि यह कैसे काम करता है, इस श्रृंखला का पहला भाग देखें।
अतिरिक्त पढ़ता है:
- नामस्थान के साथ आप क्या कर सकते हैं?
- StatsD और AppSignal के स्टैंडअलोन एजेंट के साथ किसी भी सिस्टम की निगरानी करना
- बेहतर होस्ट मीट्रिक और अलर्ट