Things to learn:
- Horizontal scalability and auto-scaling.
- Queue-centric workflow pattern.
- Eventual consistency.
- Database sharding.
- NoSQL databases.
- Network latency and it's impact to perforamnce.
- CDN.
- Continuous integration and continuous deployment.
I recommend you the "Cloud Architecture Patterns: Using Microsoft Azure" book http://www.amazon.com/Cloud-Architecture-Patterns-Using-Microsoft/dp/1449319777
Modifications you may need to do in your application:
- Make application node stateless: no session has to be kept in you app. Take a look at Spring Session http://projects.spring.io/spring-session/. It can use Redis as a session store. Another option is to use sticky sessions but this approach reduces scalability.
- Since your application node is stateless and can be removed due to scaling in activities at any time you cannot use the hard drive for images (other files) uploaded by users. You may need to use external file storage such as S3 http://aws.amazon.com/s3/.
- Your database has to be on a separate node.
- You need to use centralized cache since local cache will not be invalidated when changes occur on other nodes which can lead to data inconsistencies. Take a look at Amazon ElastiCache http://aws.amazon.com/elasticache/ or Hazelcast http://hazelcast.com/
- If you use Java synchronization mechanisms such as synchronized block or Lock to control concurrency now you have to keep in mind that you need to synchronize between multiple nodes. You may need to use distributed lock service (Terracotta or Hazelcast)
- You need good migration and rollback plans.