Functional requirements:
- View hotels and rooms.
- Reserve a hotel room.
- Add/delete/update a hotel room.
- Support overbooking.
Non-functional requirements:
- Support high concurrency.
- Moderate latency (a few seconds for reservation).
Recommendations:
- Choose a relational database for the read-heavy workload and ACID properties.
- Include an idempotency key in the API for making reservations to avoid double booking.
- Use the microservice architecture and use remote procedure calls for inter-service communication.
- Keep a pre-populated room type inventory (for 2 years ahead) to support reservations by room type (instead of by room id).
Concurrency control:
- Pessimistic locking is prone to deadlocks and tends to have bad performance.
- Optimistic locking is usually faster but performance dramatically drops when contention is heavy.
Scaling:
- Shard the database by hotel since most queries need to filter by it.
- Cache inventory information (aggregates) in Redis to reduce database load and improve read performance.
Tip:
- Use the same service to manage reservations and the inventory to avoid data consistency issues that require 2PC or Saga.
"All my Django projects ended up being a big mess".
maxklein, it seems u lack descent programming skills, since my experience with django is completely different. Most of the time the problem is with who codes, not the framework or tool.