Monolithic means everything in a single unit. In software term, all software components are deployed as a single unit.
A monolithic application consists of three tiers:
- Presentation Layer
- Application Layer
- Data Layer
A Presentation Layer is basically UI of web app consists of html, css and javacscript.
An Application Layer is where all business logic is written using different languages like php, nodejs etc..
A Data Layer consists of different technologies like relational or non-relational databases.
In a monolithic applications these tiers are packaged and deployed as a single unit.
Let's take a practical example to understand. Consider a book store web application which consists of following modules:
- Customer Accounts
Let say developer develops this application using php language. He creates all module in one single application and then deploys on a web server.
This web application is a simple and easy to test and deploy because everything reside in single project.
Let's consider drawbacks of this architecture:
- Everything is packed in a single unit it is often very large
- It is hard to develop and maintain
- Because multiple modules are deployed as a single unit it is easy to make mistake that impacts all components together if a bug found that touches all core components.
- It is very difficult to onboard a new developer in team to understand the entire application
- If you ever want to move towards any new technology it would be very difficult to migrate everything
- everything is implemented using single development stack there might be a cases where one module can work better using different language however we are now stuck with php in above example
- To develop these application it requires a team of developers to co-ordinate together
- New team members must quickly become productive
- The application must be easy to understand and modify
- It needs to scale the entire application stack rather then single components
- You want to take advantage of emerging technologies (frameworks, programming languages, etc) but you are now stuck with monolithic app structure
- Frequent deployment becomes an issue