What is Finagle and what are its top alternatives?
Finagle is a distributed systems programming framework that is used by companies like Twitter to build high-performance servers and clients. It provides asynchronous, composable, and protocol-agnostic RPC, as well as simple concurrency and connection management. However, one limitation of Finagle is that it has a learning curve due to its sophisticated design.
- Akka: Akka is a powerful toolkit and runtime for building highly concurrent, distributed, and resilient applications on the JVM. Key features include actor-based concurrency, fault tolerance, location transparency, and scalability. Pros include robust fault-handling mechanisms, while cons may include a steeper learning curve for beginners.
- gRPC: gRPC is a high-performance, open-source RPC framework developed by Google. It supports multiple programming languages and platforms, uses Protocol Buffers for serialization, and provides features like bi-directional streaming and authentication. Pros include efficient network communication, while cons may include limited language support compared to Finagle.
- Netty: Netty is a versatile networking framework that provides an asynchronous event-driven network application framework for rapid development of high-performance protocol servers and clients. Key features include a flexible and extensible API, efficient memory management, and support for various protocols. Pros include high-performance networking capabilities, while cons may include a more manual approach to building network applications.
- Vert.x: Vert.x is a toolkit for building reactive applications on the JVM that offers event-driven and non-blocking programming models. It supports polyglot development, reactive streams, and distributed event bus communication. Pros include seamless integration with various technologies, while cons may involve a complex setup process.
- RSocket: RSocket is a binary protocol for use on byte stream transports. It provides Reactive Streams semantics, multiplexed bidirectional communication, and resumption on connection. Pros include efficient use of resources, while cons may include less widespread adoption compared to Finagle.
- Spring Cloud: Spring Cloud provides tools for building distributed systems on the JVM. It offers features like service discovery, circuit breakers, and distributed tracing. Pros include seamless integration with Spring ecosystem, while cons may include a heavier dependency footprint compared to Finagle.
- Quasar: Quasar is a library that enables lightweight threads for the JVM that are capable of pausing and resuming. It supports reactive programming, async computations, and fine-grained concurrency control. Pros include efficient use of resources, while cons may involve potential compatibility issues with existing codebases.
- RabbitMQ: RabbitMQ is a widely-used message broker that supports multiple messaging protocols. It provides features like message queuing, routing, and clustering. Pros include robust messaging capabilities, while cons may include potential performance bottlenecks in high-throughput scenarios.
- Scribe: Scribe is a scalable and simple O(log(n)) API for aggregating streaming data for logging and monitoring purposes. It offers efficient log aggregation, dynamic configuration, and seamless integration with various data processing pipelines. Pros include simplicity and scalability, while cons may involve limited community support.
- Apache Thrift: Apache Thrift is a scalable, extensible, multi-language remote procedure call (RPC) framework. It supports efficient cross-language development and includes features like serialization, code generation, and transport plugins. Pros include broad language support, while cons may include potential complexity in managing a large codebase.
Top Alternatives to Finagle
- Finatra
At Twitter, Finagle provides the building blocks for most of the code written on the JVM. It has long-served as Twitter's extensible, protocol-agnostic, highly-scalable RPC framework. ...
- gRPC
gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking... ...
- Akka
Akka is a toolkit and runtime for building highly concurrent, distributed, and resilient message-driven applications on the JVM. ...
- Spring Boot
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run". We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration. ...
- Play
Play Framework makes it easy to build web applications with Java & Scala. Play is based on a lightweight, stateless, web-friendly architecture. Built on Akka, Play provides predictable and minimal resource consumption (CPU, memory, threads) for highly-scalable applications. ...
- Akka HTTP
The Akka HTTP modules implement a full server- and client-side HTTP stack on top of akka-actor and akka-stream. It’s not a web-framework but rather a more general toolkit for providing and consuming HTTP-based services. While interaction with a browser is of course also in scope it is not the primary focus of Akka HTTP. ...
- RxJS
RxJS is a library for reactive programming using Observables, to make it easier to compose asynchronous or callback-based code. This project is a rewrite of Reactive-Extensions/RxJS with better performance, better modularity, better debuggable call stacks, while staying mostly backwards compatible, with some breaking changes that reduce the API surface. ...
- Netty
Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server. ...
Finagle alternatives & related posts
- Fast7
- Easy6
related Finatra posts
- Higth performance24
- The future of API15
- Easy setup13
- Contract-based5
- Polyglot4
- Garbage2
related gRPC posts
I used GraphQL extensively at a previous employer a few years ago and really appreciated the data-driven schema etc alongside the many other benefits it provided. At that time, it seemed like it was set to replace RESTful APIs and many companies were adopting it.
However, as of late, it seems like interest has been waning for GraphQL as opposed to increasing as I had assumed it would. Am I missing something here? What is the current perspective regarding this technology?
Currently, I'm working with gRPC and was curious as to the state of everything now.
We need to interact from several different Web applications (remote) to a client-side application (.exe in .NET Framework, Windows.Console under our controlled environment). From the web applications, we need to send and receive data and invoke methods to client-side .exe on javascript events like users onclick. SignalR is one of the .Net alternatives to do that, but it adds overhead for what we need. Is it better to add SignalR at both client-side application and remote web application, or use gRPC as it sounds lightest and is multilingual?
SignalR or gRPC are always sending and receiving data on the client-side (from browser to .exe and back to browser). And web application is used for graphical visualization of data to the user. There is no need for local .exe to send or interact with remote web API. Which architecture or framework do you suggest to use in this case?
- Great concurrency model32
- Fast17
- Actor Library12
- Open source10
- Resilient7
- Message driven5
- Scalable5
- Mixing futures with Akka tell is difficult3
- Closing of futures2
- No type safety2
- Very difficult to refactor1
- Typed actors still not stable1
related Akka posts
To solve the problem of scheduling and executing arbitrary tasks in its distributed infrastructure, PagerDuty created an open-source tool called Scheduler. Scheduler is written in Scala and uses Cassandra for task persistence. It also adds Apache Kafka to handle task queuing and partitioning, with Akka to structure the library’s concurrency.
The service’s logic schedules a task by passing it to the Scheduler’s Scala API, which serializes the task metadata and enqueues it into Kafka. Scheduler then consumes the tasks, and posts them to Cassandra to prevent data loss.
I decided to use Akka instead of Kafka streams because I have personal relationships at @Lightbend.
Spring Boot
- Powerful and handy149
- Easy setup134
- Java128
- Spring90
- Fast85
- Extensible46
- Lots of "off the shelf" functionalities37
- Cloud Solid32
- Caches well26
- Productive24
- Many receipes around for obscure features24
- Modular23
- Integrations with most other Java frameworks23
- Spring ecosystem is great22
- Auto-configuration21
- Fast Performance With Microservices21
- Community18
- Easy setup, Community Support, Solid for ERP apps17
- One-stop shop15
- Easy to parallelize14
- Cross-platform14
- Easy setup, good for build erp systems, well documented13
- Powerful 3rd party libraries and frameworks13
- Easy setup, Git Integration12
- It's so easier to start a project on spring5
- Kotlin4
- Microservice and Reactive Programming1
- The ability to integrate with the open source ecosystem1
- Heavy weight23
- Annotation ceremony18
- Java13
- Many config files needed11
- Reactive5
- Excellent tools for cloud hosting, since 5.x4
- Java 😒😒1
related Spring Boot posts
We are in the process of building a modern content platform to deliver our content through various channels. We decided to go with Microservices architecture as we wanted scale. Microservice architecture style is an approach to developing an application as a suite of small independently deployable services built around specific business capabilities. You can gain modularity, extensive parallelism and cost-effective scaling by deploying services across many distributed servers. Microservices modularity facilitates independent updates/deployments, and helps to avoid single point of failure, which can help prevent large-scale outages. We also decided to use Event Driven Architecture pattern which is a popular distributed asynchronous architecture pattern used to produce highly scalable applications. The event-driven architecture is made up of highly decoupled, single-purpose event processing components that asynchronously receive and process events.
To build our #Backend capabilities we decided to use the following: 1. #Microservices - Java with Spring Boot , Node.js with ExpressJS and Python with Flask 2. #Eventsourcingframework - Amazon Kinesis , Amazon Kinesis Firehose , Amazon SNS , Amazon SQS, AWS Lambda 3. #Data - Amazon RDS , Amazon DynamoDB , Amazon S3 , MongoDB Atlas
To build #Webapps we decided to use Angular 2 with RxJS
#Devops - GitHub , Travis CI , Terraform , Docker , Serverless
Is learning Spring and Spring Boot for web apps back-end development is still relevant in 2021? Feel free to share your views with comparison to Django/Node.js/ ExpressJS or other frameworks.
Please share some good beginner resources to start learning about spring/spring boot framework to build the web apps.
- Scala81
- Web-friendly architecture55
- Built on akka55
- Stateless50
- High-scalable47
- Fast46
- Open source40
- Java34
- High velocity27
- Fun24
- Lightweight9
- Non-blocking io8
- Developer friendly6
- Simple template engine5
- Scalability4
- Pure love3
- Resource efficient2
- Evolves fast, keep up with releases3
- Unnecessarily complicated1
related Play posts
Some may wonder why did we choose Grails ? Really good question :) We spent quite some time to evaluate what framework to go with and the battle was between Play Scala and Grails ( Groovy ). We have enough experience with both and, to be honest, I absolutely in love with Scala; however, the tipping point for us was the potential speed of development. Grails allows much faster development pace than Play , and as of right now this is the most important parameter. We might convert later though. Also, worth mentioning, by default Grails comes with Gradle as a build tool, so why change?
related Akka HTTP posts
- Easier async data chaining and combining6
- Steep learning curve, but offers predictable operations3
- Observable subjects2
- Ability to build your own stream2
- Works great with any state management implementation2
- Easier testing2
- Lot of build-in operators1
- Simplifies state management1
- Great for push based architecture1
- Documentation1
- Steep learning curve3
related RxJS posts
- High Performance9
- Easy to use4
- Just like it3
- Limited resources to learn from2