EventMesh

Introduction: EventMesh is a dynamic cloud-native eventing infrastruture used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks.
More: Author   ReportBugs   
Tags:




CI status CodeCov Code Scanning

License GitHub Release Slack Status

📦 Documentation | 📔 Examples | ⚙️ Roadmap | 🌐 简体中文

Apache EventMesh is a new generation serverless event middleware for building distributed event-driven applications.

EventMesh Architecture

EventMesh Architecture

EventMesh adopts a unified CloudEvents-over-MQ architecture. The message queue (MQ) acts as a pure write-ahead log (WAL) for durable storage only — there are no consumer groups, no tags, and no broker-side subscription semantics. Instead, the stateless EventMesh Runtime owns all delivery logic: its SubscriptionManager maintains the subscription registry and offset tracking, and dispatches events with load-balance, broadcast, and multicast semantics. Applications interact through a lightweight HTTP + CloudEvents 1.0 SDK (publish / subscribe / unsubscribe), while integration with external systems runs in a standalone Connector Runtime via the connector SPI.

Features

Apache EventMesh is packed with features that help users build event-driven applications with ease. Here are the highlights that set EventMesh apart:

Core architecture

  • CloudEvents-native, end to end — built entirely around the CloudEvents 1.0 specification, so events stay vendor-neutral and portable.
  • Lightweight, language-agnostic SDK — just three operations over plain HTTP (publish, subscribe, unsubscribe); no heavyweight client, no vendor lock-in.
  • Runtime-owned subscription & dispatch — subscription state and delivery semantics (load-balance / broadcast / multicast) are managed by EventMesh itself, not the underlying MQ, giving you consistent behavior across any storage backend.
  • MQ as a pure write-ahead log (WAL) — append-only, no consumer groups, no tags; the broker is reduced to durable storage, dramatically simplifying operations.
  • Guaranteed at-least-once delivery — EventMesh owns reliability through self-managed offsets and explicit ACK.
  • Multiple delivery transports — subscribers choose HTTP long-polling, Server-Sent Events (SSE), or WebSocket push, with request-reply support.
  • Effortless horizontal scaling — stateless Runtime instances scale out seamlessly with no rebalancing cost.

Extensibility & ecosystem

  • Agent-to-Agent (A2A) collaboration — a built-in A2A protocol turns EventMesh into an agent collaboration bus, bridging synchronous MCP / JSON-RPC 2.0 tool calls and asynchronous event-driven pub/sub for LLM and multi-agent systems.
  • Pluggable storage layerApache RocketMQ, Apache Kafka, Apache Pulsar, RabbitMQ, Redis, and more.
  • Pluggable interconnector layerconnectors run as standalone processes acting as the source or sink of SaaS, CloudService, Database, etc.
  • Pluggable meta serviceConsul, Nacos, ETCD, and Zookeeper.
  • Event schema management via catalog service.
  • Powerful event orchestration through the Serverless workflow engine.
  • Powerful event filtering and transformation.

Subprojects

Quick start

This section of the guide will show you the steps to deploy EventMesh from Local, Docker, K8s.

This section guides the launch of EventMesh according to the default configuration, if you need more detailed EventMesh deployment steps, please visit the EventMesh official document.

1. Pull EventMesh Image

Use the following command line to download the latest version of EventMesh:

sudo docker pull apache/eventmesh:latest

2. Run EventMesh Runtime

Use the following command to start the EventMesh container:

sudo docker run -d --name eventmesh -p 8080:8080 -p 8081:8081 -p 8082:8082 -t apache/eventmesh:latest

