DataConnector and DataConnectorFactory traits. This guide covers the architecture, trait requirements, and implementation patterns.
Architecture Overview
Spice.ai uses a plugin-based architecture for data connectors built on three key components:- DataConnectorFactory: Creates connector instances with configuration
- DataConnector: Provides data access through DataFusion TableProvider
- Registration: Automatic discovery via linkme-based plugin system
DataConnectorFactory Trait
Required Methods
Parameter Specification
ParameterType::Connector: Prefixed with connector prefix (e.g.,pg_host→host)ParameterType::Runtime: No prefix, used by runtime systems
DataConnector Trait
Core Interface
Implementation Example: File Connector
Factory Implementation
Connector Implementation
Registration with Linkme
Theregister_data_connector! macro automatically registers your connector:
How Registration Works
- Macro Expansion: Creates constructor function and static registration
- Link-Time Collection: linkme collects all registrations into distributed slice
- Runtime Discovery:
register_all()iterates slice and registers factories
Error Handling
Use structured errors with SNAFU:Advanced Features
Change Data Capture (CDC)
Implement CDC streaming for real-time updates:File Watching
Trigger refreshes on file changes:Connection Pooling
Always use connection pools for database connectors:Best Practices
DO:
- ✅ Use connection pooling for all database connectors
- ✅ Use SNAFU for error handling with context
- ✅ Validate parameters in factory’s
create()method - ✅ Use
tracing::macros for logging - ✅ Implement connection retries with exponential backoff
- ✅ Use
spawn_blockingfor blocking I/O operations - ✅ Support zero-copy operations with Arrow arrays
- ✅ Add comprehensive parameter documentation
DON’T:
- ❌ Use
.unwrap()or.expect()in production code - ❌ Use
log::macros (usetracing::instead) - ❌ Block async runtime with synchronous operations
- ❌ Create new connections on every request
- ❌ Use
assert!()for error handling - ❌ Copy Arrow data unnecessarily
- ❌ Hold locks across
.awaitpoints - ❌ Add newlines in log messages
Testing
Create integration tests intest/spicepods/:
Feature Flags
Gate heavy dependencies behind feature flags: Cargo.toml:Next Steps
- Building Catalog Connectors - Federated SQL queries
- Building Secret Stores - Secure credential management
- Data Connector Reference - API docs