\n\n\n\n Ich habe großflächig ereignisgesteuerte Agenten in der Cloud bereitgestellt. - AgntUp \n

Ich habe großflächig ereignisgesteuerte Agenten in der Cloud bereitgestellt.

📖 13 min read2,444 wordsUpdated Mar 29, 2026

Hallo zusammen, Maya hier, zurück auf agntup.com! Heute möchte ich über etwas sprechen, das mich in letzter Zeit sehr beschäftigt, besonders nach einer besonders stressigen Woche, in der ich das Agentensystem eines neuen Kunden eingerichtet habe. Wir tauchen ein in die Welt des Agenten-Deployments, aber nicht irgendein Deployment. Wir sprechen darüber, ereignisgesteuerte Agenten in großem Maßstab in der Cloud bereitzustellen.

Wenn Sie jemals dieses mulmige Gefühl im Magen verspürt haben, wenn ein Kunde sagt: „Wir müssen 10.000 Anfragen pro Sekunde verarbeiten, und jede benötigt für einige Sekunden eine dedizierte Agenteninstanz“, dann wissen Sie, von welcher Art existenzieller Angst ich spreche. Es geht nicht nur darum, einen Agenten zum Laufen zu bringen; es geht darum, Hunderte, Tausende oder sogar Millionen von ihnen zum Laufen zu bringen, sie ihre Aufgaben erledigen zu lassen und dann elegant zu verschwinden, ohne Ihr Budget oder Ihre psychische Gesundheit zu gefährden.

Ich erinnere mich an meinen ersten Versuch, Agenten vor einigen Jahren bereitzustellen. Es war eine einfache Flask-Anwendung, die dafür gedacht war, öffentliche Daten zu extrahieren. Ich dachte mir: „Docker-Container, super einfach!“ Und das war es auch, für ein paar Instanzen. Dann wollte der Kunde 500 verschiedene Quellen gleichzeitig überwachen, wobei jede ihren eigenen Extraktionsagenten benötigte. Meine wunderschöne Docker-Compose-Datei verwandelte sich in ein Frankenstein-Monster aus Shell-Skripten und manuellen Neustarts. Dort habe ich gelernt, dass „einen Agenten bereitstellen“ und „Agenten in großem Maßstab bereitstellen“ zwei ganz verschiedene Dinge sind. Und wenn Sie „ereignisgesteuert“ in die Mischung einfügen, wird es wirklich interessant.

Das Paradigma der Ereignisgesteuerten Agenten: Warum es wichtig ist

Bevor wir in die Details des Deployments eintauchen, lassen Sie uns schnell definieren, was ich unter ereignisgesteuerten Agenten verstehe. Stellen Sie sich einen Agenten vor, der nicht einfach nur darauf wartet, dass eine geplante Aufgabe ausgeführt wird. Stattdessen wird er spezifisch aktiv, wenn ein Ereignis eintritt. Das könnte sein:

  • Eine Nachricht, die in einer Warteschlange landet (z. B. „Verarbeiten Sie diese neue Benutzeranmeldung“).
  • Eine Datei, die in einem S3-Bucket erscheint (z. B. „Analysieren Sie dieses neu hochgeladene Dokument“).
  • Ein API-Webhook, der ausgelöst wird (z. B. „Antworten Sie auf diese Kunden-Chat-Anfrage“).

Der Lebenszyklus des Agenten ist direkt mit diesem Ereignis verbunden. Er verarbeitet das Ereignis, führt seine Aktion aus und stoppt dann idealerweise oder wird für das nächste Ereignis verfügbar. Dieses Modell ist unglaublich leistungsstark für Effizienz und Kosten-Nutzen-Verhältnis, insbesondere in der Cloud. Sie zahlen nur für die Rechenressourcen, wenn ein Ereignis einen Agenten auslöst.

Im Gegensatz dazu steht die alte Methode: persistente Agenten, die ständig laufen und Ressourcen verbrauchen, selbst wenn sie inaktiv sind. Für viele moderne Anwendungsfälle, insbesondere solche mit sprunghaftem Verkehr oder unvorhersehbaren Arbeitslasten, stellt der ereignisgesteuerte Ansatz einen signifikanten Wandel dar. Mein Kunde letzte Woche benötigte Agenten, um eingehende Finanztransaktionen zu verarbeiten – jede Transaktion war ein Ereignis, und jede benötigte ihre eigene isolierte Umgebung aus Sicherheits- und Leistungsgründen. Persistente Agenten wären ein Albtraum gewesen, um sie zu verwalten, und unglaublich kostspielig.

