2017-07-28 2 views
0

Ich habe eine Spring Rest App mit Hase als Messaging Middleware. Wenn die App eine eingehende Ruheanforderung annimmt, antwortet sie dem Benutzer, während sie eine zusätzliche Verarbeitung asynchron durchführt, eine neue Nachricht erzeugt und sie auf Hase setzt. Von dort lesen einige Verbraucher die Nachricht und liefern sie an das externe System. Nun, es gibt einen Fall, dass der Kaninchen-Server selbst nicht verfügbar ist. Um diese Art von Fehlern zu umgehen, ich habe eine blockierende Warteschlange (natürlich mit einer einstellbaren Größe)Spring boot und rabbitmq integration, wie man bei komponentenausfall wiederherstellen?

@Bean 
public TaskExecutor taskExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(5); 
    executor.setMaxPoolSize(10); 
    executor.setQueueCapacity(25); 

    return executor; 
} 

Die Warteschlange der Lage, einige Nachrichten zu verarbeiten, bis Kaninchen online geht. Wenn es jedoch zu lange dauert und die Anforderungen die Warteschlangengröße überschreiten, wird es fehlschlagen. Jetzt ist die Frage, gibt es eine Möglichkeit, dass ich das verbessern und effizienter machen kann? Was ist die beste Praxis der Branche? Gibt es Muster für dieses Szenario?

+1

Vielleicht Spring Cloud Histrix Leistungsschalter. https://martinfowler.com/bliki/CircuitBreaker.html oder https://spring.io/guides/gs/circuit-breaker/ –

+0

Also ist es wahrscheinlich sinnvoll, sowohl Verbraucher als auch Produzenten in Histrix Breaker einzuwickeln. Was ist mit Kaninchen-Anschluss Fabrik selbst? Wenn es keine Verbindung herstellen kann, ist es nicht sinnvoll, es immer wieder zu versuchen und die Netzwerk- und Serverressourcen zu verschwenden. – Imran

+1

Die Frühlingswolke Stream Binder http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_spring_cloud_stream führt die Konzepte der persistenten Publish-Subscribe-Semantik ein. Standardmäßig verwendet der RabbitMQ-Ordner die ConnectionFactory von Spring Boot und unterstützt daher alle Spring Boot-Konfigurationsoptionen für RabbitMQ. Aber, meiner bescheidenen Meinung nach, wenn Sie neu in der Spring Cloud sind, folgen Sie zuerst diesem exzellenten Kurs: https://www.udemy.com/microservices-with-spring-cloud/learn/v4/overview –

Antwort

0

Ich verwendete Frühling wiederholen. Das reicht für die Anforderung ziemlich aus. Wie ich es wiederholen kann, konfiguriere Wiederholungsintervalle, maximale Versuche usw. und implementiere die benutzerdefinierte Wiederherstellungsfunktion.

@Async 
    @Retryable(value = { AmqpException.class }, 
      maxAttempts=10, [email protected](delay=100, maxDelay=300000,multiplier = 2)) 
    public void sendEmailMessageToQueue(SimpleMailMessage email){ 
     log.info("Sending message to queue"+Thread.currentThread().getName()); 
     try { 
      rabbitTemplate.convertAndSend(queueName, email); 
     }catch (AmqpException e){ 
      log.log(Level.WARNING,"Could not send message to queue, will retry.",e); 
     } 
    } 

    @Recover 
    public void connectionException(AmqpException e) { 
     log.log(Level.SEVERE,"Could not send message to queue, will save the message in db instead."+Thread.currentThread().getName(),e); 
    } 
Verwandte Themen