2017-11-03 23 views
0

定義済みの時間枠内で最大100万チャンクを処理できる必要があるため、チャンクバッチをリモートチャンクバッチに変換するプロセスが進行中です。私たちは仕事を稼働させていますが、パフォーマンスに関連するいくつかの問題があります。スプリングリモートバッチスレーブを抑制する方法

私たちの仕事は、エントリ/チャンクごとにかなり長い処理時間を要します。通常は数秒です。我々は、64のチャンクに絞るマスターノードを設定しているので、せいぜい64のチャンクが任意の時点で処理しないされるべきである

<bean id="ourTaskExecutor" class="...ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="16" /> 
    <property name="maxPoolSize" value="16" /> 
    <property name="queueCapacity" value="256" /> 
</bean> 

<int-jms:inbound-channel-adapter 
    id="JobJmsRequests" 
    connection-factory="jmsConnectionFactory" 
    channel="requests.chunking" 
    destination-name="requests.chunking" > 
     <int:poller task-executor="ourTaskExecutor" 
      fixed-delay="50" 
      max-messages-per-poll="4" 
      receive-timeout="50"/> 
</int-jms:inbound-channel-adapter> 

<int-jms:outbound-channel-adapter 
    id="JobJmsReplies" 
    connection-factory="jmsConnectionFactory" 
    destination-name="replies.chunking" 
    channel="replies.chunking"/> 

<int:service-activator 
    id="JobActivator" 
    input-channel="requests.chunking" 
    output-channel="replies.chunking" 
    ref="JobChunkHandler" method="handleChunk"/> 

我々は、スレーブ側の以下の構成を使用します。

当社の仮定は、それらを処理するためにポーラーは、タスク実行に受信したメッセージを引き渡すだろうが、その後、せいぜい64件のメッセージは、256の+ 16のメッセージのための部屋を持っているタスク実行、で終わることができなかったということでした。

ただし、キューの容量に達してタスクがタスク実行プログラムによって拒否されるという例外があります。これは、タスク実行者がポーラーのみが使用し、取得した要求をポーリングスレッドで処理するためです。処理には時間がかかりますので、タスク実行者にはポーリングタスクがゆっくりと流れます。受信したすべてのものを1つのスレッドで処理します)。

私たちは受信タイムアウトと遅延を使用しているので、フラッディングは完全には説明できません。したがって、新しいポーリングがトリガーされる前に処理を行う必要があることを理解しています。しかし、これはそうではないようです。

私たちは基本的に設定しようとしていることは以下の通りです:

のみ16メッセージを同時に処理する必要があります。追加メッセージはキューに入れられます(キューのほんの少し、たとえばプールのサイズなど)。 プールがいっぱいになると、スレッドプール内のルームが再び利用可能になるまで、ポーラーがブロックされるようにします。私たちは、奴隷が熱心に多くの仕事を取り入れることを望んでいません。

異なるスレッドでメッセージをポーリングして実行したいと考えています。それは可能なのでしょうか、どのように達成できますか?

答えて

0

呼び出し元実行または呼び出し側ブロックRejectedExecutionHandlerを使用します。

つまり、メモリ不足のチャンクは必要ありません。システム障害で失われます。

処理する同時チャンクの数に並行性を設定したメッセージ駆動型のインバウンドチャネルアダプタを使用する必要があります。