Ports: 8080 = traffic HTTP (/events/* CloudEvents API), 8081 = admin HTTP (/admin/*), 8082 = WebSocket push (opt-in). The connector runtime image exposes 8083 for its optional admin port.

3. Publishing a CloudEvent

Applications talk to EventMesh over the /events/* HTTP endpoints using standard CloudEvents 1.0. Publish an event with an HTTP POST (202 Accepted means the event was written to the WAL):

POST /events/publish HTTP/1.1
Host: localhost:8080
Content-Type: application/cloudevents+json

{
  "specversion": "1.0",
  "id": "89010a5a-3c6f-4a1e-9b2d-0f7c1f2e3a4b",
  "source": "/example/producer",
  "type": "com.example.order.created",
  "subject": "orders",
  "datacontenttype": "application/json",
  "data": {
    "content": "Hello, EventMesh!"
  }
}

4. Subscribing to a Topic

Subscriptions are registered with EventMesh (there are no consumer groups or tags). Provide a clientId, the topic, and a distribution mode (LOAD_BALANCE, BROADCAST, MULTICAST, or LOAD_BALANCE_STICKY). The response returns a subscriptionId:

POST /events/subscribe HTTP/1.1
Host: localhost:8080
Content-Type: application/json

{
  "clientId": "order-svc",
  "topic": "orders",
  "mode": "LOAD_BALANCE"
}

5. Receiving Events

Subscribers can receive dispatched events through three transports. Pick whichever fits your workload — all of them deliver the same CloudEvents and honor EventMesh's ACK / at-least-once semantics.

a) HTTP Long-Polling — pull events; the request blocks until events arrive or the timeout elapses:

GET /events/poll?clientId=order-svc&topics=orders&timeout=30000 HTTP/1.1
Host: localhost:8080

After processing the delivered events, acknowledge them so the offset advances (at-least-once delivery):

POST /events/ack HTTP/1.1
Host: localhost:8080
Content-Type: application/json

{
  "subId": "sub-123",
  "clientId": "order-svc",
  "topic": "orders",
  "partition": 0,
  "offset": 42
}

b) Server-Sent Events (SSE) — server push over a long-lived HTTP connection; the client does not poll:

GET /events/stream?clientId=order-svc&topics=orders HTTP/1.1
Host: localhost:8080
Accept: text/event-stream

c) WebSocket — full-duplex server push over a dedicated WebSocket port:

GET /events/stream HTTP/1.1
Host: localhost:8082
Upgrade: websocket
Connection: Upgrade

Long-polling, SSE, and WebSocket are interchangeable delivery transports — a subscriber chooses one. SSE and WebSocket are pushed by the server (no polling loop), while long-polling is client-driven. Request-reply (POST /events/request + POST /events/reply) is also supported. The CloudEventsClient Java SDK wraps all of these (subscribe / subscribeSse / subscribeWs); see the CloudEvents client guide.

6. Unsubscribing

When you no longer need to receive events for a topic, unsubscribe by clientId (optionally with the subscriptionId):

POST /events/unsubscribe HTTP/1.1
Host: localhost:8080
Content-Type: application/json

{
  "clientId": "order-svc",
  "topic": "orders"
}

Contributing

GitHub repo Good Issues for newbies GitHub Help Wanted issues GitHub Help Wanted PRs GitHub repo Issues

Each contributor has played an important role in promoting the robust development of Apache EventMesh. We sincerely appreciate all contributors who have contributed code and documents.

CNCF Landscape

Apache EventMesh enriches the CNCF Cloud Native Landscape.

License

Apache EventMesh is licensed under the Apache License, Version 2.0.

Community

WeChat Assistant WeChat Public Account Slack
Join Slack Chat(Please open an issue if this link is expired)

Bi-weekly meeting : #Tencent meeting : 346-6926-0133

Bi-weekly meeting record : bilibili

Mailing List

Name Description Subscribe Unsubscribe Archive
Users User discussion Subscribe Unsubscribe Mail Archives
Development Development discussion (Design Documents, Issues, etc.) Subscribe Unsubscribe Mail Archives
Commits Commits to related repositories Subscribe Unsubscribe Mail Archives
Issues Issues or PRs comments and reviews Subscribe Unsubscribe Mail Archives
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools
AI Daily Digest