Hystrix Circuit обрывается мгновенно, когда одновременно получено 10 входов - PullRequest
0 голосов
/ 16 мая 2019

Это сервис сопоставления заказов.При тестировании мы наблюдали, что сервис работает отлично, пока X-ордер совпадает с Y-ордерами до глубины 9. Чтобы объяснить, есть ли 9 ордеров на продажу, и покупатель размещает ордер на покупку, чтобы купить все 9 ордеров в одной сделкеСлужба выполняется полностью.

, но проблема начинается, если в книге заказов более 9 заказов.Hystrix настроен на стратегию THREAD с тайм-аутом 120000. Но как только выполняется более 9 заказов, возникает ошибка «SHORT-CIRCUIT», и все приложение приостанавливается на 5-10 минут.

  1. Пробовал увеличивать время ожидания, но не помогло.
  2. отлаженный код с другой логикой, но отлично работает до 9 заказов одновременно.

    import java.util.Optional;

    @ Service @ Log4j

открытый класс MatchService {

@Autowired
OrderRepository orderRepository;

@Autowired
OrderSecureGatewayClient orderGatewayClient;


public void saveOrder(MatchOrderRequest matchOrderRequest) {
    ExecuteOrderRequest executeOrderRequest = new ExecuteOrderRequest();
    ExecuteOrderRequest.Order executedOrder = new ExecuteOrderRequest.Order();

    synchronized (this) {
        MatchOrder request = new MatchOrder();
        request.setVolume(matchOrderRequest.getVolume());
        request.setPrice(matchOrderRequest.getPrice());
        request.setOrderType(matchOrderRequest.getOrderType());
        request.setOrderId(matchOrderRequest.getOrderId());
        request.setMarket(matchOrderRequest.getMarket());
        request.setTimestamp(System.currentTimeMillis());
        request = orderRepository.save(request);
        Optional<MatchOrder> optionalMatchOrder;

        log.info("Order Type: " + matchOrderRequest.getOrderType());
        if (matchOrderRequest.getOrderType() == OrderType.BUY) {

            optionalMatchOrder = orderRepository.
                    findTopByMarketAndOrderTypeAndPriceLessThanEqualOrderByPriceAsc(request.getMarket(), OrderType.SELL, request.getPrice());
                    log.info(">>>>>> Buy order found <<<<<< " + request.getMarket() + "Price: " + request.getPrice());

        } else {
            optionalMatchOrder = orderRepository.
                    findTopByMarketAndOrderTypeAndPriceGreaterThanEqualOrderByPriceDesc(request.getMarket(), OrderType.BUY, request.getPrice());


        }
        log.info(optionalMatchOrder.toString());
        if (optionalMatchOrder.isPresent()) {
            executedOrder.setOrderId(request.getOrderId());


            ExecuteOrderRequest.Order pOrder = new ExecuteOrderRequest.Order();
            pOrder.setOrderId(optionalMatchOrder.get().getOrderId());

            executeOrderRequest.setExecutedOrder(executedOrder);
            executeOrderRequest.setAgainstOrder(pOrder);

            orderRepository.delete(request.getId());
            orderRepository.delete(optionalMatchOrder.get().getId());

        }
    }
    if (executeOrderRequest.getAgainstOrder() != null && executeOrderRequest.getExecutedOrder() != null) {
        orderGatewayClient.orderExecuted(executeOrderRequest);
    }
}

Приложение.YML

eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_URI:http://localhost:8000/eureka/}
  instance:
preferIpAddress: true

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false
        isolation:
          strategy: THREAD
          thread:
            timeoutInMilliseconds: 120000
ribbon:
  eureka:
    enabled: true
      MaxAutoRetries: 0
      MaxAutoRetriesNextServer: 0
      ConnectTimeout: 120000
      ReadTimeout: 120000
      OkToRetryOnAllOperations: false

Нам нужен сервис сопоставления для работы независимо от количества одновременно выполняемых заказов.Даже если кто-то хочет выкупить всю книгу заказов, она не должна вызывать короткое замыкание.

...