AWS SQS (очередь) с Spring Boot - проблемы с производительностью - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть служба, которая читает все сообщения из AWS SQS.

@Slf4j
@Configuration
@EnableJms
public class JmsConfig {

    private SQSConnectionFactory connectionFactory;

    public JmsConfig(
            @Value("${amazon.sqs.accessKey}") String awsAccessKey,
            @Value("${amazon.sqs.secretKey}") String awsSecretKey,
            @Value("${amazon.sqs.region}") String awsRegion,
            @Value("${amazon.sqs.endpoint}") String awsEndpoint) {

        connectionFactory = new SQSConnectionFactory(
                new ProviderConfiguration(),
                AmazonSQSClientBuilder.standard()
                        .withCredentials(new AWSStaticCredentialsProvider(
                                new BasicAWSCredentials(awsAccessKey, awsSecretKey)))
                        .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(awsEndpoint, awsRegion))
                        .build());
    }


    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
        DefaultJmsListenerContainerFactory factory =
                new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(this.connectionFactory);
        factory.setDestinationResolver(new DynamicDestinationResolver());
        factory.setConcurrency("3-10");
        factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
        factory.setReceiveTimeout(2000L); //??????????
        return factory;
    }

    @Bean
    public JmsTemplate defaultJmsTemplate() {
        return new JmsTemplate(this.connectionFactory);
    }

Я слышал о длительных опросах, поэтому мне интересно, как я могу использовать его в моем случае.Интересно, как работает этот слушатель - я не хочу создавать ненужные вызовы в AWS SQS.

Мой слушатель, который читает сообщения и преобразует их в объект и сохраняет в Redis db:

@JmsListener(destination = "${amazon.sqs.destination}")
    public void receive(String requestJSON) throws JMSException {
        log.info("Received");
        try {
            Trace trace = Trace.fromJSON(requestJSON);
            traceRepository.save(trace);

(...)

Мне бы хотелось узнать ваше мнение - каков наилучший подход к минимизации ненужных вызовов в SQS для получения сообщений.Может быть, я использую, например,

factory.setReceiveTimeout(2000L);

К сожалению, в Интернете слишком мало информации об этом

Спасибо,

Мэтью

...