During the time of Ackee existence, we have tried several tens of technologies for implementation of our server services for web and mobile applications. We liked a lot of them and for some others we will be happy if we never have to use them again. Let’s go over the ones that we as a back-end team rely on.
API, Express and Typescript
Just as the front-end team, we do not have one strict stack, but we adapt to the character of the project. We have done projects using classical REST where we let the code be generated from documentation in Open API as well as in gRPC using the ProtoCat library or in GraphQL with tools by Apollo. The main building stone for us, however, remains to be the following trio of technologies: Node.js, Express and Typescript.
We have come to like Node and it is our primary technology. We also broaden our insight into Go, where we still have limited production experience, but we like it and believe in it. We like using Express because of its minimalism in comparison to other common frameworks. We can adapt our services to bigger and smaller projects alike built on different database and API technologies.
For fast set-up of our projects, we used a pre-made node-template. Thanks to having it kept as thin and transparent as possible, we should never have any issues switching it for something new. We fell in love with static typing of code using Typescript and it has become an integral part of our stack. We like to learn new things and tricks in it, which was recently reinforced by our internal TS Academy.
Storage and transfer of data
The base of our data is a relational database. After using the MySQL system, we are now mostly leaning on PostgreSQL from 2019, where we have better experience in terms of operation, monitoring and analysis of complexity of SQL queries. The biggest help with relational databases is the library Knex.js for which we wrote our own wrapper named Databless. In the past, we have tried using MongoDB document storage, but the difficulty of operation and monitoring in Cloud as well as prices for a hosted solution discouraged us.
For bigger projects, we include other tools from our wider stack. We like to use Firestore services for live synchronization of data with web and mobile applications. In case that the databases are not making it, we use in memory storage Redis for the cache layer. In case of the need for a more complex fulltext search, we are not afraid of using ElasticSearch. Given that we like to play with the architecture of microservices, we often need a tool for internal communication. We have good experience with the message queue Google Pub/Sub, for which we also have our own wrapper FuQu.
Cloud and releasing
We develop our services locally using Docker thanks to which we are able to simulate a remote environment for each project. For each such environment, there is a different configuration file needed and since no existing solution for administration of configurations met our needs and we wanted to use jsonc format, we wrote our own library – Configuru. Testing cannot be omitted when talking about API, for which we often use the Jest framework.
The standard for us in terms of releasing and Continuous Integration is GIT and Google Cloud. The code is deployed from a GIT repository automatically using Gitlab CI on Google App Engine or Google Cloud Run with connection of the service directly in the cloud infrastructure which is operated by our great DevOps team using Terraform. You can find out more for example in the article with DevOps summary.
This is our current back-end tech stack. It is constantly changing because we like to try new things and are looking for better solutions to complement what we have to keep providing the best for our clients. Do you want to participate in it? Now is your chance – we are hiring!