Это сервис сопоставления заказов.При тестировании мы наблюдали, что сервис работает отлично, пока X-ордер совпадает с Y-ордерами до глубины 9. Чтобы объяснить, есть ли 9 ордеров на продажу, и покупатель размещает ордер на покупку, чтобы купить все 9 ордеров в одной сделкеСлужба выполняется полностью.
, но проблема начинается, если в книге заказов более 9 заказов.Hystrix настроен на стратегию THREAD с тайм-аутом 120000. Но как только выполняется более 9 заказов, возникает ошибка «SHORT-CIRCUIT», и все приложение приостанавливается на 5-10 минут.
- Пробовал увеличивать время ожидания, но не помогло.
отлаженный код с другой логикой, но отлично работает до 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
Нам нужен сервис сопоставления для работы независимо от количества одновременно выполняемых заказов.Даже если кто-то хочет выкупить всю книгу заказов, она не должна вызывать короткое замыкание.