Notifly

    Multi-channel notification microservice with GraphQL API, supporting email, SMS, and real-time delivery.

    MicroservicesNotificationsGraphQLgRPCNATS
    December 2025
    100% completed
    YM
    Yashaswi Mishra
    December 2025

    Tech Stack

    Backend

    Go
    GraphQL

    Completion Status

    Project completion100%
    This project has reached its initial development goals.

    Notifly: Building a Production-Ready Notification System

    Every application needs notifications, but most developers end up with a tangled mess of email libraries and SMS APIs scattered throughout their codebase. I wanted to build something that handles notifications the way they should be handled: as a first-class, reliable, scalable service.

    Notifly is a microservice architecture that treats notifications as critical infrastructure, not an afterthought.


    The Problem: Notifications Are Harder Than They Look

    Building reliable notifications means solving several problems simultaneously:

    • Multiple Channels: Email, SMS, push notifications, webhooks - each with different providers and APIs
    • Reliability: Messages must be delivered even when services restart or networks fail
    • Authentication: Secure token-based auth that works across multiple services
    • Observability: You need to know when messages fail and why
    • Performance: High throughput without blocking your main application

    Most teams hack together a solution that works for their current needs, but breaks down when requirements grow. Notifly is designed to scale from day one.


    Architecture: Event-Driven Microservices Done Right

    Notifly uses a clean microservice architecture with proper separation of concerns:

    User Service: Handles authentication and user management. Built with gRPC for fast internal communication and uses PASETO tokens for stateless, secure authentication.

    Trigger Service:
    The entry point for notification requests. Validates auth tokens, publishes events to NATS JetStream, and provides the external API interface.

    Notification Service: The workhorse that consumes events and actually sends notifications. Implements robust retry logic, provider fallbacks, and detailed error handling.

    GraphQL Gateway: Provides a clean, typed API for client applications. Handles authentication and proxies requests to the appropriate services.


    Technical Deep Dive: Message Queue Architecture

    The heart of Notifly is its message queue implementation using NATS JetStream:

    Why NATS JetStream:

    • Persistent Storage: Messages survive service restarts
    • At-Least-Once Delivery: Guarantees that notifications won't be lost
    • Pull-Based Consumers: Services control their own consumption rate
    • Built-in Retry Logic: Configurable delivery attempts and backoff

    Queue Design: The notification service uses durable consumers with explicit acknowledgment patterns:

    go
    // Ack: Message processed successfully
    msg.Ack()
    
    // Nak: Temporary failure, retry later  
    msg.Nak()
    
    // Term: Permanent failure, don't retry
    msg.Term()

    This gives fine-grained control over retry behavior based on the type of failure.


    Production-Ready Features

    Security First:

    • PASETO tokens for tamper-proof authentication
    • gRPC interceptors for authorization
    • Parameterized queries prevent SQL injection
    • No sensitive data in logs

    Observability:

    • Structured logging with Zap
    • Detailed error reporting with context
    • Message delivery tracking
    • Performance metrics ready for Prometheus integration

    Deployment:

    • Docker Compose for local development
    • Single binary deployment for production
    • No external dependencies beyond database and message queue
    • Kubernetes-ready with proper health checks

    Real-World Notification Handling

    Notifly handles the complexity of real-world notification delivery:

    Provider Integration:

    • Email: Brevo API for reliable email delivery
    • SMS: Twilio for global SMS coverage
    • Extensible: Easy to add new providers or notification types

    Error Scenarios:

    • Rate Limiting: Automatic backoff when providers throttle requests
    • Provider Failures: Graceful degradation and retry strategies
    • Invalid Recipients: Proper error classification and logging
    • Network Issues: Resilient connection handling

    Performance:

    • Streaming Processing: Handle high message volumes without memory issues
    • Configurable Batching: Balance throughput vs latency based on needs
    • Worker Pools: Parallel processing where safe

    Why Microservices for Notifications?

    Some might argue this is over-engineering, but notifications have unique requirements:

    Isolation: A bug in notification logic shouldn't bring down your main app Scaling: Different notification types have different performance characteristics
    Technology Choice: Go's performance and reliability make sense for infrastructure Team Boundaries: Clear service boundaries enable independent development

    The microservice approach also enables interesting patterns like A/B testing notification templates or gradual rollouts of new providers.


    Development Experience

    Working with Notifly feels natural:

    Local Development: Docker Compose spins up the full stack locally. Add your API keys, run a few commands, and you're sending notifications.

    API Design: GraphQL provides discoverability and type safety. The schema is intuitive - send a notification by specifying recipient, type, and content.

    Testing: Each service can be tested independently. Mock providers make integration testing reliable.


    Future Enhancements

    Notifly works great today, but there's more planned:

    • Template Management: Store and version notification templates
    • Analytics Dashboard: Track delivery rates and engagement metrics
    • Webhook Support: Send notifications via HTTP callbacks
    • Push Notifications: Mobile and web push integration
    • Scheduling: Send notifications at specific times or recurring intervals

    The foundation is solid enough to support these features without architectural changes.

    Follow my journey
    Buy me a coffeeSupport

    Explore More Projects