Я хочу использовать Hystrix для реализации шаблона переборки в службе лицензирования , создавая отдельные пулы потоков для двух категорий вызовов удаленных ресурсов.В первой категории я хочу сгруппировать все вызовы в базе данных , а во второй - в 100 * * организационную службу .
.
- 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);
}
}