Skip to content
Blog

Event-Driven Orchestration: Coordinating Agents over Message Buses

Build asynchronous, event-driven multi-agent systems using message buses like Kafka or RabbitMQ with LlamaIndex Workflows.

Published on September 11, 2026

AI Assistant

Synchronous REST or RPC calls between agents create tight coupling. If Agent A calls Agent B synchronously and Agent B takes 20 seconds to process a document, Agent A’s connection thread remains blocked. Furthermore, if Agent B crashes, the entire workflow fails instantly without backpressure or persistent queues.

In enterprise architectures, Event-Driven Agent Orchestration decouples agent communication. Agents communicate asynchronously by publishing and subscribing to typed events on a message bus (Kafka, RabbitMQ, or NATS).

Advantages of Event-Driven Agent Architectures

  1. Decoupled Scalability: Add new specialized worker agents (e.g., fraud detectors, compliance checkers) simply by subscribing them to existing event topics without modifying existing producer code.
  2. Durable Queuing & Backpressure: If an influx of 10,000 document processing requests arrives, message queues buffer events safely while worker agents consume them at maximum sustainable throughput.
  3. Replayable Event Sourcing: Persisted event streams allow developers to replay historical agent event sequences to debug failures or train updated model prompts.
[Trigger Event] --> (Message Bus / Topic: "order.created")
                         |
      +------------------+------------------+
      |                                     |
[Inventory Agent]                     [Fraud Detection Agent]
 (Emits: "inventory.reserved")         (Emits: "fraud.cleared")
      |                                     |
      +------------------+------------------+
                         v
             (Topic: "order.processed")
                         v
                  [Shipping Agent]

Event-Driven Workflows with LlamaIndex

LlamaIndex Workflows provide a event-driven framework where agent steps are triggered by specific Event classes.

import asyncio
from llamaindex.core.workflow import Workflow, Event, StartEvent, StopEvent, step

# 1. Define Strongly Typed Domain Events
class DocumentIngestedEvent(Event):
    doc_id: str
    text_content: str

class EntityExtractedEvent(Event):
    doc_id: str
    entities: list[str]

class CompliancePassedEvent(Event):
    doc_id: str
    status: str

# 2. Construct Event-Driven Workflow Class
class DocumentProcessingWorkflow(Workflow):

    @step
    async def ingest_document(self, ev: StartEvent) -> DocumentIngestedEvent:
        doc_id = ev.get("doc_id")
        raw_text = ev.get("raw_text")
        print(f"[Step 1] Ingested Doc {doc_id}")
        return DocumentIngestedEvent(doc_id=doc_id, text_content=raw_text)

    @step
    async def extract_entities(self, ev: DocumentIngestedEvent) -> EntityExtractedEvent:
        # Agent extracts named entities from text asynchronously
        print(f"[Step 2] Extracting entities for {ev.doc_id}")
        entities = ["ACME Corp", "$50,000 USD", "Contract-2026"]
        return EntityExtractedEvent(doc_id=ev.doc_id, entities=entities)

    @step
    async def verify_compliance(self, ev: EntityExtractedEvent) -> StopEvent:
        # Agent checks extracted entities against policy
        print(f"[Step 3] Compliance check for {ev.doc_id}")
        result = f"Doc {ev.doc_id} APPROVED. Found entities: {', '.join(ev.entities)}"
        return StopEvent(result=result)

Running the Event Workflow

async def main():
    wf = DocumentProcessingWorkflow(timeout=30.0, verbose=True)
    
    # Trigger workflow by sending StartEvent
    result = await wf.run(
        doc_id="DOC-9921",
        raw_text="Enterprise license agreement with ACME Corp for $50,000 USD."
    )
    print("Workflow Final Result:", result)

if __name__ == "__main__":
    asyncio.run(main())

Integrating Message Buses in Production

In distributed cluster setups, wrap each workflow step handler inside a Kafka consumer loop:

  • Consume: Read incoming message from Kafka topic documents.raw.
  • Process: Trigger LlamaIndex Workflow step.
  • Publish: Emit output DocumentIngestedEvent to Kafka topic documents.ingested.

For complete documentation on event handlers, state streaming, and workflow visualization, explore the official LlamaIndex Documentation.