Wählen Sie Ihr Cloud-Schlachtfeld: Serverlos vs. Container

Wenn es darum geht, ereignisgesteuerte Agenten in großem Maßstab in der Cloud bereitzustellen, reduziert sich Ihre Hauptentscheidung oft auf zwei Schwergewichte: serverlose Funktionen (wie AWS Lambda, Azure Functions, Google Cloud Functions) oder Container-Orchestrierungsplattformen (wie Kubernetes, AWS ECS/EKS, Azure AKS, Google GKE).

Serverlose Funktionen: Der Traum „Lassen Sie einfach meinen Code laufen“

Serverlose Funktionen sind oft das Erste, woran die Leute denken, wenn es um ereignisgesteuerte Arbeitslasten geht, und das aus gutem Grund. Sie sind explizit für dieses Modell konzipiert:

  • Automatische Skalierung: Sie passen sich automatisch von null auf Tausende gleichzeitige Ausführungen basierend auf eingehenden Ereignissen an. Sie verwalten keine Server.
  • Bezahlen pro Ausführung: Sie zahlen buchstäblich für die Rechenzeit, in der Ihr Code ausgeführt wird, oft auf die Millisekunde genau.
  • Native Integrationen: Sie integrieren sich problemlos mit einer Vielzahl von Cloud-Diensten (Warteschlangen, Datenbanken, Speicher, API-Gateways) als Ereignisquellen.

Wann man es verwenden sollte: Wenn Ihr Agent eine relativ kurze Lebensdauer hat (Sekunden bis Minuten), zustandslos ist (oder seinen Zustand leicht extern speichern kann) und innerhalb der Speicher-/CPU-Beschränkungen einer Funktion liegt, ist serverlos oft Ihre kostengünstigste und wartungsärmste Option. Denken Sie an Bildverarbeitung, Datenumwandlung, einfache API-Antworten oder das Versenden von Benachrichtigungen.

Meine Erfahrung: Für einen kleinen internen Agenten, den ich gebaut habe, um mich zu benachrichtigen, wenn ein neuer Blogbeitrag auf bestimmten Seiten veröffentlicht wurde (Ereignis RSS-Feed -> Lambda -> Slack), war Lambda perfekt. Ich habe eine Stunde gebraucht, um ihn einzurichten, und es kostet mich nur ein paar Cent pro Monat. Keine Infrastrukturkopfschmerzen.

Praktisches Beispiel: AWS Lambda ausgelöst durch SQS

Stellen Sie sich vor, Sie haben einen in Python geschriebenen Agenten, der Nachrichten aus einer SQS-Warteschlange verarbeitet. Jede Nachricht stellt eine Aufgabe dar. Hier ist eine vereinfachte Ansicht:


# agent.py
import json
import os

def handler(event, context):
 """
 AWS Lambda-Handler für SQS-Ereignisse.
 Jeder Datensatz im Ereignis ist eine SQS-Nachricht.
 """
 print(f"Empfangen {len(event['Records'])} Nachrichten.")

 for record in event['Records']:
 message_body = json.loads(record['body'])
 task_id = message_body.get('task_id', 'N/A')
 data = message_body.get('data', {})

 print(f"Verarbeitung von task_id: {task_id}, Daten: {data}")

 try:
 # --- Die Hauptlogik Ihres Agenten kommt hier ---
 # Zum Beispiel, einen externen API-Aufruf tätigen,
 # eine Berechnung durchführen, eine Datenbank aktualisieren.
 result = f"Aufgabe {task_id} erfolgreich verarbeitet"
 print(result)
 # --- Ende der Hauptlogik des Agenten ---

 except Exception as e:
 print(f"Fehler bei der Verarbeitung der Aufgabe {task_id}: {e}")
 # Je nach Ihrer Fehlerbehandlung könnten Sie erneut versuchen
 # um die SQS-Wiederaufnahmepolitik auszulösen oder einfach protokollieren und fortfahren.

 return {
 'statusCode': 200,
 'body': json.dumps('Nachrichten erfolgreich verarbeitet!')
 }

Das Deployment umfasst das Packen dieses Codes, das Konfigurieren einer AWS Lambda-Funktion und das Einrichten einer SQS-Warteschlange als Auslöser. AWS wird die Anzahl der Lambda-Aufrufe automatisch basierend auf den Nachrichten in der Warteschlange erhöhen.

