java 并行执行命令_java – 如何并行执行Hystrix命令?

我的应用程序中的一种

Spring服务方法向另外两个微服务发出请求.我想使用Hystrix做出这些请求以使其具有容错能力,并且我想并行运行它们.

到目前为止,我为每个调用实现了HystrixObservableCommand,并使用CountDownLatch等待两个命令完成(或失败).

目前的解决方案看起来非常冗长.是否可以使用Observable功能并行执行Hystrix命令?

在伪代码中,所需的解决方案看起来像:

new LoadCustomerObservableCommand(customerClient, customerId).toObservable()

.doOnError(throwable -> log.error("Failed to retrieve customer {} information for the reservation {}", customerId, reservationId, throwable))

.doOnNext(customer -> myResponse.setCustomer(customer));

new GetTicketsObservableCommand(ticketsClient, reservationId).toObservable()

.doOnError(throwable -> log.error("Failed to retrieve tickets for the reservation {}", reservationId, throwable))

.doOnNext(tickets -> myResponse.setTickets(tickets));

final AtomicBoolean subRequestsFailed = new AtomicBoolean(false);

Observable.zip(customerObservable, ticketsObservable, (customer, tickets) -> null)

.doOnError(throwable -> subRequestsFailed.set(true))

.toBlocking()

.first();

if (subRequestsFailed.get()) {

throw new HystrixBadRequestException("One or more requests to submodules have been failed");

}

return dto;

不幸的是,这个理想的解决方案不起作用,因为Hystrix命令永远不会被执行.

我目前的解决方案是:

// execute requests to sub modules in parallel

final CountDownLatch cdl = new CountDownLatch(2);

final List failures = new ArrayList<>();

// load customer information

final Observable customerObservable = customerRxClient.loadCustomer(customerId);

customerObservable

.doOnError(throwable -> {

log.error("Failed to retrieve customer {} information for the reservation {}", customerId, reservationId, throwable);

cdl.countDown();

failures.add(throwable);

})

.doOnCompleted(cdl::countDown)

.subscribe(customer -> {

dto.getReservationOwner().setBirthday(customer.getBirthday());

dto.getReservationOwner().setCustomerId(customer.getCustomerId());

dto.getReservationOwner().setCitizenship(customer.getCitizenship());

dto.getReservationOwner().setEmail(customer.getEmail());

dto.getReservationOwner().setFirstName(customer.getFirstName());

dto.getReservationOwner().setGender(customer.getGender());

dto.getReservationOwner().setLastName(customer.getLastName());

dto.getReservationOwner().setPhone(ofNullable(customer.getPhone()).map(v -> mappingService.map(v, PhoneDTO.class)).orElse(null));

});

// load tickets

final Observable> ticketsObservable = ticketsClient.getTickets(reservationId);

ticketsObservable

.doOnError(throwable -> {

log.error("Failed to retrieve tickets for the reservation {}", reservationId, throwable);

cdl.countDown();

failures.add(throwable);

})

.doOnCompleted(cdl::countDown)

.subscribe(tickets -> dto.setTickets(tickets.stream()

.map(ticket -> ReservationDTO.TicketDTO.builder()

.guestSeqN(ticket.getGuestSeqN())

.qr(ticket.getQr())

.qrText(ticket.getQrText())

.usedAt(ticket.getUsedAt())

.build())

.collect(toList())));

try {

cdl.await();

} catch (InterruptedException _ignore) {

log.debug("Count down latch has been interrupted!", _ignore);

}

if (!failures.isEmpty()) {

throw new HystrixBadRequestException("Request to submodule has been failed");

}

return dto;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hystrix的执行流程主要包括以下几个步骤: 1. 请求到达HystrixCommand对象:当一个请求到达HystrixCommand对象时,Hystrix会检查该请求是否已经有一个Command正在执行,如果有,则会直接使用该Command执行,否则会创建一个新的Command对象。 2. 判断是否需要短路:在执行Command前,Hystrix会判断是否需要短路。如果短路器开启了,并且有足够多的请求失败,则会短路,直接返回fallback结果。 3. 执行Command:Hystrix会执行Command的run()方法,该方法就是我们编写的业务逻辑代码。在执行run()方法时,Hystrix会监控它的执行时间、失败率等指标。 4. 判断是否需要降级:如果Command执行失败或超时,Hystrix会判断是否需要降级。如果需要降级,则会执行fallback()方法,该方法就是我们编写的降级逻辑。 5. 统计执行结果:无论是run()还是fallback()方法执行完毕后,Hystrix都会统计执行结果。如果Command执行成功,则会记录成功的次数;如果执行失败,则会记录失败的次数。 6. 更新短路器状态:在统计执行结果后,Hystrix会根据执行结果更新短路器的状态。如果失败率过高,则会打开短路器;如果失败率降低,则会关闭短路器。 7. 返回执行结果:最后,Hystrix会返回Command的执行结果,如果Command执行成功,则会返回业务逻辑的结果;如果Command执行失败或降级,则会返回fallback的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值