Шаблон проектирования для вызовов API RateLimited - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть класс обслуживания, который должен вызывать API, отличные от других.Но у каждого API есть свои ограничения, поэтому я использую Ratelimiter Guava для обеспечения ограничения операции

@Singleton

public class A {

    private final RateLimiter apiCallX;
    private final int timeoutInSecondsForAPIX;

    private final RateLimiter apiCallY;
    private final int timeoutInSecondsForAPIY;

    @Inject
    public A ( @Named("apiCallXRateLimiter") apiCallX,
    @Named("apiCallXRateLimiter") apiCallY,
    @Named("apiCallXRateLimiter") apiCallZ,
    ){
      this.apiCallX = apiCallX;
      ...
    }

    public ResponseX callAPIX (){
      ...
    }

    public ResponseY callAPIY (){
      ...
    }

    private modelTransformer(){ //each for request and response and for each call.
     ...
    }

}

Я думаю использовать наследование, чтобы избежать кластеризации всех вызовов операций из этого класса.Какие другие шаблоны проектирования я мог бы использовать в этом сценарии?

1 Ответ

0 голосов
/ 22 февраля 2019

вы можете использовать AOP-фреймворк или шаблоны за ним, например, прокси-шаблон:

interface ServiceX {
    ResponseX execute();
}

@Alternative
@Named("serviceX")
class ServiceXImpl implements ServiceX {

    @Override
    public ResponseX execute() {
        //call to X API
        return null;
    }
}

@Default
class ServiceXProxyImpl implements ServiceX {
    @Inject
    @Named("serviceXLimiter")
    RateLimiter rateLimiter;
    @Inject
    @Named("serviceX")
    ServiceX serviceX;

    @Override
    public ResponseX execute() {
        rateLimiter.acquire();
        return serviceX.execute();
    }
}

Теперь везде, где вы объявляете @Inject ServiceX serviceX, ваша DI-фреймворк должна внедрять реализацию с ограничителем скорости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...