docs/adr/ADR-0009-contribution-extensibility.md
Accepted
A design goal for Feast is that it should be extensible and easy to use with different technologies (storage, compute, deployment environments). After the launch of Feast 0.10, community interest grew in adding support for new online stores (Dynamo, Redis, Cassandra, HBase) and custom compute engines (Dataflow, Flink).
However, several problems existed:
Introduce a three-tier extensibility architecture: Interfaces, Contrib, and Plugins.
Create abstract base classes for OnlineStore, OfflineStore, and Provider so that different providers can reuse functionality without reimplementing it:
Provider (top-level orchestrator)
├── OnlineStore (abstract)
├── OfflineStore (abstract)
└── Compute (future)
Add a contrib module to the Feast SDK for community-contributed implementations:
feast/
└── contrib/
├── compute/
│ └── spark.py
├── offline_stores/
│ └── postgres.py
├── online_stores/
│ ├── cassandra.py
│ └── hbase.py
└── providers/
└── azure.py
Contrib implementations are referenced by classpath in feature_store.yaml:
online_store:
type: feast.contrib.online_stores.hbase.HbaseOnlineStore
Each contrib module follows a convention: a *Config class for configuration and a *Test class for setup/teardown of test infrastructure (e.g., Docker containers). Contrib code is covered by CI but failures produce warnings only.
External Python packages can be imported and used from within Feast without merging code upstream:
provider:
type: my_company_feast.MyCompanyFeastProvider
The key difference: contrib code is covered by Feast's test suite; external plugins are not.
sdk/python/feast/infra/online_stores/, sdk/python/feast/infra/offline_stores/, sdk/python/feast/infra/contrib/