Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.

Overview

Hystrix: Latency and Fault Tolerance for Distributed Systems

NetflixOSS Lifecycle

Hystrix Status

Hystrix is no longer in active development, and is currently in maintenance mode.

Hystrix (at version 1.5.18) is stable enough to meet the needs of Netflix for our existing applications. Meanwhile, our focus has shifted towards more adaptive implementations that react to an application’s real time performance rather than pre-configured settings (for example, through adaptive concurrency limits). For the cases where something like Hystrix makes sense, we intend to continue using Hystrix for existing applications, and to leverage open and active projects like resilience4j for new internal projects. We are beginning to recommend others do the same.

Netflix Hystrix is now officially in maintenance mode, with the following expectations to the greater community: Netflix will no longer actively review issues, merge pull-requests, and release new versions of Hystrix. We have made a final release of Hystrix (1.5.18) per issue 1891 so that the latest version in Maven Central is aligned with the last known stable version used internally at Netflix (1.5.11). If members of the community are interested in taking ownership of Hystrix and moving it back into active mode, please reach out to [email protected].

Hystrix has served Netflix and the community well over the years, and the transition to maintenance mode is in no way an indication that the concepts and ideas from Hystrix are no longer valuable. On the contrary, Hystrix has inspired many great ideas and projects. We thank everyone at Netflix, and in the greater community, for all the contributions made to Hystrix over the years.

Introduction

Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.

Full Documentation

See the Wiki for full documentation, examples, operational details and other information.

See the Javadoc for the API.

Communication

What does it do?

1) Latency and Fault Tolerance

Stop cascading failures. Fallbacks and graceful degradation. Fail fast and rapid recovery.

Thread and semaphore isolation with circuit breakers.

2) Realtime Operations

Realtime monitoring and configuration changes. Watch service and property changes take effect immediately as they spread across a fleet.

Be alerted, make decisions, affect change and see results in seconds.

3) Concurrency

Parallel execution. Concurrency aware request caching. Automated batching through request collapsing.

Hello World!

Code to be isolated is wrapped inside the run() method of a HystrixCommand similar to the following:

public class CommandHelloWorld extends HystrixCommand<String> {

    private final String name;

    public CommandHelloWorld(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.name = name;
    }

    @Override
    protected String run() {
        return "Hello " + name + "!";
    }
}

This command could be used like this:

String s = new CommandHelloWorld("Bob").execute();
Future<String> s = new CommandHelloWorld("Bob").queue();
Observable<String> s = new CommandHelloWorld("Bob").observe();

More examples and information can be found in the How To Use section.

Example source code can be found in the hystrix-examples module.

Binaries

Binaries and dependency information for Maven, Ivy, Gradle and others can be found at http://search.maven.org.

Change history and version numbers => CHANGELOG.md

Example for Maven:

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>x.y.z</version>
</dependency>

and for Ivy:

<dependency org="com.netflix.hystrix" name="hystrix-core" rev="x.y.z" />

If you need to download the jars instead of using a build system, create a Maven pom file like this with the desired version:

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.netflix.hystrix.download</groupId>
	<artifactId>hystrix-download</artifactId>
	<version>1.0-SNAPSHOT</version>
	<name>Simple POM to download hystrix-core and dependencies</name>
	<url>http://github.com/Netflix/Hystrix</url>
	<dependencies>
		<dependency>
			<groupId>com.netflix.hystrix</groupId>
			<artifactId>hystrix-core</artifactId>
			<version>x.y.z</version>
			<scope/>
		</dependency>
	</dependencies>
</project>

Then execute:

mvn -f download-hystrix-pom.xml dependency:copy-dependencies

It will download hystrix-core-*.jar and its dependencies into ./target/dependency/.

You need Java 6 or later.

Build

To build:

$ git clone [email protected]:Netflix/Hystrix.git
$ cd Hystrix/
$ ./gradlew build

Futher details on building can be found on the Getting Started page of the wiki.

Run Demo

To run a demo app do the following:

$ git clone [email protected]:Netflix/Hystrix.git
$ cd Hystrix/
./gradlew runDemo

You will see output similar to the following:

Request => GetUserAccountCommand[SUCCESS][8ms], GetPaymentInformationCommand[SUCCESS][20ms], GetUserAccountCommand[SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][101ms], CreditCardCommand[SUCCESS][1075ms]
Request => GetUserAccountCommand[FAILURE, FALLBACK_SUCCESS][2ms], GetPaymentInformationCommand[SUCCESS][22ms], GetUserAccountCommand[FAILURE, FALLBACK_SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][130ms], CreditCardCommand[SUCCESS][1050ms]
Request => GetUserAccountCommand[FAILURE, FALLBACK_SUCCESS][4ms], GetPaymentInformationCommand[SUCCESS][19ms], GetUserAccountCommand[FAILURE, FALLBACK_SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][145ms], CreditCardCommand[SUCCESS][1301ms]
Request => GetUserAccountCommand[SUCCESS][4ms], GetPaymentInformationCommand[SUCCESS][11ms], GetUserAccountCommand[SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][93ms], CreditCardCommand[SUCCESS][1409ms]

#####################################################################################
# CreditCardCommand: Requests: 17 Errors: 0 (0%)   Mean: 1171 75th: 1391 90th: 1470 99th: 1486 
# GetOrderCommand: Requests: 21 Errors: 0 (0%)   Mean: 100 75th: 144 90th: 207 99th: 230 
# GetUserAccountCommand: Requests: 21 Errors: 4 (19%)   Mean: 8 75th: 11 90th: 46 99th: 51 
# GetPaymentInformationCommand: Requests: 21 Errors: 0 (0%)   Mean: 18 75th: 21 90th: 24 99th: 25 
#####################################################################################