Container-Orchestrierung: Die Lösung „Mein Agent braucht mehr“

Manchmal reichen serverlose Funktionen einfach nicht aus. Ihr Agent könnte:

  • Längere Ausführungszeiten haben (über die typischen Grenzen serverloser Funktionen hinaus).
  • Signifikanten lokalen Zustand oder komplexe Abhängigkeiten erfordern.
  • Bestimmte Netzwerkkonfigurationen oder den Zugriff auf GPUs benötigen.
  • In einer Sprache oder einem Framework geschrieben sein, das nicht ideal für serverlos ist.
  • Eine veraltete Anwendung sein, die zu komplex ist, um sie in eine Funktion umzuwandeln.

Hier glänzen die Container-Orchestrierungsplattformen. Sie verpacken Ihren Agenten in einen Docker-Container, und die Plattform verwaltet seinen Lebenszyklus, seine Skalierung, sein Netzwerk und seine Resilienz.

Wann man es verwenden sollte: Für komplexere Agenten, die zustandsbehaftet oder ressourcenintensiv sind. Obwohl Sie immer noch eine gewisse Infrastruktur verwalten (den Cluster selbst), können Plattformen wie AWS Fargate (eine serverlose Option für Container) diese Last erheblich reduzieren. Kubernetes bietet unübertroffene Flexibilität und Kontrolle, wenn Sie es benötigen, aber das kommt mit einer steileren Lernkurve.

Meine Erfahrung: Die Agenten zur Verarbeitung von Finanztransaktionen, die ich zuvor erwähnt habe? Wir haben zunächst versucht, sie für Lambda anzupassen, aber sie benötigten spezifische Bibliotheken, die das Lambda-Paket riesig machten, und einige Transaktionen benötigten länger als die 15-minütige Timeout von Lambda. Wir haben sie zu AWS ECS mit Fargate verschoben. Sie als Docker-Container zu verpacken war einfach, und Fargate hat die Skalierung wunderbar basierend auf den Nachrichten in einer SQS-Warteschlange verwaltet. Es war der ideale Kompromiss zwischen Kontrolle und verwalteter Infrastruktur.

Praktisches Beispiel: AWS ECS Fargate mit SQS-Listener

Für einen Agenten, der mehr Ressourcen oder längere Ausführungszeiten benötigt, ist die Ausführung in einem Container auf AWS ECS Fargate eine solide Option. Anstatt dass ein Ereignis den Container direkt auslöst, läuft der Container normalerweise kontinuierlich und fragt eine Ereignisquelle ab (wie eine SQS-Warteschlange).

Zuerst die Dockerfile Ihres Agenten:


# Dockerfile
FROM python:3.9-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY agent_listener.py .

CMD ["python", "agent_listener.py"]

Und Ihr `agent_listener.py`:


# agent_listener.py
import boto3
import json
import time
import os

SQS_QUEUE_URL = os.environ.get('SQS_QUEUE_URL', 'YOUR_SQS_QUEUE_URL')
POLL_INTERVAL_SECONDS = int(os.environ.get('POLL_INTERVAL_SECONDS', '5'))
MAX_MESSAGES = int(os.environ.get('MAX_MESSAGES', '10'))
VISIBILITY_TIMEOUT = int(os.environ.get('VISIBILITY_TIMEOUT', '300')) # 5 Minuten

sqs = boto3.client('sqs')

def process_message(message_body):
 """
 Die Hauptlogik Ihres Agenten zur Verarbeitung einer einzelnen Nachricht.
 """
 task_id = message_body.get('task_id', 'N/A')
 data = message_body.get('data', {})
 print(f"[{time.time()}] Verarbeitung task_id: {task_id}, data: {data}")

 try:
 # Arbeit simulieren
 time.sleep(2)
 if "error_trigger" in data:
 raise ValueError("Simulierte Fehler bei der Verarbeitung")

 result = f"Aufgabe {task_id} erfolgreich verarbeitet"
 print(f"[{time.time()}] {result}")
 return True # Erfolgreiche Verarbeitung anzeigen
 except Exception as e:
 print(f"[{time.time()}] Fehler bei der Verarbeitung der Aufgabe {task_id}: {e}")
 return False # Misserfolg anzeigen

