AmazonSQSClient를 사용하여 느린 메시지 소비

BOTJr. :

그래서, 나는 예상대로 모든 것이 작동 200 개까지 최대 연결을 허용, 스프링 JMS 50 ~ 100에서 동시성을 사용하지만 난 대기열에서 100,000 메시지를 검색하려고하면, 난 내 SQS에 100,000 메시지가있는 의미와 내가 봄을 통해 읽기 정상적인 접근 방식을 JMS.

@JmsListener
Public void process (String message) {
count++;
Println (count);
//code
 }

내 콘솔에서 모든 로그를보고하고 있지만, 후 17K 주위가 던지는 예외를 시작합니다

AWS SDK 예외 : 같은 뭔가 이미 사용중인 포트입니다.

내가 어떻게이 예외를 볼 이유는 무엇입니까 않습니다. 나는 그것을 제거?

나는 그것을 위해 인터넷에서 찾고 시도. 아무것도 찾을 수 없습니다.

내 설정 :

동시성 50 ~ 100

작업 당 설정 메시지 : 50

클라이언트는 인정

timestamp=10:27:57.183, level=WARN , logger=c.a.s.j.SQSMessageConsumerPrefetch, message={ConsumerPrefetchThread-30} Encountered exception during receive in ConsumerPrefetch thread,
javax.jms.JMSException: AmazonClientException: receiveMessage.
    at com.amazon.sqs.javamessaging.AmazonSQSMessagingClientWrapper.handleException(AmazonSQSMessagingClientWrapper.java:422)
    at com.amazon.sqs.javamessaging.AmazonSQSMessagingClientWrapper.receiveMessage(AmazonSQSMessagingClientWrapper.java:339)
    at com.amazon.sqs.javamessaging.SQSMessageConsumerPrefetch.getMessages(SQSMessageConsumerPrefetch.java:248)
    at com.amazon.sqs.javamessaging.SQSMessageConsumerPrefetch.run(SQSMessageConsumerPrefetch.java:207)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: com.amazonaws.SdkClientException: Unable to execute HTTP request: Address already in use: connect

업데이트 :이 문제에 대한보고하고 모든 소켓이 모두 소진 때까지 새로운 소켓이 생성되고있는 것으로 보인다.

내 스프링 JMS 버전은 4.3.10 것

하나는 사용할 수 있습니다 .. 단지 50 ~ 100에 최대 200 연결 및 통화 세트 위의 구성을이 문제를 복제하고 SQS 큐 일부 40K 메시지를 밀어 https://github.com/adamw/elasticmq을 A와이 여기까지 완료 한 후 .. 아마존 SQS를 복제 지역 스택 서버입니다. 코멘트 JMS 리스너 사용 비누 UI 부하 테스트와 많은 메시지를 발사 메시지 보내기를 호출합니다. 당신이 @jmslistener 주석을 주석해서, 그것은 대기열에서 메시지를 사용하지 않습니다. 당신이 볼 후에는 중지, 40K 메시지를 보낸 것이다. 의 주석 @jmslistener 서버 다시 시작합니다.

업데이트 :

DefaultJmsListenerContainerFactory factory =
                new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setDestinationResolver(new DynamicDestinationResolver());
        factory.setErrorHandler(Throwable::printStackTrace);
        factory.setConcurrency("50-100");
        factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
        return factory;

업데이트 :

SQSConnectionFactory connectionFactory = new SQSConnectionFactory( new ProviderConfiguration(), amazonSQSclient);

업데이트 :

클라이언트 구성 세부 사항 :

Protocol : HTTP
Max connections : 200

업데이트 :

나는 캐시 연결 팩토리 클래스를 사용 보인다. 나는 캐시 연결 팩토리 클래스와 기본 JMS 리스너 컨테이너 공장을 사용하지 않도록 스택 오버 플로우에 자신의 공식 문서에서 참조하십시오.

https://stackoverflow.com/a/21989895/5871514

그것은 내가 전에 생각 가지고하는 것과 같은 오류를 제공합니다.

