【问题标题】:Design Pattern for RateLimited API callsRateLimited API 调用的设计模式
【发布时间】:2019-02-22 19:08:39
【问题描述】:

我有一个服务类,它需要从其他服务调用不同的 api。 但是每个API都有一些限制,所以我使用Guava的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.
     ...
    }

}

我正在考虑使用继承来避免聚集来自此类的所有操作调用。 在这种情况下我可以使用哪些其他设计模式?

【问题讨论】:

    标签: java design-patterns


    【解决方案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 框架都应该使用速率限制器注入实现

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 2021-08-31
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      相关资源
      最近更新 更多