Az Event Driven Architecture (EDA) egy olyan szoftvertervezési minta, amely események előállítása, észlelése és feldolgozása köré szervezi a rendszer működését. Az EDA lényege, hogy a rendszer komponensei eseményeken keresztül kommunikálnak egymással, ami rugalmas és skálázható architektúrát eredményez.
- Esemény-központúság: A rendszer működését események vezérlik, amelyek lehetnek állapotváltozások vagy fontos történések.
- Lazán csatolt komponensek: Az eseményeket előállító és feldolgozó komponensek függetlenek egymástól.
- Aszinkron kommunikáció: Az események feldolgozása aszinkron módon történik, ami javítja a rendszer válaszidejét és skálázhatóságát.
- Valós idejű reagálás: A rendszer képes azonnal reagálni a bekövetkező eseményekre.
- Skálázhatóság: A komponensek függetlensége miatt könnyen bővíthető a rendszer.
- Rugalmasság: Új funkciók könnyen integrálhatók új esemény-előállítók vagy -fogyasztók hozzáadásával.
- Hibatűrés: Az események tárolhatók és később újra feldolgozhatók, ami növeli a rendszer megbízhatóságát.
Az Event Driven Architecture különösen alkalmas olyan rendszerekhez, ahol fontos a valós idejű adatfeldolgozás és a gyors reagálás a változásokra, például IoT alkalmazásokban, pénzügyi rendszerekben vagy e-kereskedelmi platformokon.
A példában egy egyszerű eseménykezelő rendszert fogunk létrehozni, amely demonstrálja az esemény-előállítás, -továbbítás és -feldolgozás folyamatát.
A példa bemutatja az alapvető működést:
- Az
OrderProcessor
feldolgozza a rendelést és létrehoz egy eseményt. - Az
EventDispatcher
továbbítja az eseményt a regisztrált hallgatóknak. - Az
EmailNotifier
ésInventoryManager
reagálnak az eseményre és végrehajtják a megfelelő műveleteket.
Először hozzunk létre egy alapvető Event
osztályt:
<?php
class Event
{
private $name;
private $data;
public function __construct(string $name, array $data = [])
{
$this->name = $name;
$this->data = $data;
}
public function getName(): string
{
return $this->name;
}
public function getData(): array
{
return $this->data;
}
}
Most hozzunk létre egy EventDispatcher
osztályt, amely kezeli az eseményeket és a hozzájuk tartozó hallgatókat:
<?php
class EventDispatcher
{
private $listeners = [];
public function addListener(string $eventName, callable $listener): void
{
$this->listeners[$eventName][] = $listener;
}
public function dispatch(Event $event): void
{
$eventName = $event->getName();
if (isset($this->listeners[$eventName])) {
foreach ($this->listeners[$eventName] as $listener) {
call_user_func($listener, $event);
}
}
}
}
Hozzunk létre egy példa esemény-előállító osztályt:
<?php
class OrderProcessor
{
private $eventDispatcher;
public function __construct(EventDispatcher $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
}
public function processOrder(array $orderData): void
{
// Rendelés feldolgozása...
echo "Rendelés feldolgozva: " . $orderData['id'] . "\n";
// Esemény létrehozása és továbbítása
$event = new Event('order.processed', $orderData);
$this->eventDispatcher->dispatch($event);
}
}
Most hozzunk létre néhány esemény-hallgató osztályt:
<?php
class EmailNotifier
{
public function sendOrderConfirmation(Event $event): void
{
$orderData = $event->getData();
echo "E-mail értesítés küldése a rendelésről: " . $orderData['id'] . "\n";
}
}
class InventoryManager
{
public function updateStock(Event $event): void
{
$orderData = $event->getData();
echo "Készlet frissítése a rendelés alapján: " . $orderData['id'] . "\n";
}
}
Végül, használjuk az elkészített komponenseket:
<?php
// Eseménykezelő létrehozása
$eventDispatcher = new EventDispatcher();
// Hallgatók regisztrálása
$emailNotifier = new EmailNotifier();
$inventoryManager = new InventoryManager();
$eventDispatcher->addListener('order.processed', [$emailNotifier, 'sendOrderConfirmation']);
$eventDispatcher->addListener('order.processed', [$inventoryManager, 'updateStock']);
// Rendelésfeldolgozó létrehozása
$orderProcessor = new OrderProcessor($eventDispatcher);
// Rendelés feldolgozása
$orderData = ['id' => '12345', 'total' => 1000];
$orderProcessor->processOrder($orderData);