My current job involve working in decade old product, how can I get a practical experience in developing a highly scalable and distributed applications.
1. Get the book 'Designing Data-Intensive Applications', read the causes of scaling problems, and some techniques to deal with them.<p>2. Take something you've built, and imagine that it faces a specific scaling problem. For example, let's say the most complex thing you've built is a to-do list app. Maybe you can imagine some things that could make it grind to a halt when running as a monolith on a single server. e.g. what if a single user has 10,000 or 100,000 TODOs? Fake that situation (just insert many many fake TODOs into the database). Now see if you've created a scaling problem. If not, try a larger number, or a different dimension (e.g. what if there are many many simultaneous requests?) until you create a problem.<p>3. Look in that book again and pick a couple of ways you could solve the problem (database sharding across multiple servers? caching? pagination in your API calls?) and implement one of them.<p>(If you have difficult at step 2, you could try running your app on a virtual machine with very little RAM and disk, but imagine that's the largest machine type available.)
It's pretty much "paint by number" on AWS.<p>The problem with focusing on "scalable" is that wallets and budgets don't scale infinitely and hosting isn't free.<p>Being able to build stuff that is "scalable" is not enough. You need to be efficient which generally involves "scaling down", ie how much of this data can we be drop because it's useless and no one cares about it?
Here: <a href="https://12factor.net/" rel="nofollow">https://12factor.net/</a> - Some considerations which will not be found in the 12FA:<p>- If you wanna change configuration on the fly, in parallel, your app should support something like Prometheus reload: SIGHUP or <a href="http://<ip>/-/reload" rel="nofollow">http://<ip>/-/reload</a> - rolling updates might be time consuming (you need to separate between boot config and dynamic config)<p>- Add feature flags to your app.<p>- Use proper secrets management from day one. Something like Vault or Credstash could go a long way.<p>- Perform migrations to the CD system, don't use init containers<p>... these are the ones I can think off the top of my head now, but there are more.
This is a very good resource: <a href="https://github.com/donnemartin/system-design-primer" rel="nofollow">https://github.com/donnemartin/system-design-primer</a>
Make a small cluster and test stuff on it ... like anything else.<p>Most of the scalability stuff is about failure modes and how your system responds to it; so you don’t need stress tests for that.<p>Know the properties of your system. Eg what carries load? How does it scale? How much can it bare? Then mess with it on your cluster. Etc.<p>I suggest you start with Kubernetes and try and put together something like a self scaling PostgreSQL Citus cluster . Put data in it and then smash at it with big queries when ready.
One way to get some experience could be to find an open source project dealing with this kind of system and contribute there.<p>Examples of such open source applications in use for distributed, large scale systems all over the world are tensorflow, elasticsearch, and hystrix; this is just the tip of the iceberg.<p>Contributions to OSS will also be beneficial if you need to find a job in the business.