Request => GetUserAccountCommand[SUCCESS][10ms], GetPaymentInformationCommand[SUCCESS][16ms], GetUserAccountCommand[SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][51ms], CreditCardCommand[SUCCESS][922ms]
Request => GetUserAccountCommand[SUCCESS][12ms], GetPaymentInformationCommand[SUCCESS][12ms], GetUserAccountCommand[SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][68ms], CreditCardCommand[SUCCESS][1257ms]
Request => GetUserAccountCommand[SUCCESS][10ms], GetPaymentInformationCommand[SUCCESS][11ms], GetUserAccountCommand[SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][78ms], CreditCardCommand[SUCCESS][1295ms]
Request => GetUserAccountCommand[FAILURE, FALLBACK_SUCCESS][6ms], GetPaymentInformationCommand[SUCCESS][11ms], GetUserAccountCommand[FAILURE, FALLBACK_SUCCESS, RESPONSE_FROM_CACHE][0ms]x2, GetOrderCommand[SUCCESS][153ms], CreditCardCommand[SUCCESS][1321ms]

This demo simulates 4 different HystrixCommand implementations with failures, latency, timeouts and duplicate calls in a multi-threaded environment.

It logs the results of HystrixRequestLog and metrics from HystrixCommandMetrics.

Dashboard

The hystrix-dashboard component of this project has been deprecated and moved to Netflix-Skunkworks/hystrix-dashboard. Please see the README there for more details including important security considerations.

Bugs and Feedback

For bugs, questions and discussions please use the GitHub Issues.

LICENSE

