feat: uni-architecture redesign Squashed 20 commits (uni-architecture redesign + A2A Gateway port + JDK21 build fixes + spotless/checkstyle cleanup). Includes: - uni-architecture redesign with unified connector/runtime pipeline - A2A Gateway runtime ported from master - JDK 21 build baseline, Gradle build fixes (jdbc antlr, examples module) - repo-wide spotless + full checkstyleMain/checkstyleTest cleanup (BUILD SUCCESSFUL on JDK 21) - README & architecture diagram refresh
đĻ Documentation | đ Examples | âī¸ Roadmap | đ įŽäŊ䏿
Apache EventMesh is a new generation serverless event middleware for building distributed event-driven applications.
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.
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
publish, subscribe, unsubscribe); no heavyweight client, no vendor lock-in.Extensibility & ecosystem
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.
Use the following command line to download the latest version of EventMesh:
sudo docker pull apache/eventmesh:latest
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 exposes8083for its optional admin port.
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!" } }
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" }
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. TheCloudEventsClientJava SDK wraps all of these (subscribe/subscribeSse/subscribeWs); see the CloudEvents client guide.
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" }
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.
Apache EventMesh enriches the CNCF Cloud Native Landscape.
Apache EventMesh is licensed under the Apache License, Version 2.0.
| 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
| 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 |