Function
Front end / back end
Legal regulation
Business management functionalities
analytics
API exposure
Security and permissions
Authentication
Authorization
Usage
How many users (total, active)
Usage pattern
Read/write ratio
Geographical distribution
Usage time
Session length
State / stateless
User device
Concurrency
Consistency (can user tolerate some inconsistency? - eventual consistency)
Response
Availability
Data security
Durability
Privacy
Management and monitoring
Management
Data purging
Backup & restore
Telemetry - how to gather statistics and performance?
Security
Storage:
Volume (how large the objects are... how many objects...how many users....)
Durability
Consistency
Network bandwidth (concurrency, data amount)
Computing (computation complexity, concurrency)
Memory (memory of each concurrent request & cache)
Only 2 of 3 can be achieved, in the cost of the 3rd
Consistency
Availability
Partition tolerance (meaning able to endure interruption of communication between nodes)
System interface
API
Data model
Model - entities, interaction and relation
Data flow
Data partitioning
High level design
From client to storage
Basic: client -> load balancer -> application servers -> database & file storage
Detailed design
Consider bottlenecks, real world challenges, tradeoffs
Bottlenecks
Single point of failure?
Data durability
Availability
Monitoring & alerting
Separation of roles
Separation of long & short request handlers
Basically separate meta storage (database) & block storage
Client -> Server
REST
Server -> Client
Server-Sent Events (a HTML5 protocol)
Server push (HTTP 2.0), server preemptively pushes artifacts (css, images, etc.) presumably the client will ask
Push notification
Client <-> Server
polling
HTTP long polling
WebSocket
General components
Notification service (like SNS) : topic / subscripton model
Queue service