Можно ли совместно использовать один и тот же пул потоков Hystrix для разных вызовов к одному и тому же удаленному ресурсу? - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу использовать Hystrix для реализации шаблона переборки в службе лицензирования , создавая отдельные пулы потоков для двух категорий вызовов удаленных ресурсов.В первой категории я хочу сгруппировать все вызовы в базе данных , а во второй - в 100 * * организационную службу .

.image
- Taken from Spring Microservices in Action книга, глава 5.

В официальном списке рассылки для проекта Hystrix я нашел следующую рекомендацию.

Если вы вызываете службу с помощью нескольких команд, вероятно, частота отказов этих команд коррелируется.т.е. если вы настраиваете пограничную службу A для вызова промежуточной службы B с 5 различными командами, то любая общая проблема в службе B проявляется в избыточной частоте отказов / задержке для всех 5 команд одновременно.Если они коррелированы, то предоставление отдельного пула потоков для каждого не обеспечивает дополнительной устойчивости.(...) Таким образом, общее правило состоит в том, чтобы объединять команды, попадающие в одну и ту же систему, в один и тот же пул потоков, если только у вас нет веских причин не делать этого.
- взято из Нужно ли создавать отдельный пул Hystrix Thread для каждого удаленного вызова? .

Итак, я хотел бы знать, можно ли использовать один и тот же потокпул для разных звонков на один и тот же удаленный ресурс .Например, операции 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);
    }

}
...