>source

서비스 클래스가 있는데 다른 서비스와 다른 API를 호출해야합니다. 하지만 각 API에는 약간의 제한이 있으므로 구아바의 Ratelimiter를 사용하여 작업 제한을 적용하고 있습니다

@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

    프록시 패턴과 같은 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 프레임 워크에 속도 제한기를 사용하여 구현을 삽입해야합니다.

  • 이전 reactjs - Internet Explorer에서 AXIOS Post가 REACT 애플리케이션과 작동하지 않음
  • 다음 powershell - ChatBot과 비즈니스 용 Skype 연결