Copyright 2013 Netflix, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Comments
  • Execution Hooks via Plugin

    Execution Hooks via Plugin

    Create an ExecutionHook strategy that can be implemented to do things such as:

    • decorate a response
    • conditionally throw exceptions, modify responses
    • do other forms of logging or diagnostics
    • be invoked ...
      • before run()
      • start of run()
      • end of run()
      • after run()
      • start of getFallback()
      • end of getFallback()
      • etc
    enhancement 
    opened by benjchristensen 42
  • Unable to configure Hystrix dashboard

    Unable to configure Hystrix dashboard

    Hi,

    I am new to Hystrix and trying to configure Hystrix dashboard for a sample application that i am developing. I had gone thru the documentation that is available in GitHub Wiki and was able to configure the application properly in my local environment. When i hit hystrix stream url "http://hostname:port/application/hystrix.stream", it is returning me the JSON data. But if i use the same URL in Hystrix Dashboard, it is not displaying any data in the dashboard.

    I traced the request and found that the below link is not returning any response and getting failed.

    http://localhost:8090/hystrix-dashboard/proxy.stream?origin=http://localhost:8090/showcase/hystrix.stream

    Error message:

    EventSource's response has a MIME type ("text/plain") that is not "text/event-stream". Aborting the connection. Connection was closed on error: [object Event]

    I tried searching in internet for this issue but was not able to find any solution. In addition to this problem, when hystrix dashboard is not able to establish the connection, i observed that it is chewing up all the available connections within no time (may be metrics poller) and displaying a 503 error page.

    Can you please help me with the problems described above? Thanks.

    -Suresh

    opened by sureshbabuanguluri 34
  • NullPointerException occurs when poller pauses.

    NullPointerException occurs when poller pauses.

    I'm seeing the following exception when I use the dashboard and it polls for metrics. It did work at one time, but not sure why it doesn't now.

    SEVERE: Servlet.service() for servlet HystrixMetricsStreamServlet threw exception java.lang.NullPointerException at com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsPoller.pause(HystrixMetricsPoller.java:98) at com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsPoller.shutdown(HystrixMetricsPoller.java:108) at com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet.handleRequest(HystrixMetricsStreamServlet.java:168) at com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet.doGet(HystrixMetricsStreamServlet.java:74)

    opened by lxadtz33 33
  • Make Archaius a soft dependency through reflection and improve plugin…

    Make Archaius a soft dependency through reflection and improve plugin…

    See #970 #129 #252

    This change does a couple of things to hystrix-core that should be fairly safe and backward compatibility

    • It checks to see if Archaius is available through reflection and will use it if is available. Notice I did not change the dependencies so backward compatibility should be fine.
    • Besides using properties for plugin discovery the JDK service loader is used as a fallback.
    • I added a new plugin called HystrixDynamicProperties due to the whole nasty coupling with HystrixPropertiesChainedArchaiusProperty and PropertyWrapper. Thus you don't have to replace every XXXStrategy if you only want to change configuration source.
    • The HystrixDynamicProperties can only be loaded through a ServiceLoader (cause you got not properties to resolve it :) ). Thus HystrixPlugin must load with some plugin implementation and thus is final. If no implementation is found an implementation that uses the System.properties is used ( we could instead fail). This would only happen if you didn't have Archaius in your classpath and no other implementation available (ie serviceloader).
    • There are a whole bunch of contrib stuff that uses Archaius directly that I did not fix but in theory could be.

    I need these changes because right now my company cannot use Archaius and thus we have our own nasty circruitbreaker stuff that I would love to get rid of.

    I know @mattrjacobs was working on this as well. This is mainly to invoke discussion. I'm also not so sure what the coding style is or should be (I saw tabs but used spaces...). Advance apologies.

    opened by agentgt 32
  • HystrixCollapser completes without emitting

    HystrixCollapser completes without emitting

    Hi, I am facing a weird issue wherein the observable returned by HystrixCollapser completes without emitting any item. Since I am using HystrixCollapser.toObservable() inside to do composition using RxJava operator, this is leading to items being missed from the data flow. On debugging I have found that the HystrixCollapser do call the HystrixCommand.run() and mapResponsetoRequests function is also called. I am unable to debug this more because this behaviour is completely random.

    For reference, my rx observable composition is something like this,

    Observable.from(id1, id2, id3, ....)
    .flatMap(id -> collapser1(id))
    .flatMap(collapser1Result -> {
        collapser2Observable = collapser2(collapser1Result);
        collapser3Observable = collapser3(collapser1Result);
        collapser4Observable = collapser4(collapser1Result);
    
        return Observable.zip(collapser2Observable, collapser3Observable, collapser4Observable, 
            (collapser2Res, collapser3Res, collapser4Res) 
                        -> makeFinalResult(collapser2Res, collapser3Res, collapser4Res));
    })
    .map(finalResult -> doSomeTransformations(finalResult))
    .toList().toBlocking().single();
    

    Since any of collapser2/3/4 completes without emitting, this lead to zip being called and corresponding related result goes missing from the final list.

    bug hystrix-core 
    opened by amitcse 31
  • HystrixRequestContext in case of async requests

    HystrixRequestContext in case of async requests

    Hi, In case when HystrixObservableCommand is used to wrap a non-blocking observable, and the non-blocking request is done on ExecutorService, (the subscription is also done on the executor service) will the HystrixRequestContext have to be explicitly copied to the newly created threads for the HystrixObservableCollapser to work ?? The HystrixObservableCollapser is used in Rx composition (flatMap).

    enhancement question hystrix-core 
    opened by amitcse 31
  • Hystrix circuit short-circuited and is OPEN

    Hystrix circuit short-circuited and is OPEN

    Hi,

    I ran into this Exception, not sure what is the cause. The setup is fairly simple and I am doing functional testing only. All Hystrix config is defaulted with one exception: HystrixCommandProperties.Setter().withFallbackEnabled(false);

    Any help and suggestions would be helpful.

    Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: CreateUserCommand short-circuited and failed retrieving fallback.
            at com.netflix.hystrix.AbstractCommand$20.call(AbstractCommand.java:830)
            at com.netflix.hystrix.AbstractCommand$20.call(AbstractCommand.java:798)
            at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:76)
            at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70)
            at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:70)
            at rx.Observable$ThrowObservable$1.call(Observable.java:10493)
            at rx.Observable$ThrowObservable$1.call(Observable.java:10483)
            at rx.Observable.unsafeSubscribe(Observable.java:8591)
            at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:77)
            at rx.internal.operators.OperatorMap$1.onError(OperatorMap.java:48)
            at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:318)
            at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:310)
    

    Thanks. Weiping

    opened by WeipingGuo 30
  • Javanica: Option to send fallback exception to client instead of primary command

    Javanica: Option to send fallback exception to client instead of primary command

    We are having an issue because javanica always sends the primary command exception to the client.

    Sample code

    @HystrixCommand(ignoreExceptions = {VallidationException.class}, fallbackMethod="getUserEmailsFallback")
    List<String> getUserEmails(String userId) {
      return callFirstService(userId);
    }
    
    @HystrixCommand(ignoreExceptions = {VallidationException.class})
    List<String> getUserEmailsFallback(String userId) {
      return callSecondService(userId);
    }
    

    What is happening If the first service is down the first command throws ConnectException and falls back to fallback method. If the fallback method throws ValidationException then the original ConnectException is thrown back to client.

    This behaviour is undesired because its just a ValidationException and ideally we should be sending a message to client saying there is some validation exception.

    What will make it better If fallback throws any of the ignored exceptions then propagate that exception to the client instead of the exception from the primary method.

    opened by nytins 28
  • Incorrectly getting error

    Incorrectly getting error "Collapser method must have one argument" from CollapserMetaHolderFactory

    I am having a strange issue. I have a method which is annotated with HystrixCommand

    ` @Override @HystrixCommand(fallbackMethod = "getDataFallback", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "60000"), @HystrixProperty(name="execution.isolation.thread.interruptOnTimeout", value="TRUE"), @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"), @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50") }, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "10") })

    public List getData(String id, Date date) { return null; } `

    it works most of the times, but rarely without changing anything I get the following exception

    java.lang.IllegalStateException: Collapser method must have one argument: public java.util.List getData(String,Date)

    I checked the code of Hystrix and found that the meta holder factory checks if the HystrixCommand annotation is present then it initializes CommandMetaHolderFactory, otherwise CollapserMetaHolderFactory. In my case, I have the HystrixCommand but it still tries to use CollapserMetaHolderFactory which complains about method not having 1 argument.

    This happens rarely and it's possible no one has seen it yet, I was just wondering if there is a recent fix related to this issue. I am using hystrix 1.5.0.

    Thanks in advance.

    bug question javanica 
    opened by ppetrosyan 26
  • Is there a way to automatically pass thread static information to the Hystrix Command thread pool?

    Is there a way to automatically pass thread static information to the Hystrix Command thread pool?

    Hello,

    I have a number of 3 REST-based micro services. Each of these belongs to a logical layer. A Web app calls the service on the upper layer and the call goes down to the second layer and finally the third one where data are obtained and get responded all the way back. I need to log a common RequestId (as a GUID) that identifies a single web request in all layers. This request id is created on the first service and as a Header it automatically passes from each http client to the next service and from the service to the next client using Client & Servlet filters and a Logback MDC instance. So, in each layer, if the Servlet filter does not get a RequestId header, it creates it, and it puts it in the MDC for the current thread. Whenever an http client request is made, the Client Filter, reads the request id from the MDC, creates a header and passes it to the request and the chain goes on.

    If i use a Hystrix Command as a wrapper to the actual http client call, the chain breaks. Apparently, the threads created by a Hystrix Command are not "children" of the thread that called its constructor and therefore the MDC values do not propagate.

    Is there a solution to this problem? I read about the execution hooks. Can they offer a solution?

    More info at http://logback.qos.ch/manual/mdc.html#autoMDC and http://logback.qos.ch/manual/mdc.html#managedThreads

    opened by pparth 25
  • cpu% high

    cpu% high

    Hi, too many RXComputationalScheduler threads are getting created and my application's cpu% is going high after using hystrix.

    I am using this configuration

    "groupName": "recsagservice", "threadPoolCoreSize": 5, "cirBreakErrorThresPerc" : 50, "cirBreakReqVolThres":80, "cirBreakSleepTimeInMilliSec":72000 .

    Please guide me what could be wrong here. I am attaching thread dump.

    thread_hystrix.txt

    question performance 
    opened by ssakshi0302 24
  • Fix Exception in HystrixThreadPoolDefault.touchConfig() on Java 11

    Fix Exception in HystrixThreadPoolDefault.touchConfig() on Java 11

    Java 11 ThreadPoolExecutor.setCorePoolSize() throws an IllegalArgumentException if the new coreSize is larger than the current maximumPoolSize. Similarly, setMaximumPoolSize() throws an exception if the new value is less than the current coreSize.

    opened by michaelnelson123 0
  • Hystrix dashboard showing endless

    Hystrix dashboard showing endless "ping: " even after sending some requests

    Yesterday the hystrix dashboard was working normally but now it doesn't work at all. It just shows the following: ping: ping:

    and when you send some requests it shows an unreadable json file.

    opened by JosephOrendo 0
  • when i use macbook M1 to build Hystrix,it report no matching architecture in universal wrapper

    when i use macbook M1 to build Hystrix,it report no matching architecture in universal wrapper

    when i use macbook M1 to build Hystrix.Now my idea's console tell me “ /Users/Gary/Library/Caches/JetBrains/IntelliJIdea2021.3/tmp/jna766552466857907277.tmp: dlopen(/Users/moka/Library/Caches/JetBrains/IntelliJIdea2021.3/tmp/jna766552466857907277.tmp, 1): no suitable image found. Did find: /Users/Gary/Library/Caches/JetBrains/IntelliJIdea2021.3/tmp/jna766552466857907277.tmp: no matching architecture in universal wrapper /Users/Gary/Library/Caches/JetBrains/IntelliJIdea2021.3/tmp/jna766552466857907277.tmp: no matching architecture in universal wrapper ” But my windows laptop is ok.no this problem.

    opened by hunter7727 0
