spring、jms、activemq に基づいたシンプルなプロデューサーとコンシューマーのシミュレーションを作成しました。プロデューサーとコンシューマーの両方から高いパフォーマンスを達成しようとしています。
接続設定:
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<amq:connectionFactory id="amqConnectionFactory" brokerURL="failover:(tcp://${broker.url}:61616)" />
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="amqConnectionFactory" />
</bean>
<amq:queue id="queue" physicalName="queue" />
<beans:bean id="jsonMessageConverter" class="XXXXX.converter.JsonMessageConverter" />
消費者設定:
<jms:listener-container concurrency="10"
acknowledge="auto" prefetch="1" message-converter="jsonMessageConverter" transaction-manager="transactionManager"
>
<jms:listener id="queueListener_1" destination="ooIntegrationQueue"
ref="myMessageListenerAdapter" />
</jms:listener-container>
<beans:bean id="myMessageListenerAdapter"
class="org.springframework.jms.listener.adapter.MessageListenerAdapter" >
<beans:property name="delegate" ref="consumer"/>
</beans:bean>
<beans:bean id="consumer" class="XXX.ConsumerImpl"/>
プロデューサー設定:
<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"
p:connectionFactory-ref="connectionFactory" p:messageConverter-ref="jsonMessageConverter"
p:defaultDestination-ref="ooIntegrationQueue" p:sessionTransacted="true" />
コンシューマーから始めて、毎秒約 25 のメッセージを消費することができましたが、これは非常に遅いです。少しグーグルで調べて構成をいじった後、トランザクションを使用しているという事実がボトルネックであることを発見しました。 DefaultMessageListenerContainer を自動配線し、キャッシュレベルを
listenerContainer.setCacheLevelName("CACHE_SESSION")
私のパフォーマンスは、トランザクションが発生している間、毎秒約 1500 メッセージまで増加します。
私の問題は、1秒あたり約25回の操作でスタックしているプロデューサーにあり、プロデューサーのテストは簡単です:
int numOfMessages = getNumberOfMessages();
double startTime = System.currentTimeMillis();
for (int i = 1; i <= numOfMessages; i++) {
jmsTemplate.convertAndSend("HelloWorld" + i);
}
double endTime = System.currentTimeMillis();
double totalTime=(endTime-startTime)/1000;
System.out.println("Time - "+totalTime+" seconds");
System.out.println("EPS - "+numOfMessages/totalTime);
システム全体のボトルネックになっているため、プロデューサーで同様のパフォーマンスを達成する方法を考えています。