def main():
 print(f"Agent Listener gestartet für die SQS-Warteschlange: {SQS_QUEUE_URL}")
 while True:
 try:
 response = sqs.receive_message(
 QueueUrl=SQS_QUEUE_URL,
 MaxNumberOfMessages=MAX_MESSAGES,
 WaitTimeSeconds=POLL_INTERVAL_SECONDS,
 VisibilityTimeout=VISIBILITY_TIMEOUT
 )

 messages = response.get('Messages', [])
 if not messages:
 print(f"[{time.time()}] Keine Nachrichten in der Warteschlange. Warte...")
 time.sleep(POLL_INTERVAL_SECONDS)
 continue

 print(f"[{time.time()}] {len(messages)} Nachrichten empfangen.")
 for message in messages:
 receipt_handle = message['ReceiptHandle']
 message_body = json.loads(message['body'])

 if process_message(message_body):
 sqs.delete_message(
 QueueUrl=SQS_QUEUE_URL,
 ReceiptHandle=receipt_handle
 )
 print(f"[{time.time()}] Nachricht mit dem Empfangs-Handle gelöscht: {receipt_handle}")
 else:
 # Die Nachricht wird nach dem VisibilityTimeout wieder sichtbar
 print(f"[{time.time()}] Verarbeitung der Nachricht fehlgeschlagen, sie wird wieder in die Warteschlange gestellt: {receipt_handle}")

 except Exception as e:
 print(f"[{time.time()}] Ein Fehler ist in der Hauptschleife aufgetreten: {e}")
 time.sleep(POLL_INTERVAL_SECONDS * 2) # Wartezeit bei Fehlern

if __name__ == "__main__":
 main()

Hier würde Ihr Fargate-Service eine oder mehrere Instanzen dieses Containers ausführen. ECS kann dann die Anzahl der laufenden Aufgaben basierend auf CloudWatch-Metriken anpassen, wie z.B. `ApproximateNumberOfMessagesVisible` in Ihrer SQS-Warteschlange, um sicherzustellen, dass Sie genügend Agenten haben, um den Ereignisfluss zu bewältigen.

Wichtige Überlegungen für den Einsatz von skalierbaren Ereignisagenten

Unabhängig von dem Weg, den Sie wählen, sind einige Prinzipien entscheidend für erfolgreiche und skalierbare Einsätze von Ereignisagenten:

1. Entwerfen Sie für Idempotenz

Ereignisse können mehrfach verarbeitet werden (z.B. aufgrund von Wiederholungsversuchen, Netzwerkproblemen). Ihr Agent sollte in der Lage sein, dasselbe Ereignis mehrfach ohne unerwünschte Nebenwirkungen zu verarbeiten. Wenn ein Agent eine Transaktion verarbeitet, stellen Sie sicher, dass er den Kunden nicht zweimal belastet, wenn das Ereignis erneut verarbeitet wird.

2. Lagern Sie den Zustand aus

Wenn Ihr Agent einen Zustand benötigt, speichern Sie ihn nicht lokal. Verwenden Sie externe Dienste wie Datenbanken (DynamoDB, PostgreSQL), Caches (Redis) oder Objektspeicher (S3). Dies ist entscheidend für horizontale Skalierung und Resilienz. Wenn eine Agenteninstanz ausfällt, kann eine andere dort weitermachen, wo sie aufgehört hat (oder das Ereignis erneut verarbeiten), ohne kritische Daten zu verlieren.

3. Zuverlässiges Fehlermanagement und Dead Letter Queues (DLQs)

Agenten werden scheitern. Netzwerkprobleme, fehlerhaft formatierte Ereignisse oder Bugs können auftreten. Stellen Sie sicher, dass Ihre Ereignisquellen (SQS, SNS, Lambda, Kinesis) mit Dead Letter Queues konfiguriert sind. Dies erfasst Ereignisse, die mehrfach fehlschlagen, sodass Sie sie inspizieren, das zugrunde liegende Problem beheben und sie später erneut verarbeiten können. Ohne DLQ verschwinden fehlgeschlagene Ereignisse im Nichts, was zu Datenverlust oder verpassten Geschäftslogiken führt.

4. Beobachtbarkeit ist nicht verhandelbar