Releases(v1.5.18)
  • v1.5.18(Nov 16, 2018)

  • v1.5.13(Jul 13, 2017)

    • Pull 1621 Fixed bug where an unsubscription of a command in half-open state leaves circuit permanently open
    • Pull 1605 Change return value on unsubscribe to Observable.empty(). Thanks @atoulme !
    • Pull 1615 Updated Gradle to version 4.0. Thanks @wlsc !
    • Pull 1616 Javanica: Wrong hystrix event type for fallback missing. Thanks @dmgcodevil !
    • Pull 1606 Escape user entered input to avoid HTML injection. This fixes #1456. Thanks @atoulme !
    • Pull 1595 Possibility to add custom root node for command and thread pool metrics. Thanks @dstoklosa !
    • Pull 1587 Throw IllegalStateException if request cache is not available when clearing. Thanks @jack-kerouac !

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.12(May 16, 2017)

    • Pull 1586 Start streams for CodaHale metric consumer, ot get it actually working
    • Pull 1584 Javanica: Wire up allowMaximumSizeToDivergeFromCoreSize thread-pool property
    • Pull 1585 Fix actualMaximumSize Codahale threadpool metric calculation
    • Pull 1567 Fix interaction between ExceptionNotWrappedInHystrix and HystrixBadRequestException. Thanks @gagoman !
    • Pull 1576 Fix permyriad calculation for 99.9p latency
    • Pull 1524 Javanica: Support rx.Single or rx.Completable types. Thanks @dmgcodevil !
    • Pull 1574 Add unit-test for using a Completable in a HystrixObservableCommand
    • Pull 1572 Javanica: Wire up maximumSize thread-pool property. Thanks @dmgcodevil !
    • Pull 1573 Javanica: Don't get cause from HystrixBadRequestException if null. Thanks @dmgcodevil !
    • Pull 1570 Only create HystrixContextRunnable in timeout case lazily, when timeout is fired
    • Pull 1568 Made circuit-opening happen in background thread, powered by metric streams
    • Pull 1561 Add error-handling for unexpected errors to servlet writes in metric sample servlet
    • Pull 1556 Typo fix in Javanica fallback log. Thanks @Thunderforge !
    • Pull 1551 Match colors in multiple circuit-breaker status case. Thanks @eunmin !
    • Pull 1547 Support multiple circuit-breaker statuses in dashboard against aggregated data. Thanks @eunmin !
    • Pull 1539 Fix unintentionally shared variable in hystrix-metrics-event-stream-jaxrs. Thanks @justinjose28 !
    • Pull 1535 Move markCommandExecution after markEvent SUCCESS to allow eventNotifier to have full context of execution. Thanks @bltb!

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.11(Apr 10, 2017)

    • Pull 1531 Add assertion to dashboard receiving metrics data. Thanks @lholmquist !
    • Pull 1529 Remove commons-collection as dependency of hystrix-javanica. Thanks @Psynbiotik !
    • Pull 1532 Move metrics subscription out of synchronized block in HealthCountsStream to limit time spent holding a lock.
    • Pull 1513 Fixed COMMAND_MAX_ACTIVE metrics for Coda Hale metrics. Thanks @chrisgray !
    • Pull 1515 Fixed comment typo in HystrixCommand. Thanks @kmkr !
    • Pull 1512 Upgrade codahale metrics-core to 3.2.2. Thanks @chrisgray !
    • Pull 1507 README typo fix. Thanks @PiperChester !
    • Pull 1503 Allow BadRequest exceptions to not be attached if user explicitly wants unwrapped exceptions. Thanks @mNantern !
    • Pull 1502 Remove useless code in HystrixConcurrencyStrategy. Thanks @zzzvvvxxxd !
    • Pull 1495 Add hystrix-metrics-event-stream-jaxrs. Thanks @justinjose28 !
    • Pull 1498 Upgrade Servo to 0.10.1 in hystrix-servo-metrics-publisher

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.10(Mar 8, 2017)

    • Pull 1489 Added rollingMaxConcurrentExecutionCount to CodaHale metrics publisher. Thanks @LuboVarga !
    • Pull 1481 Add sanity checking to HystrixCommandAspect to debug unreproducible cases. Thanks @dmgcodevil !
    • Pull 1482 Make it possible to re-use fallback methods in Javanica. (Addresses #1446). Thanks @dmgcodevil !
    • Pull 1488 Fix spelling mistakes in Javanica docs. Thanks @bltb!
    • Pull 1475 Added example usage of CodaHale metrics publisher. Thanks @LuboVarga !
    • Pull 1469 Fix possible concurrency bug. Thanks @petercla!
    • Pull 1453 Add Javanica unit test for NotWrapped checked exception. Thanks @tbvh!

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.9(Dec 21, 2016)

    • Pull 1423 Write correct value to error log when maximumSize < coreSize. Thanks @diver-in-sky!
    • Pull 1412 Javanica: raiseHystrixExceptions support for Observables. Thanks @michaelcowan !
    • Pull 1441 Use Gretty Gradle plugin for hystrix-examples-webapp
    • Pull 1442 Fix handling of client-connect/disconnect never getting released if it occurs before metrics start getting produced by hystrix-metrics-event-stream. Thanks for review, @mattnelson!
    • Pull 1444 More efficient server thread release in hystrix-metrics-event-stream. Thanks @mattnelson for the suggestion!
    • Pull 1443 Use Gretty Gradle plugin for hystrix-dashboard
    • Pull 1445 Add missing onUnsubscribe hook to execution hooks
    • Pull 1414 Introduce NotWrappedByHystrix exception type to indicate Hystrix should propagate it back without wrapping in a HystrixRuntimeException. Thanks @tbvh!
    • Pull 1448 Remove dependency on jackson-cbor in hystrix-serialization. This belongs in a different module. Existing public methods now throw an exception.
    • Pull 1435 Allow the property allowMaximumSixeToDivergeFromCoreSize to be set dynamically. Thanks @ptab!
    • Pull 1447 Allow the property allowMaximumSixeToDivergeFromCoreSize to be set dynamically.
    • Pull 1449 Introduce a distinction between maximumSize (configured value) and actualMaximumSize (value used to set the thread pool maximum size). Publish both values to make understanding configuration more straightforward. Thanks @ptab!

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.8(Nov 10, 2016)

  • v1.5.7(Nov 1, 2016)

    • Pull 1408 Fix Clojure key name for collapsing. Thanks @crimeminister !
    • Pull 1407 Reset percentile snapshot whenever all HystrixRollingPercentile buckets are empty
    • Pull 1397 Javanica: Add option to raise HystrixRuntimeException
    • Pull 1399 Add configuration to make users opt-in to allowing coreSize and maximumSize to diverge. See config here
    • Pull 1396 If command is unsubscribed before any work is done, return Observable.empty().
    • Pull 1393 Javanica: Performance improvement by caching weavingMode boolean. Thanks @ricardoletgo !
    • Pull 1389 Javanica: Send fallback exception to client instead of primary command. Thanks @dmgcodevil !
    • Pull 1385 Bump jmh Gradle plugin to 0.3.1. Thanks @monkey-mas!
    • Pull 1382 Bump jmh to 1.15. Thanks @monkey-mas!
    • Pull 1380 Add jmh test for open-circuit case
    • Pull 1376 Clean up documentation around thread keep-alive. Thanks @bitb !
    • Pull 1375 Remove cancelled tasks from threadpool queue
    • Pull 1371 Allow core and maximum size of threadpools to diverge.

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.6(Sep 28, 2016)

    • Pull 1368 Upgrade jmh to 1.14.1
    • Pull 1365 Upgrade to Gradle 3.1 / Nebula 3.4.0
    • Pull 1364 Fix backwards-incompatibility introduced in #1356
    • Pull 1363 Fix metrics regression where thread pool objects without any executions were being sent out in metrics streams
    • Pull 1360 Convert command-construction jmh test to single-shot
    • Pull 1356 Add better AppEngine detection mechanism that allows GAE-Flexible to work like any other JVM. Thanks @cadef!
    • Pull 1353 Upgrade to RxJava 1.2.0
    • Pull 1351 Remove histogram object-pooling
    • Pull 1336 Overall Dashboard UX improvements. Thanks @kennedyoliveira !
    • Pull 1320 Adding example of HystrixObservableCollapser. Thanks @zsoltm !
    • Pull 1341 Javanica fix for handling commands with generic types. Thanks @dmgcodevil !
    • Pull 1340 Refactor how commands determine if fallbacks are user-defined

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.5(Aug 18, 2016)

  • v1.5.4(Aug 5, 2016)

    Note this release is incompatible with JDK7 (unintentionally). Fixed in v1.5.5

    • Pull 1308 Update jmh to 1.13
    • Pull 1310 Update nebula.netflixoss Gradle plugin to 3.3.0
    • Pull 1309 Update HdrHistogram to 2.1.9
    • Pull 1307 Update RxJava to 1.1.8
    • Pull 1306 Update Clojure to 1.7.0 and nebula-clojure-plugin to 4.0.1
    • Pull 1305 Update Gradle to 2.14
    • Pull 1304 Make all metrics streams multicast.
    • Pull 1303 Update RxNetty to 0.4.17
    • Pull 1302 Manual merge of #1265. Interrupt execution thread on HystrixCommand#queue()#cancel(true). Thanks @mmanciop!
    • Pull 1300 Update all completion state for scalar command in the onNext handling
    • Pull 1294 Make sure that threadpools shutdown when asked to. Thanks @thesmith!
    • Pull 1297 Fix typo in README. Thanks @ManishMaheshwari!
    • Pull 1295 Fix typo in README. Thanks @C-Otto!
    • Pull 1273 Corrected ignoreExceptions for Observable-returning methods. Thanks @jbojar!
    • Pull 1197 Eureka integration for Hystrix dashboard. Thanks @diegopacheco!
    • Pull 1278 Prevent duplicate arguments from getting into a single collapser RequestBatch
    • Pull 1277 Make HystrixCollapser.toObservable lazy
    • Pull 1276 Make HystrixObservableCollapser.toObservable lazy
    • Pull 1271 Fix race condition in all of the Hystrix*Key.asKey methods. Thanks @daniilguit!
    • Pull 1274 Make AbstractCommand.toObservable lazy
    • Pull 1270 Fix deprecation warnings by upgrading RxJava and Netty usages
    • Pull 1269 Rework hystrix-data-stream module to just include serialization logic
    • Pull 1259 Javanica: added DefaultProperties annotation. Thanks @dmgcodevil!
    • Pull 1261 Add toString() to key implementations. Thanks @mebigfatguy!
    • Pull 1258 Javanica: Change getMethod to recursively search in parent types. Thanks @dmgcodevil!
    • Pull 1255 Introduce intermediate data streams module [LATER REVERTED - SEE #1269 ABOVE]
    • Pull 1254 Allow multiple consumers of sample data to only trigger work once and share data
    • Pull 1251 Fix Dashboard RPS
    • Pull 1247 Call thread pool size setters only when pool size changes. Thanks @yanglifan!
    • Pull 1246 Move HystrixDashboardStream to hystrix-core
    • Pull 1244 Fix handling of invalid weavingMode property. Thanks @mebigfatguy!
    • Pull 1238 Local variable caching fixups. Thanks @mebigfatguy!
    • Pull 1236 ReactiveSocket metrics client/server
    • Pull 1235 Add demo that composes async command executions
    • Pull 1231 Make inner classes static where possible, and remove outer class reference. Thanks @mebigfatguy!
    • Pull 1229 Remove dead Setter class from RequestCollapserFactory. Thanks @mebigfatguy!
    • Pull 1225 Remove unused thunk from HystrixCommandMetrics. Thanks @mebigfatguy!
    • Pull 1224 Remove dead field from RequestCollapserFactory. Thanks @mebigfatguy!
    • Pull 1221 Improve grammar in comments and log messages. Thanks @dysmento !
    • Pull 1211 Add ReactiveSocket metrics stream. Thanks @robertroeser!
    • Pull 1219 Move map lookup outside of loop in collapser code. Thanks @mebigfatguy!

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.3(May 25, 2016)

    The largest new feature in this release is that cancellation is now supported. Either calling cancel() on the result of HystrixCommand.queue() or unsubscribe() on the result of HystrixCommand.toObservable().subscribe() will propagate the cancellation to the underlying work.

    • Pull 1218 Fixing unsubscription races by modeling explicit FSMs for command and thread execution state
    • Pull 1217 Remove dead code in RequestEventsStream. Thanks @mebigfatguy!
    • Pull 1214 Fix Servo metric calculation. Bug identified by @AchimWe.
    • Pull 1213 Use parameterized logging. Thanks @mebigfatguy!
    • Pull 1212 Correct logging contexts. Thanks @mebigfatguy!
    • Pull 1210 Javanica: code optimization to fetch parameters only if needed. Thanks @mebigfatguy!
    • Pull 1209 Fixed thread-state cleanup to happen on unsubscribe or terminate
    • Pull 1208 Reorganization of HystrixCollapser/HystrixObservableCollapser logic to support cancellation
    • Pull 1207 Fix command concurrency metric in light of cancellation
    • Pull 1206 Added subscribeOn to HystrixObservableCommand in JMH test to make it async
    • Pull 1204 Reorganization of AbstractCommand logic to support cancellation
    • Pull 1198 Release semaphores upon cancellation.
    • Pull 1194 Improved tests readability a bit by letting exceptions propagate out. Thanks @caarlos0!
    • Pull 1193 More tests using HystrixRequestContext rule. Thanks @caarlos0!
    • Pull 1181 Deprecate getter and setter for unused collapsingEnabled property in Collapser Setter. Thanks @nluchs!
    • Pull 1184 migrating all hystrix-javanica tests to hystrix-junit. Thanks @caarlos0!
    • Pull 1147 Added hystrix-junit. Thanks @caarlos0!

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.4.26(Apr 12, 2016)

  • v1.5.2(Apr 11, 2016)

    • Pull 1171 Do all histogram latency summarization upfront to minimize storage/operations on them
    • Pull 1167 Javanica: Switch hystrix-javanica to use getExecutionException, which returns Exception object even when command is not executed
    • Pull 1157 Make HystrixMetricsPoller a daemon thread
    • Pull 1154 Remove more unused methods
    • Pull 1151 Remove unused method in HystrixCollapserProperties
    • Pull 1149 Make queue size of MetricJsonListener configurable
    • Pull 1124 Turning down loglevels of metrics streams
    • Pull 1120 Making the HystrixTimeoutException instance per-command, not static

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.4.25(Mar 16, 2016)

  • v1.5.1(Mar 4, 2016)

  • v1.5.0(Mar 4, 2016)

    The general premise of this release is to make metrics more flexible within Hystrix. See https://github.com/Netflix/Hystrix/wiki/Metrics-and-Monitoring for a deep dive on the new metrics architecture. The high-level approach is to model metrics directly as a stream, so that Hystrix metrics consumers may aggregate the metrics as they wish. In 1.4.x and prior releases, HystrixRollingNumber and HystrixRollingPercentile were used to store aggregate command counters and command latencies, respectively. These are no longer used.

    Instead, new concepts like HystrixCommandCompletionStream are present. These may be consumed by a rolling, summarizing data structure (like HystrixRollingNumber), or they may be consumed without any aggregation at all. This should allow for all metrics processing to move off-box, if you desire to add that piece to your infrastructure.

    This version should be backwards-compatible with v1.4.x. If you find otherwise, please submit a Hystrix issue as it was unintentional.

    This version also introduces new metric streams: (configuration and Utilization) have been added, along with a request-scoped stream.

    Archaius is now a soft-dependency of Hystrix, so you can supply your own configuration mechanism.

    Some known semantic changes:

    • Latencies for timeouts and bad-requests are now included in command latency
    • Latency distribution percentiles are now calculated with HdrHistogram library and don't have a max number of elements in the distribution
    • Previously, HealthCounts data allowed reads to see the value in the "hot" bucket. (the one currently being written to). That does not happen anymore - only full read-only buckets are available for reads.
    • Bucket rolling now happens via Rx background threads instead of unlucky Hystrix command threads. This makes command performance more predictable. User-thread latency is now practically indistinguishable from command latency.

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.4.24(Feb 29, 2016)

  • v1.5.0-rc.5(Feb 24, 2016)

  • v1.5.0-rc.4(Feb 19, 2016)

  • v1.5.0-rc.3(Feb 12, 2016)

    This version does not have any known bugs, but is not recommended for production use until 1.5.0.

    A few dependency bumps, but the major change here is that Archaius is now a soft dependency of hystrix-core. Thanks to @agentgt for the PR!. Thanks also to @caarlos0 for the NPE fix in HystrixRequestCache.

    Included changes:

    • Pull 1079 Remove dynamic config lookup in HystrixThreadPool
    • Pull 1081 Cleanup hystrix-javanica BadRequest docs
    • Pull 1093 Fix NPE in HystrixRequestCache when HystrixRequestContext not initialized
    • Pull 1083 Made Archaius a soft dependency of hystrix-core. It is now possible to run without Archaius and rely on j.u.l.ServiceLoader or system properties only
    • Pull 1095 Upgrade to Nebula netflixoss 3.2.3
    • Pull 1096 Upgrade to RxJava 1.1.1
    • Pull 1097 Fix POM generation by excluding WAR artifacts

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.0-rc.2(Jan 30, 2016)

    This version does not have any known bugs, but is not recommended for production use until 1.5.0.

    This is mostly a new set of features building on top of Release Candidate 1. Specifically, some sample streams (Configuration and Utilization) have been added, along with a request-scoped stream.

    Included changes:

    • Pull 1050 Modular command construction
    • Pull 1061 Sample config/utilization streams, and request-scoped streams
    • Pull 1064 Safer enum references in case mismatched Hystrix jars are deployed together
    • Pull 1066 Layer of abstraction on top of ThreadFactory, so AppEngine can run Hystrix
    • Pull 1067 Decouple sample stream JSON from servlets
    • Pull 1067 Decouple request-scoped stream JSON from servlets
    • Pull 1075 Deprecate userThreadLatency, since it is practically identical to executionLatency now

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.5.0-rc.1(Jan 19, 2016)

    This version does not have any known bugs, but is not recommended for production use until 1.5.0.

    The general premise of this release is to make metrics more flexible within Hystrix. See https://github.com/Netflix/Hystrix/wiki/Metrics-and-Monitoring for a deep dive on the new metrics architecture. The high-level view is to make the metrics primitive a stream instead of an aggregate. In 1.4.x and prior releases, HystrixRollingNumber and HystrixRollingPercentile were used to store aggregate command counters and command latencies, respectively. These are no longer used.

    Instead, new concepts like HystrixCommandCompletionStream are present. These may be consumed by a rolling, summarizing data structure (like HystrixRollingNumber), or they may be consumed without any aggregation at all. This should allow for all metrics processing to move off-box, if you desire to add that piece to your infrastructure.

    This version should be backwards-compatible with v1.4.x. If you find otherwise, please submit a Hystrix issue as it was unintentional.

    Some known semantic changes:

    • Latencies for timeouts and bad-requests are now included in command latency
    • Latency distribution percentiles are now calculated with HdrHistogram library and don't have a max number of elements in the distribution
    • Previously, HealthCounts data allowed reads to see the value in the "hot" bucket. (the one currently being written to). That does not happen anymore - only full read-only buckets are available for reads.
    • Bucket rolling now happens via Rx background threads instead of unlucky Hystrix command threads. This makes command performance more predictable. User-thread latency is now practically indistinguishable from command latency.

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.4.23(Jan 14, 2016)

    • Pull 1032 Make number of timer threads a piece of config (with Archaius integration)
    • Pull 1045 Documentation cleanup in HystrixCommandProperties
    • Pull 1044 Add request context and HystrixObservableCommand to command execution JMH tests
    • Pull 1043 HystrixObservableCollapser emits error to each submitter when batch command encounters error
    • Pull 1039 Use thread-safe data structure for storing list of command keys per-thread
    • Pull 1036 Remove redundant ConcurrentHashMap read when getting name from command class
    • Pull 1035 Rename command execution JMH tests
    • Pull 1034 Remove SHORT_CIRCUITED events from health counts calculation
    • Pull 1027 Fix typo in hystrix-examples-webapp documentation

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.4.22(Dec 29, 2015)

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.4.21(Nov 17, 2015)

  • v1.4.20(Nov 11, 2015)

    • Pull 965 Upgrade Nebula Gradle plugin
    • Pull 962 Javanica: Support for async commands
    • Pull 960 Avoid Clojure reflection in hystrix-clj
    • Pull 957 Javanica: Fix threadpool properties
    • Pull 956 Upgrade JMH from 1.10.3 to 1.11.1
    • Pull 945 Javanica: Compile-time weaving support
    • Pull 952 Tolerate lack of RequestContext better for custom concurrency strategies
    • Pull 947 Upgrade RxNetty to 0.4.12 for RxNetty metrics stream
    • Pull 946 More extension-friendly Yammer metrics publisher
    • Pull 944 Fix generated POM to include dependencies in 'compile' scope
    • Pull 942 Fix metrics stream fallbackEmit metric
    • Pull 941 Add FALLBACK_MISSING event type and metric

    Artifacts: Maven Central, Bintray

    Source code(tar.gz)
    Source code(zip)
  • v1.4.19(Nov 10, 2015)

  • v1.4.18(Oct 14, 2015)

  • v1.4.17(Oct 7, 2015)

Owner
Netflix, Inc.
Netflix Open Source Platform
Netflix, Inc.
Fault tolerance and resilience patterns for the JVM

Failsafe Failsafe is a lightweight, zero-dependency library for handling failures in Java 8+, with a concise API for handling everyday use cases and t

Jonathan Halterman 3.9k Dec 29, 2022
Resilience4j is a fault tolerance library designed for Java8 and functional programming

Fault tolerance library designed for functional programming Table of Contents 1. Introduction 2. Documentation 3. Overview 4. Resilience patterns 5. S

Resilience4j 8.5k Jan 2, 2023
A reactive Java framework for building fault-tolerant distributed systems

Atomix Website | Javadoc | Slack | Google Group A reactive Java framework for building fault-tolerant distributed systems Please see the website for f

Atomix 2.3k Dec 29, 2022
APM, (Application Performance Management) tool for large-scale distributed systems.

Visit our official web site for more information and Latest updates on Pinpoint. Latest Release (2020/01/21) We're happy to announce the release of Pi

null 12.5k Dec 29, 2022
Orbit - Virtual actor framework for building distributed systems

Full Documentation See the documentation website for full documentation, examples and other information. Orbit 1 Looking for Orbit 1? Visit the orbit1

Orbit 1.7k Dec 28, 2022
Ribbon is a Inter Process Communication (remote procedure calls) library with built in software load balancers. The primary usage model involves REST calls with various serialization scheme support.

Ribbon Ribbon is a client side IPC library that is battle-tested in cloud. It provides the following features Load balancing Fault tolerance Multiple

Netflix, Inc. 4.4k Jan 4, 2023
Abstract the use of amazon lex / google dialog flow, while also support complex conditional flows

amazon-lex-gcp-diaglogflow-abstraction on simply put: ALGDA :) In this project I try to abstract the use of amazon lex first, but then also google's d

Shimon Magal 10 Apr 19, 2021
Build highly concurrent, distributed, and resilient message-driven applications on the JVM

Akka We believe that writing correct concurrent & distributed, resilient and elastic applications is too hard. Most of the time it's because we are us

Akka Project 12.6k Jan 3, 2023
Distributed Stream and Batch Processing

What is Jet Jet is an open-source, in-memory, distributed batch and stream processing engine. You can use it to process large volumes of real-time eve

hazelcast 1k Dec 31, 2022
Apache Mesos is a cluster manager that provides efficient resource isolation and sharing across distributed applications, or frameworks

Apache Mesos is a cluster manager that provides efficient resource isolation and sharing across distributed applications, or frameworks. It can run Hadoop, Jenkins, Spark, Aurora, and other frameworks on a dynamically shared pool of nodes.

The Apache Software Foundation 5k Dec 31, 2022
BitTorrent library and client with DHT, magnet links, encryption and more

Bt A full-featured BitTorrent implementation in Java 8 peer exchange | magnet links | DHT | encryption | LSD | private trackers | extended protocol |

Andrei Tomashpolskiy 2.1k Jan 2, 2023
Fibers, Channels and Actors for the JVM

Quasar Fibers, Channels and Actors for the JVM Getting started Add the following Maven/Gradle dependencies: Feature Artifact Core (required) co.parall

Parallel Universe 4.5k Dec 25, 2022
Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.

Zuul Zuul is an L7 application gateway that provides capabilities for dynamic routing, monitoring, resiliency, security, and more. Please view the wik

Netflix, Inc. 12.4k Jan 3, 2023
a blockchain network simulator aimed at researching consensus algorithms for performance and security

Just Another Blockchain Simulator JABS - Just Another Blockchain Simulator. JABS is a blockchain network simulator aimed at researching consensus algo

null 49 Jan 1, 2023
Simple and lightweight sip server to create voice robots, based on vert.x

Overview Lightweight SIP application built on vert.x. It's intended to be used as addon for full-featured PBX to implement programmable voice scenario

Ivoice Technology 7 May 15, 2022
Fault tolerance and resilience patterns for the JVM

Failsafe Failsafe is a lightweight, zero-dependency library for handling failures in Java 8+, with a concise API for handling everyday use cases and t

Jonathan Halterman 3.9k Dec 29, 2022
Fault tolerance and resilience patterns for the JVM

Failsafe Failsafe is a lightweight, zero-dependency library for handling failures in Java 8+, with a concise API for handling everyday use cases and t

Jonathan Halterman 3.9k Jan 2, 2023
Fault tolerance and resilience patterns for the JVM

Failsafe Failsafe is a lightweight, zero-dependency library for handling failures in Java 8+, with a concise API for handling everyday use cases and t

Failsafe 3.9k Dec 29, 2022