00:00:23.640
Hello, everyone. My name is Juan Pablo Genovese, and this is my first international conference. I've flown up from Argentina, and I work with Alturas Software. I'm excited to be presenting on scalable APIs today, and I appreciate the warm welcome from everyone here at LA RubyConf.
00:00:48.129
Thank you for having me. This place is incredible, surrounded by cars that I will never sell in my life. I just want to jump into one of these cars right now! The energy here is amazing. Last Thursday, I gave a workshop with the RailsBridge team, which I absolutely loved. Today’s talk is the culmination of all the work I’ve been doing these past few days.
00:01:22.960
Allow me to introduce myself briefly. I have been working in the software development industry for 16 years. I started when I was 17, didn't finish high school, and was already working. Initially, I did some Visual FoxPro and then transitioned to Visual Basic. Afterward, I worked with big banks in Argentina, processing hundreds of thousands of transactions per minute. I progressed from mainframe programming in COBOL and RPG on AS/400, and now I primarily work with Ruby.
00:02:14.969
I fell in love with Ruby in 2006, pretty much by accident, when I got my first project during the year Rails exploded. I started working with Ruby on Rails at Alturas Software, which is a fantastic company. They encouraged me to give this presentation, so here we are! You can follow me on Twitter @JuanPabloGenovese. My passions include walking, dancing the tango, and playing blues guitar.
00:02:54.360
Now, let's get into the subject of today's talk—scalable APIs. I believe everyone is somewhat familiar with what an API is, right? An API can be seen as a set of instructions or standards that allow you to use libraries or services. In today's context, it means you can expose your application to the world. A perfect example of this is Twitter, which has a widely used API where pretty much everyone signs up using it.
00:03:37.629
The first thing to understand about an API is that it allows for integration. Integration, in the current technological landscape, means that other people can use your software in the ways that you allow. This means you can gain more customers by allowing them to create software that interacts with your application, providing additional functionality that you may not develop yourself. In simpler terms, APIs offer a real-world case for collaboration between various services.
00:04:57.320
An example I can share comes from a mobile game for iOS and Android where users needed to upload videos. The team developed APIs in Ruby on Rails, and they were functioning fine as a JSON API connecting to mobile devices. This setup utilized Amazon Web Services S3, employing standard techniques, including a pool of HTTP proxies that channeled requests through several instances of AWS, each running its own Rails application.
00:06:00.580
However, the project faced some challenges. The client had a tight budget as it was a self-funded startup with no investors. The expenses began to soar as the user requests kept increasing. He was spending more and more on servers, and the need for cost-cutting while simultaneously enhancing performance became apparent. The project also required an easy scaling solution, maintaining all existing Ruby on Rails functionality while optimizing for these additional performance demands.
00:07:31.450
For inspiration, we looked at the success story of the application Draw Something, which attracted enormous traffic almost overnight after gaining popularity among celebrities. This application experienced significant challenges due to the overwhelming number of requests, needing to refactor code, add servers, and optimize overall performance. We learned from their experience to ensure we wouldn’t face the same pitfalls with our project.
00:08:21.410
This led us to Goliath, which is a non-blocking I/O server and web framework that works exceptionally well for scalable APIs. It operates similarly to JavaScript frameworks, but you don't have to switch languages to achieve a non-blocking server in Ruby. Goliath is built to efficiently handle high volumes of requests without sacrificing performance.
00:09:11.060
We employed Beanstalk, a fast and efficient job queue with a low memory footprint, making it perfect for our needs. Beanstalk allows for the scalability we required, as we could adjust the number of servers seamlessly. We also continued using Couchbase, a key-value database known for its speed and scalability, to manage our data.
00:09:54.880
One fantastic feature of Couchbase is its load distribution across multiple servers, minimizing single points of failure. The combination of Goliath and Couchbase proved to be a powerful duo, enabling us to quickly scale and adapt to growing demands while keeping tight control over our budget.
00:11:27.270
Additionally, we needed to refactor the Rails API code significantly because the original application was built by developers unfamiliar with Ruby. By concentrating on streamlining the code, we managed to process requests more efficiently. We created Ruby objects to handle work while maintaining the controller as a lightweight component responsible primarily for routing.
00:12:10.640
By employing Active Record, we enhanced the integration with Goliath, enabling seamless requests to our models. As a result, our application's performance vastly improved, going from 450 requests per second to over 1,300. We consolidated our server infrastructure, reducing from four Amazon EC2 instances to just one without compromising capacity.
00:12:54.260
Through thorough testing, we confirmed that Goliath maintained exceptional performance under heavy loads, further solidified by stress-testing with tools like JMeter. The video blog processing load also significantly improved, with processing capacities skyrocketing from 40 jobs per second to an impressive 200-250 jobs per second.
00:14:06.380
The ability for Goliath to manage notifications using both the Apple and Android notification systems provided us with a consistent and efficient means of communication with users. This bumped us in terms of processing efficiency while also providing substantial cost savings. We saved both time and money, allowing us to allocate resources effectively.
00:15:01.460
In conclusion, implementing Goliath into our system significantly positively impacted performance. Any critical API endpoints can easily be migrated to Goliath while allowing Rails to handle individual user requests with ease. You may find Goliath benefits really useful in various applications, especially for those needing to handle high traffic without breaking your budget.
00:15:55.790
The community surrounding Goliath is welcoming and helpful, with plenty of resources. Anytime I posted questions, I received responses from contributors quickly. I encourage you to investigate Goliath and its various drivers. Using the correct drivers is essential for avoiding issues like unnecessary blocking operations that could undermine Goliath's advantages.
00:16:58.880
We used token-based management for security instead of traditional session handling, ensuring a stateless experience that bolsters performance and scalability. The flexibility of Goliath makes it ideal for similar implementations, emphasizing the importance of choosing the right technologies to support your project’s needs.
00:18:06.600
Thank you all for your attention. It has been a real pleasure to be here today. If you have any questions or comments, I'm happy to discuss. Just let me know!