The Client specialize in building successful brands and bringing startups to life with daring designs and personalized experiences that engage with people on a personal level.
Our customer is a Danish company that provides local markets and other Nordic countries with home entertainment solutions, including movie rental services. The services were offered primarily at video rental shops and didn’t allow business scaling. The company wanted to transform the current business model and create a video-on-demand platform to deliver movies and TV series via the Internet on a paid basis. The client chose Cleveroad as an experienced media software development company to jump-start a project with.
We’ve chosen the approach of hexagonal architecture in order to separate the business logic from the external factors (databases, APIs, transit APIs). Hexagonal allows separating the inner core from different ports and adapters as ambassadors of business logic operating with other services. This approach allows us to leverage flexibility and agility of complicated sign-in operations, streamlining upcoming types of testing (end-to-end, integration, unit testing in particular) as well. This is how interchanging external services without major changes in the core business logic is possible.
Hexagonal architecture facilitates enhanced security measures:
First of all, it offers isolated security operations: for example, authentication and authorization are managed by dedicated security adapters, which helps to isolate these critical operations from the main business logic.
Secondly, this architecture ensures that data flows are secure and comply with regulatory standards by using adapters that encapsulate the logic for data exchange, minimizing risks of data leaks.
The modular nature of hexagonal architecture allows Joynd to easily adapt to new requirements and scale up operations without significant rewrites of the core logic. As Joynd integrates more HR software tools, we’ve developed new adapters that plug into the existing architecture without impacting other system components. Also, to address scalability, we implemented adapters that manage different loads or by distributing requests across multiple instances of the same adapter.
We’ve ensured more effective error handling thanks to the decoupled nature of system components.
The first is resilience: we’ve designed adapters to handle failures in external systems gracefully, ensuring that the core application remains unaffected.
Error logging and recovery capabilities come next. We’ve made it so specific adapters are responsible for error logging and recovery processes, helping maintain the system’s reliability and integrity.
Dealing with multiple external interfaces requires fortified and optimized performance. For this, we implemented two approaches:
First is asynchronous communication. Using asynchronous adapters improves system responsiveness and reduces dependency on external services’ performance.
Second is caching mechanisms. We implemented caching strategies in data access adapters to reduce latency and load on the core system.