최신 정보

내 목표는 500 TPS를 얻는 것입니다, 즉 나는 내가이 방법을 시도하고 내가 100-200 도달 할 수있는 것,하지만 더보다 .. 게다가이 일 고에서 차단이다 그래서 .. 그 정도를 소비 할 수 있어야한다 당신은 몇 가지 더 나은 솔루션이 있다면 당신이 그것을 달성하기 위해 .. 그것을 사용하는 경우 동시성 .. .. 나는 모든 귀를입니다.

** 업데이트 **

나는 amazonsqsclient를 사용하고

Dovmo :

소비자에 기아

JMS 클라이언트가 구현하는 경향이 한 가지 가능한 최적화, 메시지 소비 버퍼 또는 "프리 페치"입니다. 이 버퍼는 메시지의 수 또는 바이트 단위로 버퍼 크기 때로는 가변이다.

의도는 서버에이 메시지를 수신 매번 것보다는 일괄 적으로 여러 메시지를 당기는 소비자를 방지하는 것입니다.

당신이 (이 라이브러리가 취할 수있는 자기 의견을 고집하는보기이다) 많은 "빠른 소비자"가있는 환경에서,이 프리 페치는이 왕복을 최소화하기 위해 다소 높은 기본으로 설정되어 있습니다.

그러나 , 느린 메시지 사용자가있는 환경에서,이 프리 페치는 문제가 될 수 있습니다. 느린 소비자는 빨리 소비자로부터 그 프리 페치 된 메시지에 대한 소비를 메시징 잡고있다. 고도의 동시 환경에서이 빠르게 기아가 발생할 수 있습니다.

하여 케이스 인하면 해당 SQSConnectionFactory이것에 대한 속성을 :

SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory( new ProviderConfiguration(), amazonSQSclient);
sqsConnectionFactory.setNumberOfMessagesToPrefetch(0);

프로듀서에 기아 (즉, 통해 JmsTemplate)

이 JMS 구현은 일부 중개를 통해 브로커에 인터페이스 할 것으로 예상하는 것이 매우 일반적입니다. 이 중개인 실제로 캐시 및 재사용 연결을 재사용하기 위해 풀링 메커니즘을 사용하거나. 자바 EE의 세계에서,이 일반적으로 자바 EE 서버의 JCA 어댑터 또는 다른 방법의 치료를 가져온 것입니다.

때문에 봄 JMS가 작동하는 방식, 그것은을 위해 중간 위임 기대 ConnectionFactory풀링 /이 캐싱을 위해 존재하기를. 봄 JMS 브로커에 연결하고자 할 때 그렇지 않으면, 그것은 시도합니다 새 연결 및 세션을 엽니 다 (!) 브로커와 함께 뭔가를 할 때마다.

이 문제를 해결하기 위해, 봄은 몇 가지 옵션을 제공합니다. 가장 간단한되는 CachingConnectionFactory하나를 캐시하는 Connection, 많은 수 Session의 그에서 열 수 Connection. 간단한 방법은 당신이를 추가하는 @Configuration등의 위의 것 일 :

@Bean
public ConnectionFactory connectionFactory(AmazonSQSClient amazonSQSclient) {

    SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(new ProviderConfiguration(), amazonSQSclient);

    // Doing the following is key!
    CachingConnectionFactory connectionfactory = new CachingConnectionFactory();
    connectionfactory.setTargetConnectionFactory(sqsConnectionFactory);
    // Set the #connectionfactory properties to your liking here...

    return connectionFactory;

}

당신이 솔루션 (풀 것이다 풀링 JMS와 같은 뭔가 더 화려한를 원하는 경우 ConnectionsMessageProducer여러뿐만 아니라 당신이야 Session들), 당신은 합리적으로 새 사용할 수 있습니다 PooledJMS 투사 '들 JmsPoolConnectionFactory, 또는 자신의 라이브러리에서처럼.

추천

출처http://43.154.161.224:23101/article/api/json?id=173528&siteId=1