Jump to a problem, path or page
Jump to a problem, path or page
Updates as you edit. Run the review to record it; passing every check completes the problem.
Not yet passed: Client responsibility
Add Client and define its responsibility.
Not yet passed: Load balancer responsibility
Add Load balancer and define its responsibility.
Not yet passed: API service responsibility
Add API service and define its responsibility.
Not yet passed: Queue responsibility
Add Queue and define its responsibility.
Not yet passed: Spam worker responsibility
Add Spam worker and define its responsibility.
Not yet passed: Mailbox store responsibility
Add Mailbox store and define its responsibility.
Not yet passed: Object storage responsibility
Add Object storage and define its responsibility.
Not yet passed: Cache responsibility
Add Cache and define its responsibility.
Not yet passed: Search index responsibility
Add Search index and define its responsibility.
Not yet passed: Client → Load balancer
A directed path must connect Client to Load balancer. Arrows represent requests, dependencies, or event flow.
Not yet passed: Load balancer → API service
A directed path must connect Load balancer to API service. Arrows represent requests, dependencies, or event flow.
Not yet passed: API service → Queue
A directed path must connect API service to Queue. Arrows represent requests, dependencies, or event flow.
Not yet passed: Queue → Spam worker
A directed path must connect Queue to Spam worker. Arrows represent requests, dependencies, or event flow.
Not yet passed: Spam worker → Mailbox store
A directed path must connect Spam worker to Mailbox store. Arrows represent requests, dependencies, or event flow.
Not yet passed: Spam worker → Object storage
A directed path must connect Spam worker to Object storage. Arrows represent requests, dependencies, or event flow.
Not yet passed: API service → Cache
A directed path must connect API service to Cache. Arrows represent requests, dependencies, or event flow.
Not yet passed: Cache → Mailbox store
A directed path must connect Cache to Mailbox store. Arrows represent requests, dependencies, or event flow.
Not yet passed: Mailbox store → Search index
A directed path must connect Mailbox store to Search index. Arrows represent requests, dependencies, or event flow.
Not yet passed: What should a device cursor represent?
Not yet passed: Can a message header alone always identify a unique delivery?
Not yet passed: What if a device cursor predates retained changes?
Not yet passed: API and data model notes
Write at least 80 characters describing concrete operations, inputs, outputs, state and errors. This check measures completeness, not semantic correctness.
Not yet passed: Trade-offs and failure cases
Write at least 80 characters about alternatives, failure handling and edge cases. Review the reasoning yourself using the reference discussion.
Rule-based educational feedback. Notes are checked by length only; topology checks confirm directed reachability. These checks do not validate semantics, latency, reliability or every valid design.
Route Client requests through the Load balancer to the API service. Queue inbound deliveries for Spam workers, store immutable bodies in Object storage, and serialize metadata and change sequences in the Mailbox store. Cache reads and update the Search index asynchronously; clients use snapshot-plus-cursor recovery when retained changes expire. The API service validates authenticated ingress identity and bounded message metadata, then appends to the Queue. Spam workers scan the message, stage verified bytes in Object storage and transactionally insert Mailbox store metadata, the deduplication outcome and a change sequence. Clean orphan bodies separately. Client reads pass through the Load balancer and API service. Cache hot mailbox metadata and invalidate it after mutations. Authorize each Object storage fetch independently of its content identity. Flag and folder mutations require the expected message revision. Commit idempotency results and change entries in the same Mailbox store transaction; retain deletion tombstones until dependent sync horizons expire. Feed committed Mailbox store changes to the Search index off the request path. Versioned, idempotent indexing tolerates retries and an unavailable index without blocking message acceptance. The API service pages committed mailbox changes by sequence. For expired cursors, return resetRequired and a pinned snapshot with a watermark and lease. Clients install it, then replay newer revisions before releasing the lease.
There is no single correct diagram. Explain where yours differs and which requirement justifies it.