2016-09-27 4 views
3

Я работаю над загрузочным приложением Spring Spring с поддержкой Hystrix, используя Reactive Observables и пытаясь выяснить, как работает тайм-аут. Я предположил, что если тайм-аут произошел во время выполнения, Hystrix немедленно вернет ответ (резерв или исключение). Теперь это, похоже, не соответствует моему коду ниже. Вместо этого звонок на myService.getString() блокируется на 5 секунд. Когда он, наконец, вернется, выполняется каскадная лямбда.Как работают тайм-ауты в Hystrix с Observables?

Являются ли мои допущения неправильными или что-то еще неправильно ниже?

@SpringBootApplication 
@EnableCircuitBreaker 
public class App { 
    public static void main(String[] args) { 
    ApplicationContext ctx = SpringApplication.run(App.class, args); 
    } 
} 

@RestController 
public class MyController { 

    @Autowired 
    private MyService myService; 

    @RequestMapping("/") 
    public DeferredResult index() { 

    DeferredResult<String> result = new DeferredResult<>(); 
    Observable<String> res = myService.getString(); 

    res.subscribe(s -> { 
       result.setResult("Got a " + s); 
      }, 
      throwable -> { 
       result.setErrorResult("Got a " + throwable.getMessage()); 
      }); 

    return result; 
    } 
} 


@Service 
public class MyService { 

    @HystrixCommand() // Default timeout is 1 sec 
    public Observable<String> getString() { 
    return Observable.create(subscriber -> { 
     if (!subscriber.isUnsubscribed()) { 

      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      subscriber.onNext("regular response"); 
      subscriber.onCompleted(); 
     } 
    }); 
    } 
} 

pom.xml: http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

<groupId>dag</groupId> 
    <artifactId>dag</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.1.RELEASE</version> 
    </parent> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.springframework.cloud</groupId> 
       <artifactId>spring-cloud-dependencies</artifactId> 
       <version>Camden.RELEASE</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-hystrix</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.netflix.hystrix</groupId> 
      <artifactId>hystrix-javanica</artifactId> 
      <version>1.5.5</version> 
     </dependency> 
    </dependencies> 

    <properties> 
     <java.version>1.8</java.version> 
    </properties> 


    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Спасибо за любую помощь!

ответ

1

Просьба разъяснить, что изоляция вашей команды Hystrix и что Hystrix версии вы использовали?

«Тайм-ауты теперь применяются к командам с изолированным семафором, а также к поточно-изолированные команды. До 1.4.x команды с изолированным семафором не могли пропустить тайм-аут. Теперь у них есть тайм-аут, зарегистрированный на другом потоке (HystrixTimer), который запускает поток тайм-аута. Если вы используете команды семафора-изолированный, они теперь будут таймауты»

В любом случае попробуйте:.

  1. коммутатор нитку изоляцию с собственным бассейном резьбы
  2. Сна в цикле с меньшими периодами.
+0

Спасибо за помощь. По умолчанию используется уровень изоляции THREAD, поэтому я использую это. – DagR

+0

Хорошо ... По умолчанию, похоже, SEMAPHORE, а не THREAD, как указано в документах: https://github.com/Netflix/Hystrix/wiki/Configuration#execution – DagR

0

Установка execution.isolation.strategy для THREAD решает мой вопрос.

@HystrixCommand(
    commandProperties = { 
    @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD") 
    } 
) 

Документы утверждают, что HystrixCommand по умолчанию использует THREAD, но это немного отличается для javanica @HystrixCommand, который создает различные типы в зависимости от типа возвращаемого значения аннотированных метода. HystrixCommand или HystrixObservableCommand. И HystrixObservableCommand имеет SEMAPHORE в качестве стратегии изоляции по умолчанию.

Для получения более подробной информации см. https://github.com/Netflix/Hystrix/issues/1383.

 Смежные вопросы

  • Нет связанных вопросов^_^