Marketplaces & booking
Auction bidding - the clock is part of the system
ordering, proxy bids, soft close
What this board gets wrong on purpose
The tension
Soft close is the fix for sniping and it is drawn here as one, but it is honestly unresolved in two directions. It makes the end time unbounded: two determined bidders can extend a lot for hours, the close job is re-armed every time, and a seller who advertised a 20:00 finish has no contractual end. And it only works if the losing bidder learns they were outbid in time to respond, which means the extension window has to be longer than the outbid notification path - a queue, an email provider and a human reading a phone. That path is minutes at p99 and the window is two minutes, so for most bidders the extension changes nothing and only the programs benefit, which is the opposite of what soft close is for. Underneath both sits the single-writer lot row: every bid on a contested lot in the last ten seconds serialises behind one SELECT ... FOR UPDATE, and there is no way to shard a row that is, definitionally, the thing everybody is fighting over.
1 · Requirements
An auction is a sequence, not a set. Almost every requirement below is really a requirement about ordering or about time.
Ask these before designing
- Proxy bidding or literal bidding? Proxy - where a bidder enters a maximum and the system bids up on their behalf - is what customers expect and it means the stored state is not the price. That changes the schema and the whole concurrency story.
- Is sniping to be prevented, penalised or accepted? eBay accepts it. Most European auction houses use soft close. A sealed-bid or Vickrey format removes it entirely and is a different product.
- Who is the authority on time? If the close is 20:00:00, is that our clock, the seller’s local time, or an NTP-disciplined reference? A dispute over a bid placed at 19:59:59.8 is decided by this answer.
- Can a bid be retracted? Legally, sometimes. Retraction in a totally ordered sequence means tombstones rather than deletes.
- Is the reserve price visible? An invisible reserve means "not met" has to be shown without leaking the number, which constrains the read model.
- What is the increment schedule? Fixed, percentage, or banded by price. It is the core of proxy resolution and it is a business rule that changes.
Functional
- Place a bid with a maximum; resolve it against the current high maximum using the increment schedule.
- Maintain a totally ordered, append-only bid history that can settle a dispute.
- Notify a bidder when they are outbid.
- Close a lot at a defined time, declare a winner, and extend the close when a late bid arrives (soft close).
- Push live price changes to everybody watching.
Non-functional
- Bids on one lot are totally ordered, and the order does not depend on which application server received them.
- Bid p99 under 300 ms, including the lock wait, at 4 bids/s on a single contested lot.
- A bid is never silently lost. If it cannot be ordered, it must be refused with an error the bidder sees - an accepted-then-dropped bid is a legal problem, not a reliability metric.
- Close fires within 1 s of the scheduled time, at up to 125 closes/s during the daily close cluster.
- Read 99.99%, bid 99.95%, both failing closed on the write side.
Explicitly out of scope
Listing creation and catalogue search, seller payouts, shipping, fraud and shill-bidding detection (which is a real and much larger system), dispute resolution workflow.
The rest of this board
Available on Tier Slate
This page publishes the question. The answer — 5 more written pages, an 8-step narrated walkthrough and a 5-table schema — is the board itself, and it opens in Tierslate.
- 5written pages
- 8walkthrough steps
- 5tables32 columns
5 pages behind this one
- Capacity estimation
- Storage estimation
- Availability
- How it works
- Deployment plan
More boards
Two-sided systems where inventory must not be sold twice.