2 min read

Microservices Architecture

Microservices is an architectural style that structures an application as a collection of small, autonomous services, modeled around a business domain. Ideally, each service does one thing and does it well.

1. Monolith vs. Microservices

  • Monolithic Architecture: The traditional way of building applications. All functionalities (User Auth, Payments, Inventory) are bundled into a single codebase and deployed as a single unit.

    • Pros: Simple to develop initially, easy to deploy (one file).
    • Cons: Hard to scale specific parts, a bug in one module can crash the whole app, technology lock-in (entire app must be upgraded together).
  • Microservices Architecture: The application is broken down into smaller, independent services.

    • Pros: Independent scaling (scale just the "Payment" service during Black Friday), technology diversity, fault isolation.
    • Cons: Complex to manage (DevOps heavy), network latency, data consistency challenges.

2. Key Characteristics

  1. Independently Deployable: You can update the "Payment Service" without redeploying the "User Service".
  2. Loose Coupling: Services communicate via well-defined APIs (usually REST or gRPC). They generally do not share database tables.
  3. Organized around Business Capabilities: Instead of organizing by technical layers (UI, DB, Logic), teams are organized by business goals (Checkout, Shipping).
  4. Polyglot: Different services can be written in different languages (e.g., Python for AI, Node.js for I/O, Java for enterprise logic).

3. Communication

Since services run in separate processes (or even separate servers), they need to communicate over a network.

  • Synchronous: HTTP/REST, gRPC. (Service A sends a request to Service B and waits for a response).
  • Asynchronous: Message Queues (RabbitMQ, Kafka). (Service A sends a message/event and moves on; Service B processes it later).

4. Database per Service

A core pattern is that each microservice owns its own data. Other services cannot access that database directly; they must go through the service's API.

  • Benefit: Changes to one service's schema don't break other services.
  • Challenge: Implementing transactions that span multiple services is difficult (often requires patterns like Sagas).

5. Example Scenario: E-Commerce

Instead of one giant app, you might have:

  1. Product Service: Stores product details and inventory. (Database: MongoDB)
  2. Order Service: Handles placing orders. (Database: PostgreSQL)
  3. Payment Service: Integrates with Stripe/PayPal. (Database: MySQL)
  4. Notification Service: Sends emails/SMS. (No DB, just a queue consumer)

If the Notification Service crashes, users can still buy products. In a monolith, a memory leak in the email code might crash the checkout process.

programming/rest-apis programming/database-basics programming/asynchronous-programming