我想使用Hystrix在许可服务中实现 bulkhead模式,从而为两类远程资源调用创建隔离的线程池。在第一类中,我想将对数据库的所有呼叫分组,在第二类中,我要对对组织服务的呼叫分组。
-摘自Spring Microservices in Action书第5章。
我在official mailing list上为Hystrix项目找到了以下建议。
如果您通过多个命令调用服务,则这些命令的故障率很可能是相关的。即,如果您正在配置边缘服务A以使用5条不同的命令来调用中间服务B,则服务B上的任何一般问题都将表现为同时出现在所有5条命令上的超额失败率/等待时间。如果它们是相关的,则为每个线程池提供单独的线程池不会提供任何额外的弹性。 (...)因此,一般规则是将命中相同系统的命令合并到同一线程池中,除非您有充分的理由不这样做。
-取自Should create a separate Hystrix Thread pool for each remote call?。
因此,我想知道是否可以为同一远程资源的不同调用共享同一线程池。例如,数据库中的find
,save
,update
和delete
操作。
我曾考虑过指定相同的threadPoolKey
(如下所示),但是我不确定这是正确的方法,还是不确定如何仅在一个地方配置每个线程池。我什至没有看到groupKey
选项和@DefaultProperties
批注,但找不到答案。
@Service
public class LicenseService {
@Autowired
private LicenseRepository licenseRepository;
@Autowired
private OrganizationFeignClient organizationFeignClient;
//--------------------------------------------------------------------
@HystrixCommand(threadPoolKey = "organizationThreadPool")
private List<Organization> retrieveAllOrgInfo(){
return organizationFeignClient.findAllOrganizations();
}
@HystrixCommand(threadPoolKey = "organizationThreadPool")
private Organization retrieveOrgInfo(String organizationId){
return organizationFeignClient.findOrganization(organizationId);
}
//--------------------------------------------------------------------
@HystrixCommand(threadPoolKey = "licenseThreadPool")
public License findLicense(String organizationId, String licenseId) {
License license = licenseRepository.findByOrganizationIdAndLicenseId(organizationId, licenseId);
Organization org = retrieveOrgInfo(organizationId);
return license
.withOrganizationName(org.getName())
.withContactName(org.getContactName())
.withContactEmail(org.getContactEmail())
.withContactPhone(org.getContactPhone());
}
@HystrixCommand(threadPoolKey = "licenseThreadPool")
public List<License> findLicensesByOrg(String organizationId){
return licenseRepository.findByOrganizationId(organizationId);
}
@HystrixCommand(threadPoolKey = "licenseThreadPool")
public void saveLicense(License license){
license.withId( UUID.randomUUID().toString());
licenseRepository.save(license);
}
@HystrixCommand(threadPoolKey = "licenseThreadPool")
public void updateLicense(License license){
licenseRepository.save(license);
}
@HystrixCommand(threadPoolKey = "licenseThreadPool")
public void deleteLicense(License license){
licenseRepository.delete(license);
}
}