The Java Feature Server is a JVM-based implementation of Feast's online feature serving service. It exposes a gRPC API defined in protos/feast/serving/ServingService.proto and provides low-latency retrieval of pre-materialized feature values from online stores. This server is the quay.io/feastdev/feature-server-java Docker image, deployed on Kubernetes via the infra/charts/feast/charts/feature-server Helm subchart.
This document covers the gRPC API contract, request/response message structure, FieldStatus semantics, online store backend implementations (Redis, BigQuery), and the deployment and configuration model. For the Python-based feature server, see page 4.1. For the Go implementation, see page 4.2.
Sources: protos/feast/serving/ServingService.proto1-136 infra/charts/feast/README.md1-82 infra/charts/feast/charts/feature-server/README.md1-68
The Java Feature Server is built on Spring Boot with reactive programming support via Project Reactor. It exposes gRPC endpoints for feature retrieval and is designed to integrate seamlessly with multiple online store backends.
The Java Feature Server is organized into multiple Maven modules under java/:
Maven Module (artifactId) | Directory | Purpose |
|---|---|---|
feast-parent | java/ | Root POM; shared build config, dependency versions |
feast-datatypes | java/datatypes/ | Protobuf-generated Java types from protos/feast/ |
feast-serving | java/serving/ | gRPC ServingService implementation; online store backends |
feast-serving-client | java/serving-client/ | Java client library for calling the server |
coverage | java/coverage/ | JaCoCo aggregated coverage report |
Sources: java/pom.xml30-35
Maven Module Dependency Diagram
Sources: java/pom.xml30-35 protos/feast/serving/ServingService.proto24-27
| Dependency | Version | Role |
|---|---|---|
| gRPC | 1.63.0 | RPC transport for ServingService |
| Protobuf | 3.25.5 | Serialization of Value, RepeatedValue, FeatureVector |
| Project Reactor | 3.4.34 | Reactive, non-blocking I/O for store reads |
| Netty | 4.1.96.Final | Underlying network transport layer |
| Spring Boot | (managed) | Application framework, config loading |
| Jackson | 2.15.0 | JSON processing |
| Guava | 32.0.0-jre | Utilities |
| Lombok | 1.18.24 | Code generation (builders, accessors) |
| Log4j2 | 2.17.1 | Structured logging (JSON or Console) |
Sources: java/pom.xml44-72
The entire serving API is defined in protos/feast/serving/ServingService.proto. The generated Java classes land in the feast.proto.serving package (outer class ServingAPIProto).
| RPC Method | Request | Response | Description |
|---|---|---|---|
GetFeastServingInfo | GetFeastServingInfoRequest | GetFeastServingInfoResponse | Returns the Feast version string of this deployment |
GetOnlineFeatures | GetOnlineFeaturesRequest | GetOnlineFeaturesResponse | Retrieves online feature values for one or more entity rows |
Sources: protos/feast/serving/ServingService.proto28-33
GetOnlineFeaturesRequestFeatures can be requested either by a named FeatureService or by listing individual feature references:
| Field | Type | Description |
|---|---|---|
feature_service | string (oneof) | Name of a registered FeatureService to retrieve |
features | FeatureList (oneof) | Explicit list of "feature_view_name:feature_name" strings |
entities | map<string, RepeatedValue> | Columnar entity data: entity name → list of values |
full_feature_names | bool | If true, response uses "view_name__feature_name" format |
request_context | map<string, RepeatedValue> | Additional context values for OnDemandFeatureView transformations |
Sources: protos/feast/serving/ServingService.proto80-94
GetOnlineFeaturesResponse and FeatureVectorThe response is columnar: a list of FeatureVector entries, one per requested feature, aligned with the feature_names metadata list.
metadata.feature_names — ordered list of feature names returnedresults[i] — FeatureVector for the i-th feature in feature_namesFeatureVector, index j corresponds to entity row j from the requestSources: protos/feast/serving/ServingService.proto96-114
FieldStatus EnumEach value in a FeatureVector.statuses array carries a FieldStatus tag indicating data quality for that (entity, feature) pair.
| Value | Integer | Meaning |
|---|---|---|
INVALID | 0 | Status unset; should not appear in a valid response |
PRESENT | 1 | Feature value found and within the max age window |
NULL_VALUE | 2 | Entity found, but this feature was not assigned a value during ingestion |
NOT_FOUND | 3 | No feature values found for this entity key in the store |
OUTSIDE_MAX_AGE | 4 | Value found but older than the feature view's max_age TTL |
Sources: protos/feast/serving/ServingService.proto116-135
GetOnlineFeaturesRequestV2The proto also defines a legacy GetOnlineFeaturesRequestV2 message (with FeatureReferenceV2 and per-row EntityRow messages) marked with a TODO for removal. Current implementations should use GetOnlineFeaturesRequest.
Sources: protos/feast/serving/ServingService.proto51-73
The Java Feature Server is distributed as a Docker container and deployed via Helm charts on Kubernetes. The primary deployment target is cloud-native environments where it can scale horizontally.
The server is published as a Docker image to Quay.io:
quay.io/feastdev/feature-server-java:0.60.0
This image contains:
application.yaml)Sources: infra/charts/feast/charts/feature-server/values.yaml4-10
Helm Chart Structure:
The feature server is deployed as a subchart within the main Feast Helm chart at infra/charts/feast/charts/feature-server/. The chart creates:
application-override.yaml configurationapplication-secret.yaml for sensitive configSources: infra/charts/feast/README.md1-82 infra/charts/feast/requirements.yaml1-15
The Kubernetes Service exposes the feature server on a ClusterIP by default:
| Parameter | Default Value | Description |
|---|---|---|
service.type | ClusterIP | Kubernetes service type |
service.grpc.port | 6566 | Service port for gRPC requests |
service.grpc.targetPort | 6566 | Container port serving gRPC |
service.grpc.nodePort | (unset) | NodePort if service type is NodePort |
For production deployments, an Ingress resource can be configured to expose the service externally with TLS termination:
Sources: infra/charts/feast/charts/feature-server/values.yaml71-80 infra/charts/feast/charts/feature-server/values.yaml82-122
The Java Feature Server uses a layered configuration system based on Spring Boot's application.yaml mechanism. Configuration can be provided through multiple sources with clear precedence rules.
Configuration Precedence (Lowest to Highest):
application.yaml: Default configuration bundled in the JARapplication-generated.yaml: Generated by Helm from chart valuesapplication-secret.yaml: Sensitive configuration (Kubernetes Secret)application-override.yaml: User-provided overrides (Kubernetes ConfigMap)Sources: infra/charts/feast/charts/feature-server/values.yaml18-32
To configure the feature server to use Redis as the online store:
Sources: infra/charts/feast/README.md33-54
| Configuration Path | Description |
|---|---|
feast.active_store | Name of the active online store configuration |
feast.stores | List of online store configurations |
feast.entityKeySerializationVersion | Entity key serialization version (2 or 3) |
global.registry.path | Path to the Feast registry file |
global.registry.cache_ttl_seconds | Registry cache TTL in seconds |
global.project | Feast project name |
transformationService.host | Host for transformation service |
transformationService.port | Port for transformation service |
The transformation service configuration allows the feature server to delegate on-demand feature transformations to a separate Python service:
Sources: infra/charts/feast/charts/feature-server/values.yaml13-15 infra/charts/feast/README.md76-82
For production deployments, JVM options can be configured to optimize heap size and garbage collection:
Recommended settings:
-Xms and -Xmx to the same value for predictable performance-XX:+UseG1GC) for balanced throughput and latency-XX:MaxGCPauseMillis=200Sources: infra/charts/feast/charts/feature-server/values.yaml34-35
The Java Feature Server integrates with multiple components of the Feast ecosystem to provide end-to-end feature serving capabilities.
The feature server loads feature definitions from the registry, which is managed by the Python SDK. The registry contains:
The registry is cached in-memory with a configurable TTL (cache_ttl_seconds) to minimize latency. The server supports multiple registry backend types:
gs:// URIs)s3:// URIs)Sources: infra/charts/feast/README.md49-52
The Java Feature Server reads pre-materialized feature values from configured online store backends. The store type is set via feast.stores[].type in application.yaml.
Request Processing Flow
Supported Online Store Backends
Store Type (feast.stores[].type) | Notes |
|---|---|
REDIS | Primary production backend; configured via host, port, optional TLS/auth |
BIGTABLE | Google Cloud Bigtable |
CASSANDRA | Apache Cassandra |
Redis is the most common online store for the Java feature server. Configuration example from application.yaml:
The server stores feature values as serialized feast.types.Value protobuf bytes, keyed by a binary-encoded entity key. The entityKeySerializationVersion (2 or 3) must match the version used during materialization by the Python SDK.
The Java feature server also supports BigQuery as a serving backend for batch/historical retrieval scenarios. When configured, the server issues BigQuery read API calls instead of online store lookups. This is typically used for feature retrieval patterns where latency requirements are less strict and data freshness from BigQuery is acceptable.
Sources: infra/charts/feast/README.md33-54 infra/charts/feast/charts/feature-server/values.yaml18-32
For OnDemandFeatureView transformations requiring Python execution, the Java Feature Server delegates to the transformation-service (image: quay.io/feastdev/feature-transformation-server).
Transformation Request Flow
The transformation service host is configured in the feature server values:
In the parent Feast Helm chart, the transformation service deploys as a sibling deployment when transformation-service.enabled: true.
Sources: infra/charts/feast/charts/feature-server/values.yaml13-15 infra/charts/feast/charts/transformation-service/values.yaml1-37 infra/charts/feast/requirements.yaml7-11
The feature server implements Kubernetes health check endpoints for liveness and readiness probes:
| Probe Type | Default Config | Purpose |
|---|---|---|
| Liveness | initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 5 | Determines if the pod should be restarted |
| Readiness | initialDelaySeconds: 15periodSeconds: 10timeoutSeconds: 10 | Determines if the pod can receive traffic |
Both probes check:
Sources: infra/charts/feast/charts/feature-server/values.yaml43-69
Logging output format and level are configurable:
logType: Console: Human-readable format for developmentlogType: JSON: Structured JSON logs for production (ELK/Splunk ingestion)Sources: infra/charts/feast/charts/feature-server/values.yaml37-40
Resource requirements should be configured based on workload characteristics:
Sizing Guidelines:
Sources: infra/charts/feast/charts/feature-server/values.yaml124-125
The Java Feature Server is optimized for low-latency feature serving:
Typical latencies (P99):
Sources: java/pom.xml71-72 java/pom.xml228-232
The Java Feature Server is built using Apache Maven with a multi-module structure:
Build artifacts:
serving/target/feast-serving-{version}.jar - Executable Spring Boot JARserving-client/target/feast-serving-client-{version}.jar - Java client librarydatatypes/target/feast-datatypes-{version}.jar - Protobuf data typesBuild requirements:
Sources: java/pom.xml354-396
Docker images are built as part of the CI/CD pipeline and published to Quay.io:
quay.io/feastdev/feature-server-java:{version}
The image build process:
Sources: infra/charts/feast/charts/feature-server/values.yaml4-10
The version is managed centrally in the parent POM using the ${revision} property:
This version is synchronized with:
The flatten-maven-plugin resolves the ${revision} variable during deployment to Maven Central.
Sources: java/pom.xml37-38 java/pom.xml459-482
| Feature | Java Feature Server | Python Feature Server | Go Feature Server |
|---|---|---|---|
| Runtime | JVM (Java 11+) | CPython 3.10+ | Native Go binary |
| Framework | Spring Boot | FastAPI | Standard library |
| RPC Protocol | gRPC | gRPC + HTTP | gRPC |
| Concurrency | Reactive (Project Reactor) | asyncio | Goroutines |
| Memory Footprint | Medium (JVM overhead) | Low-Medium | Low |
| Startup Time | Slow (JVM warmup) | Fast | Very fast |
| Throughput | High | Medium | Very high |
| Latency P99 | 5-20ms | 10-30ms | 3-15ms |
| Deployment | Kubernetes via Helm | Kubernetes/Docker/Local | Kubernetes/Binary |
| Primary Use Case | Production serving at scale | Development, prototyping | High-performance production |
The Java Feature Server is recommended when:
For maximum performance, consider the Go Feature Server (Go Feature Server). For rapid development and experimentation, use the Python Feature Server (Python Feature Server).
Sources: infra/charts/feast/README.md1-82
Refresh this wiki
This wiki was recently refreshed. Please wait 5 days to refresh again.