Overview
AsyncEventBus is an asynchronous implementation of the EventBus trait using tokio broadcast channels. Events are processed immediately upon publish with real-time delivery to subscribers.
Location: crates/oneclaw-core/src/event_bus/async_bus.rs:32
Key Differences from DefaultEventBus
| Feature | AsyncEventBus | DefaultEventBus |
|---|---|---|
| Processing | Immediate on publish | Deferred until drain() |
| Concurrency | Multiple async subscribers | Sequential handler execution |
| drain() | No-op (returns 0) | Processes pending queue |
| pending_count() | Always returns 0 | Returns queue length |
| Latency | < 10ms | Depends on drain interval |
| Use case | Real-time event streaming | Batch processing, event loops |
Design
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:1-7
Events are published to a tokio broadcast::Sender. All subscribers receive events concurrently via their own Receiver.
Usage
Basic Example
Creating the Bus
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:42
capacity events, older events are dropped.
Async Channel Subscription
subscribe_channel()
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:60
Get a broadcast receiver for async event consumption. This is the preferred way for consumer apps to receive events.
subscribe_channel() BEFORE boxing the bus as Box<dyn EventBus>.
sender()
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:68
Get a clone of the broadcast sender to create receivers later:
Multiple Concurrent Subscribers
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:362
All receivers receive the same events concurrently:
Real-Time Event Delivery
Low Latency
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:377
Events are delivered with < 10ms latency:
No drain() Required
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:169
Unlike DefaultEventBus, events are processed immediately:
EventBus Trait Compatibility
Pattern-Based Subscription
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:140
Supports the same pattern matching as DefaultEventBus:
Topic Matching
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:78
Event History
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:175
Events are stored in a ring buffer for late-joining subscribers and debugging:
Handler-Generated Events
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:96-108
Handlers can return response events:
Thread Safety
Location:crates/oneclaw-core/src/event_bus/async_bus.rs:32
- sender: Clone-able, thread-safe broadcast sender
- history: Mutex-protected ring buffer
- subscriptions: RwLock for concurrent reads
Use Cases
Real-Time Monitoring
Live Telemetry Streaming
Multi-Subscriber Event Distribution
Performance Considerations
- Broadcast overhead: All receivers get all events (filter in receiver)
- Channel capacity: Set based on max subscriber lag tolerance
- Concurrent receivers: Scales well with multiple async subscribers
- No drain cost: Zero overhead for batch processing loop
When to Use AsyncEventBus
- Real-time event streaming to multiple consumers
- WebSocket/SSE event feeds
- Concurrent async event processing
- Low-latency telemetry distribution
- Consumer apps needing immediate event delivery
When to Use DefaultEventBus
- Batch event processing
- Event loop integration (tick-based)
- Predictable processing in tests
- Sequential handler execution required
Related
- EventBus Trait - Core interface
- DefaultEventBus - Synchronous alternative
- Event Pipelines - Declarative event processing