是否可以为同一远程资源的不同调用共享同一Hystrix线程池?

时间:2019-02-24 16:46:59

标签: java spring spring-cloud spring-cloud-netflix hystrix

我想使用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?

因此,我想知道是否可以为同一远程资源的不同调用共享同一线程池。例如,数据库中的findsaveupdatedelete操作。

我曾考虑过指定相同的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);
    }

}

0 个答案:

没有答案