इवेंट-आधारित क्लीन आर्किटेक्चर
युग्मन को कम करने और विस्तार-क्षमता बढ़ाने के लिए डोमेन इवेंट का उपयोग करते हुए इवेंट-आधारित पैटर्न को क्लीन आर्किटेक्चर में एकीकृत करें।
इवेंट-आधारित क्लीन आर्किटेक्चर, CoddyKit पर व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
इवेंट-आधारित क्लीन आर्किटेक्चर का परिचय
इवेंट-आधारित क्लीन आर्किटेक्चर में आपका स्वागत है! जटिल प्रणालियों में किसी भाग को अक्सर दूसरे स्थान पर होने वाली घटनाओं पर प्रतिक्रिया देनी होती है, बिना उसके साथ बहुत अधिक युग्मित हुए।
यह पाठ बताता है कि अपने क्लीन आर्किटेक्चर में इवेंट-आधारित प्रतिरूपों को कैसे जोड़ा जाए और निर्भरता नियम का कड़ाई से पालन करते हुए अलगाव तथा विस्तार-क्षमता बढ़ाने के लिए डोमेन इवेंट का उपयोग कैसे किया जाए।
डोमेन इवेंट क्या होते हैं
डोमेन इवेंट डोमेन में घटित ऐसी घटना होती है जिसमें डोमेन विशेषज्ञों की रुचि होती है। यह एक अपरिवर्तनीय तथ्य और घटना का रिकॉर्ड होता है, जैसे ऑर्डर रखा गया या उपयोगकर्ता पंजीकृत हुआ।
- ये डोमेन की स्थिति में हुए परिवर्तन को दर्शाते हैं।
- इनके नाम सामान्यतः भूतकाल में रखे जाते हैं, जैसे
OrderPlaced। - इनकी संरचना सरल होनी चाहिए और इनमें केवल इवेंट से संबंधित आवश्यक जानकारी होनी चाहिए।
इवेंट और निर्भरता नियम
क्लीन आर्किटेक्चर में निर्भरता नियम कहता है कि निर्भरताएँ अंदर की ओर प्रवाहित होनी चाहिए। डोमेन इवेंट इस नियम के लिए बिल्कुल उपयुक्त हैं:
- इकाइयाँ इवेंट उत्पन्न कर सकती हैं, लेकिन यह नहीं जानतीं कि उन्हें कौन संभालेगा।
- उपयोग मामले इकाइयों का समन्वय करते हैं और किसी कार्रवाई के बाद इवेंट प्रकाशित कर सकते हैं।
- इंटरफ़ेस एडाप्टर (जैसे प्रस्तुतकर्ता और बाहरी सेवा गेटवे) भीतरी परतों से आने वाले इवेंट की सदस्यता ले सकते हैं और उन्हें संभाल सकते हैं।
इससे कड़ा पृथक्करण बना रहता है, क्योंकि भीतरी परतें बाहरी परतों के विशिष्ट विवरणों से अनजान रहती हैं।
डोमेन इवेंट लागू करना
डोमेन इवेंट मूल रूप से एक डेटा स्थानांतरण ऑब्जेक्ट (DTO) होता है, जो घटित घटना की जानकारी ले जाता है। सभी डोमेन इवेंट के लिए एक सामान्य इंटरफ़ेस रखना अच्छा अभ्यास है।
यहाँ एक सरल Java इंटरफ़ेस है:
public interface DomainEvent {
long occurredOn();
}कोड: ठोस डोमेन इवेंट
आइए एक विशिष्ट डोमेन इवेंट बनाएँ: OrderPlacedEvent। इसमें orderId और घटना घटित होने का समय-मुद्रांक होता है।
इस सरल परिभाषा को चलाकर देखें:
public class OrderPlacedEvent implements DomainEvent {
private final String orderId;
private final long occurredOn;
public OrderPlacedEvent(String orderId) {
this.orderId = orderId;
this.occurredOn = System.currentTimeMillis();
}
public String getOrderId() {
return orderId;
}
@Override
public long occurredOn() {
return occurredOn;
}
public static void main(String[] args) {
OrderPlacedEvent event = new OrderPlacedEvent("ORD-123");
System.out.println("Order event for: " + event.getOrderId());
}
}इवेंट प्रकाशक
इवेंट प्रकाशित करने के लिए हमें एक इवेंट प्रकाशक चाहिए, जिसे इवेंट डिस्पैचर या इवेंट बस भी कहा जाता है। यह घटक किसी डोमेन इवेंट को लेकर उसे सभी पंजीकृत हैंडलर तक भेजता है।
यह मध्यस्थ की तरह काम करता है और इवेंट के स्रोत को उसके उपभोक्ताओं से अलग करता है। उपयोग मामला इस प्रकाशक के इंटरफ़ेस पर निर्भर करेगा, विशिष्ट हैंडलर पर नहीं।
कोड: इवेंट प्रकाशक इंटरफ़ेस
यहाँ हमारे EventPublisher का इंटरफ़ेस है। हैंडलर को स्वयं पंजीकृत करने का तरीका भी आवश्यक होगा।
public interface EventPublisher {
void publish(DomainEvent event);
<T extends DomainEvent> void subscribe(Class<T> eventType, EventHandler<T> handler);
}कोड: मेमोरी में इवेंट प्रकाशक
प्रदर्शन के उद्देश्य से मेमोरी में किया गया एक सरल कार्यान्वयन। वास्तविक अनुप्रयोग में स्थायित्व और वितरण के लिए यह संदेश कतार, जैसे Kafka या RabbitMQ, का उपयोग कर सकता है।
मूल प्रकाशक को कार्य करते देखने के लिए इसे चलाएँ:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public interface DomainEvent { long occurredOn(); }
public interface EventHandler<T extends DomainEvent> { void handle(T event); }
public class OrderPlacedEvent implements DomainEvent {
private final String orderId; private final long occurredOn;
public OrderPlacedEvent(String orderId) {
this.orderId = orderId; this.occurredOn = System.currentTimeMillis();
}
public String getOrderId() { return orderId; }
@Override public long occurredOn() { return occurredOn; }
}
public class SimpleEventPublisher implements EventPublisher {
private final Map<Class<? extends DomainEvent>, List<EventHandler<?>>> subscribers = new HashMap<>();
@Override
public void publish(DomainEvent event) {
List<EventHandler<?>> handlers = subscribers.get(event.getClass());
if (handlers != null) {
for (EventHandler handler : handlers) {
// Unchecked cast is safe due to type checking during subscription
((EventHandler<DomainEvent>) handler).handle(event);
}
}
}
@Override
public <T extends DomainEvent> void subscribe(Class<T> eventType, EventHandler<T> handler) {
subscribers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(handler);
}
public static void main(String[] args) {
SimpleEventPublisher publisher = new SimpleEventPublisher();
publisher.subscribe(OrderPlacedEvent.class, event -> {
System.out.println("Handler 1: Order " + event.getOrderId() + " placed!");
});
publisher.subscribe(OrderPlacedEvent.class, event -> {
System.out.println("Handler 2: Notifying ops for order " + event.getOrderId());
});
OrderPlacedEvent event = new OrderPlacedEvent("DEMO-456");
publisher.publish(event);
}
}उपयोग मामलों और हैंडलर का एकीकरण
अब देखते हैं कि कोई उपयोग मामला इवेंट कैसे प्रकाशित करता है और कोई इवेंट हैंडलर, जो उदाहरण के लिए इंटरफ़ेस एडाप्टर परत में रहता है, उस पर कैसे प्रतिक्रिया करता है। उपयोग मामला हैंडलर से अलग बना रहता है।
यह डिज़ाइन उपयोग मामले में बदलाव किए बिना नए हैंडलर जोड़ने की अनुमति देता है।
कोड: संपूर्ण इवेंट-आधारित प्रवाह
यह उदाहरण दिखाता है कि PlaceOrderUseCase एक OrderPlacedEvent प्रकाशित करता है, जिसे बाद में OrderEmailNotifier संभालता है।
ध्यान दें कि PlaceOrderUseCase केवल EventPublisher पर निर्भर करता है, किसी विशिष्ट सूचना-प्रदाता पर नहीं।
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// Domain Layer Interfaces & Classes
interface DomainEvent { long occurredOn(); }
class OrderPlacedEvent implements DomainEvent {
private final String orderId; private final long occurredOn;
public OrderPlacedEvent(String orderId) {
this.orderId = orderId; this.occurredOn = System.currentTimeMillis();
}
public String getOrderId() { return orderId; }
@Override public long occurredOn() { return occurredOn; }
}
// Application Layer Interfaces & Classes
interface EventPublisher {
void publish(DomainEvent event);
<T extends DomainEvent> void subscribe(Class<T> eventType, EventHandler<T> handler);
}
interface EventHandler<T extends DomainEvent> { void handle(T event); }
// Use Case (Application Layer)
class PlaceOrderUseCase {
private final EventPublisher eventPublisher;
public PlaceOrderUseCase(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void execute(String orderDetails) {
// Simulate order creation logic
String newOrderId = "ORD-" + System.nanoTime();
System.out.println("Order " + newOrderId + " created with details: " + orderDetails);
// Publish domain event
eventPublisher.publish(new OrderPlacedEvent(newOrderId));
}
}
// Infrastructure/Interface Adapters Layer Implementation
class SimpleEventPublisher implements EventPublisher {
private final Map<Class<? extends DomainEvent>, List<EventHandler<?>>> subscribers = new HashMap<>();
@Override
public void publish(DomainEvent event) {
List<EventHandler<?>> handlers = subscribers.get(event.getClass());
if (handlers != null) {
for (EventHandler handler : handlers) {
((EventHandler<DomainEvent>) handler).handle(event);
}
}
}
@Override
public <T extends DomainEvent> void subscribe(Class<T> eventType, EventHandler<T> handler) {
subscribers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(handler);
}
}
class OrderEmailNotifier implements EventHandler<OrderPlacedEvent> {
@Override
public void handle(OrderPlacedEvent event) {
System.out.println("Email Notifier: Sending email for order " + event.getOrderId());
}
}
class InventoryUpdater implements EventHandler<OrderPlacedEvent> {
@Override
public void handle(OrderPlacedEvent event) {
System.out.println("Inventory Updater: Updating inventory for order " + event.getOrderId());
}
}
public class Main {
public static void main(String[] args) {
SimpleEventPublisher publisher = new SimpleEventPublisher();
// Register handlers
publisher.subscribe(OrderPlacedEvent.class, new OrderEmailNotifier());
publisher.subscribe(OrderPlacedEvent.class, new InventoryUpdater());
// Create use case with publisher dependency
PlaceOrderUseCase placeOrderUseCase = new PlaceOrderUseCase(publisher);
// Execute use case, which publishes the event
placeOrderUseCase.execute("Laptop, Quantity: 1");
placeOrderUseCase.execute("Keyboard, Quantity: 2");
}
}त्वरित जाँच: डोमेन इवेंट
डोमेन इवेंट को क्लीन आर्किटेक्चर में जोड़ते समय, उपयोग मामलों द्वारा अन्य सेवाओं को सीधे बुलाने के बजाय इवेंट प्रकाशित करने का मुख्य लाभ क्या है?
पुनरावलोकन: इवेंट-आधारित क्लीन आर्किटेक्चर
इस पाठ में हमने इवेंट-आधारित क्लीन आर्किटेक्चर का अध्ययन किया। आपने सीखा:
- डोमेन इवेंट महत्वपूर्ण घटनाओं को दर्शाने वाले अपरिवर्तनीय तथ्य होते हैं।
- वे अलगाव संभव बनाते हैं, जिससे उपयोग मामले अपने ग्राहकों को जाने बिना इवेंट प्रकाशित कर सकते हैं।
- इवेंट प्रकाशक इवेंट को इवेंट हैंडलर तक पहुँचाने में मध्यस्थ की भूमिका निभाते हैं।
- यह प्रतिरूप विस्तार-क्षमता और विस्तारयोग्यता का समर्थन करता है, जिससे निर्भरता नियम का पालन करते हुए प्रणालियों को विकसित करना आसान होता है।
डोमेन इवेंट का लाभ उठाकर आपका क्लीन आर्किटेक्चर और भी मजबूत तथा अनुकूलनशील बन सकता है।
एआई शिक्षक के साथ व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 12
- पाठ
- 48
अक्सर पूछे जाने वाले प्रश्न
क्या “इवेंट-आधारित क्लीन आर्किटेक्चर” पाठ निःशुल्क है?
हाँ—“इवेंट-आधारित क्लीन आर्किटेक्चर” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“इवेंट-आधारित क्लीन आर्किटेक्चर” में मैं क्या सीखूँगा?
युग्मन को कम करने और विस्तार-क्षमता बढ़ाने के लिए डोमेन इवेंट का उपयोग करते हुए इवेंट-आधारित पैटर्न को क्लीन आर्किटेक्चर में एकीकृत करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“इवेंट-आधारित क्लीन आर्किटेक्चर” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर व्यवहार में क्लीन आर्किटेक्चर और डिज़ाइन पैटर्न पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- क्रॉस-कटिंग चिंताओं को संभालना
- इवेंट-आधारित क्लीन आर्किटेक्चर
- माइक्रोसर्विस में क्लीन आर्किटेक्चर
- साफ़-सुथरे आर्किटेक्चर में CQRS