Build1 distinct publisher3 min readPublished
Two new SageMaker Feature Store APIs retire a per-record call loop and a tier where lost identifiers meant lost data. The batch write asks you to reconcile partial failures yourself, and the entry cap still sets a request floor.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Start with the conditional write, because that is the part the batch call does not change. PutRecord carries an EventTime, and the record becomes the latest version in the online store only if that EventTime beats what is already stored [6]. A record that loses the comparison is not dropped; it is written as a historical version to the offline store, for feature groups that have offline storage [7]. BatchWriteRecord preserves that same comparison per entry [3]. The write work per record is therefore identical. What goes away is one request and one connection setup per record, which is where the N x M pattern was spending its tail latency [8].
The saving is worth quantifying, since AWS supplies the inputs. Its example pipeline needs 50,000 calls a second [9], which is a thorough way to discover where your account's throttling limits sit. Divide that by the 25-entry ceiling and the floor is 2,000 requests a second [10]. The full 25-fold reduction only holds if every request is packed, and a single request can span feature groups [14], so the packing is at least achievable: five groups, five records each, one call. Real arrival rates are less obliging. A window that waits to fill 25 slots adds delay to the freshest feature, which is the feature the online store exists to serve. For that 2,000 to transfer to your pipeline, records have to arrive in groups of about 25 inside whatever staleness budget your model tolerates.
The failure surface changes shape as well. Each entry succeeds or fails on its own [11]. The response returns only the failures, split between Errors, which come back with the original record attached, and UnprocessedEntries, which are retriable; anything named in neither list succeeded [12]. Silence means success, so the client has to parse the body rather than check a status code, and AWS's guidance is to retry only the failed records with exponential backoff [13].
ListRecords is the smaller API and the larger repair. The In-Memory tier is Redis-backed [4], and it had no offline store to fall back on and no Athena query to run [16]. Identifiers lost to a bug or a failed pipeline took the records with them, permanently [15]. Paginated enumeration of identifiers [4] is precisely the primitive whose absence left that tier one bug away from silent data loss.
One case the ordering description leaves open. A stale-EventTime record aimed at an In-Memory feature group has no offline store to be filed into, because the historical-version path is scoped to feature groups with offline storage and the In-Memory tier has none [19]. The published walkthrough cuts off mid-example, so this may be spelled out elsewhere in the API reference. If you are relying on historical versions to build training sets, that is a reason to keep Standard tier groups in the picture regardless.
Ranked by verification strength, evidence, and original report placement.
Amazon SageMaker Feature Store is a fully managed repository to store, share and manage ML features, providing low-latency online serving for real-time inference, an offline store for historical retention and training data, and support for streaming and batch ingestion.
AWS announced two new APIs for Amazon SageMaker Feature Store: BatchWriteRecord and ListRecords.
BatchWriteRecord writes up to 25 records across multiple feature groups in a single API call, with partial-success semantics, per-record time-to-live (TTL) control, and the same EventTime-based ordering guarantees as PutRecord.
ListRecords enumerates record identifiers within a feature group using pagination, and works with both the Standard (Amazon DynamoDB-backed) and In-Memory (Redis-backed) storage tiers.
The existing PutRecord API writes one record to one feature group per call, so teams running high-throughput feature pipelines must call it in a loop, one API call per record per feature group, creating connection overhead and poor throughput.
Each PutRecord call performs a conditional write: the record is persisted as the latest version only if the EventTime included in the request is newer than the existing record.
Distinct publishers with included, body-backed reporting in this cluster.
1 article · August 28, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
S3 to Lambda is async and at-least-once: the 3% that vanished after eight quiet months1 distinct publisher
build
Jumio's sub-100ms feature store is mostly a consistency build, not a speed build1 distinct publisher
build
AWS's own agent fleet guidance puts the lock-in in state, auth and telemetry, not the framework1 distinct publisher
build
Four agents, five stages, one manifest row: AWS's migration pipeline is a handoff problem1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Authoritative on semantics, silent on results
AWS is the only party that can definitively describe its own API contract, and on that it is precise: entry cap, failure-only response shape, TTL precedence, per-feature-group authorization, SDK floor. The weakness is everything adjacent to the claim that this fixes throughput — not one measured number, and no second publisher to test it.
Announced, not yet used by anyone on record
What exists is availability: two APIs, sample code, and a client-library floor of Boto3 latest or SageMaker Python SDK 3.8.0. What does not exist anywhere in this reporting is a user — no design partner, no migrated pipeline, no throughput figure from a real workload. Take the score as shelf presence, not traction.
Fix asserted, arithmetic left to you
Mildly overstated, and mostly by omission. 'Tackles the throughput limits of single-record ingestion' is doing work no benchmark backs; the honest version is that 25 entries per request divides AWS's own 50,000-calls-per-second example down to 2,000, which is a real improvement and also a floor nobody names. Credit where due — AWS states the cap, the lack of rollback and the permanent unrecoverability it had been shipping, none of which flatters the product.
Vendor announcing vendor, unchallenged
AWS is describing paid capability on its own channel, and the framing runs from problem to product with no alternative considered — a team hitting these limits might otherwise reach for a self-hosted or third-party feature store, which goes unmentioned. That the post volunteers the 25-entry ceiling and the old In-Memory recoverability gap keeps this short of pure marketing, but no independent voice appears anywhere in this reporting.
Trust the contract, hold the payoff
Confident about what the APIs do: a vendor rarely misstates its own limits and error shapes, and these are stated plainly. Much less confident about what changes in production — throughput gains, retry-handler cost, ListRecords behaviour over large feature groups and the In-Memory stale-write edge all await someone who is not AWS.