2017-07-28 5 views
0

私はメッセージングミドルウェアとしてウサギの春休憩アプリを持っています。アプリケーションが受信休止要求を受け入れると、それはユーザーに返信しますが、非同期で処理が追加され、新しいメッセージが生成され、それがウサギに送信されます。そこから、一部の消費者がメッセージを読んでそれを外部システムに配信します。今、ウサギサーバー自体がダウンしている場合があります。 は失敗のようなものを扱うために、私はウサギがオンラインになるまで、キューは、いくつかのメッセージを処理することができるようになります春のブートとrabbitmqの統合、どのようにコンポーネントの障害で回復する?

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

    return executor; 
} 

(調整可能なサイズでコースの)ブロッキングキューを持っています。しかし、時間がかかりすぎてリクエストがキュー・サイズを超えると、失敗することになります。問題は、私がこれを改善してより効率的にする方法があるということです。業界のベストプラクティスは何ですか?そのシナリオのパターンはありますか?

+1

おそらく、Spring Cloud Histrixサーキットブレーカです。 https://martinfowler.com/bliki/CircuitBreaker.htmlまたはhttps://spring.io/guides/gs/circuit-breaker/ –

+0

おそらく、消費者と生産者の両方をHistrixブレーカーで包むことは理にかなっています。ウサギの接続工場自体はどうですか?接続が確立できない場合は、何度もやり直してネットワークとサーバーのリソースを無駄にすることは意味がありません。 – Imran

+1

Springクラウドストリームバインダーhttp://cloud.spring.io/spring-cloud-static/spring-cloud.html#_spring_cloud_streamでは、持続的なパブリッシュ/サブスクライブセマンティクスの概念が導入されています。デフォルトでは、RabbitMQバインダーはSpringBootのConnectionFactoryを使用するため、RabbitMQのすべてのSpringBoot設定オプションをサポートしています。しかし、私の謙虚な意見では、あなたがSpringクラウドを初めて使う人であれば、この優秀なコースにまず従ってください:https://www.udemy.com/microservices-with-spring-cloud/learn/v4/overview –

答えて

0

私はスプリングを再試行可能に使用しました。それは要件のためにかなり十分です。再試行できるように、リトライ間隔、最大試行回数などを設定し、カスタムリカバリ機能を実装します。

@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); 
    } 
関連する問題