Rails at Scale: Real-World Architecture Decisions and Lessons Learned — Ruby Deep Dive[18]

Bhavyansh @ DiversePixel
4 min readAug 4, 2024

--

Ruby on Rails has powered numerous successful applications, from tech giants to innovative startups and open-source projects. In this article, we’ll explore how different organizations have scaled Rails, made crucial architecture decisions, and learned valuable lessons along the way.

GitHub: Evolving a Monolith

Architecture Decisions:

  • Maintained a monolithic architecture while scaling to millions of users
  • Developed custom database solutions (GitHub-SQL) for handling large-scale code repositories
  • Implemented a “ship small, ship often” deployment strategy

Lessons Learned:

  • Monoliths can scale with proper design and infrastructure
  • Investing in custom tools for specific needs can yield significant benefits
  • Continuous deployment reduces risk and increases development velocity

Keeping Up-to-Date:

  • Regular Rails upgrades, often contributing fixes upstream
  • Gradual adoption of new features, like ActionCable for real-time functionality

Shopify: The Modular Monolith Approach

Architecture Decisions:

  • Adopted a “modular monolith” approach, dividing the application into components
  • Implemented custom database sharding solution (Ghostferry) for horizontal scaling
  • Developed and open-sourced performance monitoring tools like Scout APM

Lessons Learned:

  • Modular design can provide many microservices benefits without the operational complexity
  • Investing in data migration and sharding tools is crucial for long-term scalability
  • Open-sourcing internal tools can benefit the community and improve code quality

Keeping Up-to-Date:

  • Dedicated teams for maintaining core infrastructure and Rails upgrades
  • Active contribution to Rails core, influencing framework direction

Basecamp: Simplicity at Scale

Architecture Decisions:

  • Embraced Rails conventions and simplicity
  • Developed and adopted Hotwire (Turbo and Stimulus) for modern, fast UIs without complex JavaScript frameworks
  • Utilized multi-database support for separating concerns

Lessons Learned:

  • Adhering to Rails conventions can lead to maintainable, performant applications
  • Server-rendered HTML with sprinkles of JavaScript can create responsive UIs
  • Separating databases by concern can improve performance and scalability

Keeping Up-to-Date:

  • Early adoption of new Rails features, often driving their development
  • Regular refactoring to leverage new Rails capabilities

Gitlab: Managing a Large Open-Source Rails Application

Architecture Decisions:

  • Gradual move towards a service-oriented architecture while maintaining a monolithic core
  • Extensive use of background jobs for handling complex operations
  • Implementation of GraphQL API alongside REST

Lessons Learned:

  • Open-source development can drive code quality and feature velocity
  • Balancing monolith and services requires careful planning and clear boundaries
  • GraphQL can provide flexibility for API consumers, especially for complex data requirements

Keeping Up-to-Date:

  • Dedicated upgrade sprints for major Rails versions
  • Extensive test coverage to ensure stability during upgrades

Instacart: Real-time Logistics with Rails

Architecture Decisions:

  • Leveraged Rails for backend services while adopting React for frontend
  • Implemented robust background job processing for handling complex delivery logistics
  • Utilized Redis heavily for caching and real-time data

Lessons Learned:

  • Rails can effectively power complex logistics systems when combined with appropriate tools
  • Separating frontend and backend concerns can improve development velocity
  • Caching is crucial for handling real-time data at scale

Keeping Up-to-Date:

  • Gradual migration to newer Rails versions
  • Continuous performance monitoring and optimization

Chatwoot: Open-Source Customer Engagement Suite

Architecture Decisions:

  • Built as a monolithic Rails application with Vue.js for the frontend
  • Utilized ActionCable for real-time communication
  • Implemented a plugin system for extensibility

Lessons Learned:

  • Rails can effectively power modern, real-time applications
  • Open-source development can drive rapid feature development and community engagement
  • A plugin system can allow for customization without compromising core codebase

Keeping Up-to-Date:

  • Regular dependency updates and Rails upgrades
  • Leveraging community contributions for keeping the project current

Common Themes and Best Practices:

Thoughtful Architecture Evolution:

  • Start with a monolith and extract services only when necessary
  • Use modular design within monoliths to manage complexity

Performance Optimization:

  • Invest in caching strategies (Redis, Russian Doll caching)
  • Optimize database queries and implement proper indexing
  • Use background jobs for time-consuming tasks

Scaling Strategies:

  • Implement database sharding for horizontal scaling
  • Utilize read replicas for distributing database load
  • Leverage CDNs for static asset delivery

Keeping Rails Up-to-Date:

  • Regular, incremental upgrades to stay current
  • Maintain comprehensive test coverage to facilitate upgrades
  • Contribute to Rails and related projects to influence direction

Embracing the Ecosystem:

  • Leverage gems for common functionalities
  • Contribute back to the community by open-sourcing internal tools
  • Participate in Rails conferences and community events

Balancing New Technologies:

  • Adopt new frontend technologies (React, Vue.js) where beneficial
  • Explore modern Rails features like ActionCable
  • Consider GraphQL for complex API needs

Conclusion

These case studies demonstrate that Rails continues to be a viable and scalable solution for applications of all sizes. The key to success lies in thoughtful architecture decisions, a commitment to performance optimization, and a strategy for keeping the application up-to-date. Whether you’re building the next tech giant or an open-source project, the lessons learned from these Rails applications provide valuable insights for scaling and maintaining your Rails application over time.

--

--

Bhavyansh @ DiversePixel

Hey I write about Tech. Join me as I share my tech learnings and insights. 🚀