2011-10-20 9 views
7

Mi requisito es muy simple de entender.Cómo acelerar las llamadas al servicio web en una aplicación web Java

Quiero llamar a un servicio web desde mi aplicación web Java con la restricción de un máximo de 10 llamadas al servicio web por minuto. Justo después de 1 minuto, puedo establecer otras 10 conexiones, independientemente del estado de las 10 llamadas al servicio web anteriores (finalizadas o no).

¿Alguien puede guiarme en el enfoque para implementar esto? ¿Algún tutorial o enlaces útiles?

Respuesta

5

Utilizamos RequestThrottler (gist) que es inspired by this blog post.

Uso:

private static final int MAX_CALLS = 10; 
private static final int PER_INTERVAL = 60000; // 60s 
private static final int MAX_WAIT = 2000; // 2s 

private RequestThrottler _throttler = new RequestThrottler(MAX_CALLS, PER_INTERVAL); 
private SomeWebService _service = new SomeWebService(); 

public void callService() { 
    throttler.startRequest(MAX_WAIT); 
    _service.call(); 
} 

No es que puede que tenga que hacerse cargo de la posible congestión, especialmente si va a esperar indefinidamente como parte de las peticiones web.

+0

Esto parece buena. ¿Necesito hacer la clase singleton, ya que varios usuarios pueden golpear al mismo tiempo? ¿O puedo colocar este código que ha publicado en una clase simple de Java y usarlo en mi servlet? – Badal

+0

@Badal puede tener tantas instancias como desee, p. para diferentes servicios web. Por lo tanto, no lo convertiría en un singleton. Definitivamente tiene que compartir la instancia entre todas las llamadas a un servicio protegido. Sin embargo, cómo hacerlo depende de su aplicación. Por ejemplo, si está utilizando Spring, debería hacer que RequestThrottler sea un campo de un bean incluso de un bean. Alternativamente, puede almacenarlo en el ámbito de aplicación de su aplicación web o hacer la regulación dentro de un filtro. Ya ves, muchas opciones aquí. – sfussenegger

+0

@ sfussenegger: Para dejarme en claro, déjame explicarte. Digamos que 500 usuarios golpean mi servidor, así que tendré 500 instancias de servlet. Cada uno creará el objeto SomeWebService y el objeto throttler (por lo que tendré 500 objetos de servicio y 500 de throttler). Ahora la clase RequestThrottler se encargará del golpe máximo por minuto. Por favor, acéptame, ¿entiendes? y por cierto, muchas gracias por su ayuda. :) – Badal

2

Eche un vistazo a Apache Camel y su implementación de throttler http://camel.apache.org/throttler.html.

+0

¿Tiene alguna muestra de código rápido para esta implementación del acelerador Camel? – Badal

+0

lamentablemente no – wesoly

+0

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.camel/camel-core/2.9.2/org/apache/camel/impl/ThrottlingInflightRoutePolicy.java#ThrottlingInflightRoutePolicy. throttle% 28org.apache.camel.impl.Route% 2Corg.apache.camel.impl.Exchange% 29? – mestachs

Cuestiones relacionadas