Wenn Sie Tausende von flüchtigen Agenten haben, die hoch- und heruntergefahren werden, wird Protokollierung, Überwachung und Tracing absolut entscheidend. Sie müssen wissen:

  • Wie viele Agenten sind aktiv?
  • Verarbeiten sie die Ereignisse erfolgreich?
  • Wie hoch ist die Latenz zwischen der Eingabe von Ereignissen und dem Abschluss der Verarbeitung?
  • Gibt es Fehler, und welche sind das?

Integrieren Sie sich in Cloud-Protokollierungsdienste (CloudWatch Logs, Azure Monitor Logs, Google Cloud Logging), Performance-Monitoring-Tools und verteilte Tracing-Systeme (AWS X-Ray, OpenTelemetry). Glauben Sie mir, zu versuchen, einen einzigen fehlgeschlagenen Agenten unter 10.000 ohne angemessene Protokolle zu debuggen, ist wie die Suche nach einer Nadel im Heuhaufen, mit verbundenen Augen.

5. Kostenmanagement

Die Schönheit von Ereignisagenten liegt in ihrem Einsparpotenzial. Aber ohne sorgfältige Überwachung können die Kosten schnell steigen. Richten Sie Budgetwarnungen ein, überwachen Sie den Ressourcenverbrauch und überprüfen Sie regelmäßig Ihre Konfigurationen. Sind Ihre Lambda-Funktionen überdimensioniert in Bezug auf den Speicher? Führen Ihre Fargate-Aufgaben zu viele Instanzen aus, wenn der Verkehr gering ist? Die Optimierung dieser Aspekte kann zu erheblichen Einsparungen führen.

Handlungsaufforderungen für Ihren nächsten Agenten-Einsatz

Gut, wir haben viel behandelt. Hier ist die Zusammenfassung und was Sie als Nächstes tun sollten:

  1. Bewerten Sie die Eigenschaften des Agenten: Ist er kurzlebig und zustandslos? Serverlose Funktionen (Lambda, Azure Functions) sind wahrscheinlich die beste Wahl. Ist er langlebig, zustandsbehaftet oder ressourcenintensiv? Dann sind Container auf Fargate/ECS oder Kubernetes Ihre Wahl.
  2. Entwerfen Sie für den Fehlerfall: Gehen Sie davon aus, dass Agenten scheitern werden. Implementieren Sie Idempotenz und richten Sie Dead Letter Queues für Ihre Ereignisquellen ein.
  3. Lagern Sie alles Wichtige aus: Speichern Sie den Zustand nicht in Ihrem Agenten. Verwenden Sie Datenbanken, Caches oder Objektspeicher für die Persistenz.
  4. Priorisieren Sie die Beobachtbarkeit: Richten Sie von Anfang an umfassende Protokollierung, Überwachung und Tracing ein. Sie werden es sich später beim Debugging im großen Stil danken.
  5. Automatisieren Sie den Einsatz: Verwenden Sie Infrastructure as Code (Terraform, CloudFormation, Pulumi), um Ihre Agenten und deren umgebende Infrastruktur zu definieren und bereitzustellen. Manuelle Einsätze sind eine Rezeptur für Inkonsistenzen und Fehler im großen Maßstab.
  6. Fangen Sie klein an, iterieren Sie, überwachen Sie: Versuchen Sie nicht, das perfekte System am ersten Tag zu bauen. Setzen Sie einen minimal funktionsfähigen Agenten ein, überwachen Sie seine Leistung und iterieren Sie basierend auf Daten und realen Anforderungen.

Die Bereitstellung von Ereignisagenten in großem Maßstab ist ein leistungsstarkes Modell, das die Art und Weise, wie Ihre Organisation mit dynamischen Arbeitslasten umgeht, transformieren kann. Es erfordert einen Mentalitätswechsel von persistenten Servern zu flüchtigem und reaktivem Code. Es ist herausfordernd, aber unglaublich lohnend, wenn Sie sehen, wie diese Tausenden von Agenten effizient Aufgaben erledigen und gleichzeitig Ihre Cloud-Rechnung überraschend vernünftig bleibt.

Was sind Ihre Erfahrungen mit Ereignisagenten? Horrorgeschichten oder triumphale Erfolge? Lassen Sie es mich in den Kommentaren unten wissen! Bis zum nächsten Mal, lernen und setzen Sie Ihre Agenten weiterhin ein!

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

Learn more →
Browse Topics: Best Practices | CI/CD | Cloud | Deployment | Migration

Partner Projects

AgntapiAgntzenClawdevBotsec
Scroll to Top