Grindr Backend Tech: A 2023 Recap and Glimpse Into Our 2024 Roadmap

As we boot up for an exciting 2024, let’s take a moment to recap the achievements our backend team unlocked in 2023. We didn’t just tick the boxes — we thought outside them, redefining what those boxes could be. We’ve leveled up our game in making Grindr more secure and high-performing, and we’re just warming up.
What we fully accomplished in 2023:
Finished an infrastructure migration and modernization project internally codenamed Athena.
Our tech journey in 2023 was like a first-class upgrade in the cloud computing world. The completion of our migration to AWS us-east-2 signifies a pivotal moment in our operations. Previously divided between us-east-1 and us-east-2, our development and production kubernetes clusters, databases, and caches now exclusively reside in us-east-2. This consolidation marks the culmination of a two-year modernization project aimed at introducing infrastructure-as-code, and building an automated CI/CD pipeline. With services now defined in helm charts and resources defined using Terraform, our infrastructure and deployment systems have undergone a transformative evolution, positioning us for increased efficiency and scalability. Our backend developers can now get their code out into production with minimal friction or manual intervention.
Migrated all our databases to Postgres.
I am happy to admit that I am somewhat of a Postgres fanboy! The complete migration of all our databases to Postgres represents a significant milestone in our data management. While we have been using Postgres for new databases since mid-2021, our older databases originated in MySQL. So, in 2023, we rolled up our sleeves and dove into a six-month project to migrate, these legacy MySQL databases to Postgres. This transition marks a significant step forward, enabling us to fully leverage the capabilities and advantages of a unified Postgres ecosystem across our entire database landscape.
RabbitMQ ceased to be our message bus of choice.
In September 2021, we introduced Kafka to Grindr tech. Fast forward to mid-2023, and now Kafka is the backbone of our async event bus (with the exception of our current chat system, which still relies on Rabbit for message routing). However, that is due to change and we look forward to sharing more about our new chat system extensively in the coming weeks and months.
Introduced a new AB testing platform.
We recently bid farewell to our aging in-house platform we simply called the “ab test server.” It’s been a good run, but it was time for something bigger and better. Opting for a third-party partner solution presented us with the chance to not only upgrade, but also clean up our system by clearing out all expired feature flags. This transition marked a significant step forward in streamlining and optimizing our processes. Our goal of running hundreds of experiments is well within reach with the introduction of this new technology.
Replaced Spark for Snowflake ingestion.
Since we were not doing any transformation on events before they were written into Snowflake, nor required complicated pipeline logic, we opted to streamline our ingestion with a basic Kafka consumer that writes directly to Snowflake. The cool part? By leveraging ingestion SDK, we managed to slash our data ingestion costs — big time. Keeping it smart and simple paid off.
Jenkins was replaced as our build system.
We bid farewell to Jenkins as our build system and migrated our build and releases to be defined using GitHub Actions. Having our code repository in the same place as the tools to build our application containers brought about a significant enhancement in our deployment process and provided us with a more seamless approach to deployment.
Fully migrated to Kotest for all our unit and integration tests.
We are huge fans of Test Containers (recently acquired by Docker, congratulations!). Test Containers has revolutionized our testing approach by eliminating the need for mocks; instead, we can craft end-to-end tests. A prime example is how all our database code is tested against a real Postgres instance spun up per test class, ensuring a robust and reliable code.
A couple of initiatives have seen great progress but are not yet completed:
The upcoming year marks the close of our ambitious year-long project: the evolution of our chat platform from an Erlang-based system to a JVM solution. I’m excited to delve deeper into this transformation through upcoming blogs highlighting key components such as Dynamo and Hazelcast. Once completed, this will replace all remaining Objective-C code from our iOS app, leaving us entirely on Swift. Client-side storage and logic will be replaced with server-side storage, which is a game-changer for our platform’s architecture and capabilities.
On other fronts, we’re on the home stretch of saying goodbye to our Java stack, but there’s still a bit of legwork left. Over the past two years, our transition from Java/Dropwizard to Kotlin/Ktor has been in full swing, and we’ve achieved an impressive milestone, with approximately 95% of our code now running in production on Kotlin. And yes, we’re still all-in on the JVM. We call this initiative Project Decaf, and you can read more about it on a previous post.
In our architecture, we’re not just beefing things up; we’re replacing ‘thin’ endpoints with ‘fat’ ones. One of my fundamental architecture guidelines is that we should maximize server side work. Rather than clients fetching data from multiple endpoints and stitching it together, we should allow the server to handle this workload. This shift offers numerous advantages: fewer endpoints are exposed publicly, making it easier to change; logic is not duplicated across iOS, Android and the web, so less effort is duplicated; and changes can be rolled out faster.
We’re in the final stages of removing Consul as our configuration store. Our previous Java stack stored configuration in a consul instance, which had the nice property of being easy to update at runtime. However, our new stack prefers to use configuration at build time so it’s traceable which config values are used by any given deployment at the cost of requiring a new build for changes. With just a few remaining services left using Consul, our goal is to completely phase out its usage by the end of 2024, aligning our infrastructure fully with the updated configuration strategy.
And some new items on our roadmap for 2024:
- Introducing Jetpack Compose to our Android app.
- Introducing Swift UI to our iOS app.
- Migrating all our apps to the latest JDK LTS release (21). We’ve already adopted this on several key microservices and are seeing great improvements — namely the memory usage has dropped substantially (something I will write about in a future blog).
- Investigate Vert.X for performance enhancements over our existing Ktor stack. Whilst we are very happy with Ktor from a developer perspective, Vert.X constantly ranks higher for performance in the Techempower benchmarks.
- Always take benchmarks with a pinch of salt, but it’s at least interesting enough to warrant an investigation for our use cases.
- The latest Vert.X release adds native coroutine support which makes integration with our Kotlin stack seamless.
- Investigate Protobuf or another binary format for data transfer internally.
- We have a microservice heavy stack where a large amount of CPU time is spent serializing and deserializing JSON. Switching to a binary format may save us considerable resources.
Amid a momentous 2023, our tech team spearheaded remarkable advancements in Grindr’s security, architecture, and performance, setting an exciting stage for what’s on the horizon in 2024. Our collective efforts throughout the year propelled the app into new levels of reliability and efficiency, with ongoing initiatives set to strengthen and amplify these achievements. We’re eager to share this journey, shaping Grindr’s tech landscape for a more secure and innovative future for our community.
Reminder — we are hiring! If you are based in Chicago and want to join us in our exciting tech journey and participate in a fun and fast paced culture — get in touch!