Dlaczego wiadomości SqS czasami pozostają w locie w kolejce
Używam kolejek Amazon SQS w bardzo prosty sposób. Zazwyczaj wiadomości są pisane i natychmiast widoczne i odczytywane. Czasami wiadomość jest zapisywana i pozostaje w locie (niewidoczne) w kolejce przez kilka minut. Widzę to z konsoli. Czas oczekiwania na otrzymanie wiadomości wynosi 0, a domyślna widoczność to 5 sekund. Pozostanie w ten sposób przez kilka minut, lub dopóki nie zostanie napisana nowa wiadomość, która w jakiś sposób ją uwalnia. Kilka sekund opóźnienia jest w porządku, ale ponad 60 sekund nie jest w porządku.
Istnieje 8 wątków czytających, które zawsze odpytują, więc nie chodzi o to, że coś nie próbuje ich odczytać, są.
Edytować : Żeby było jasne, żaden z odczytów konsumenckich w ogóle nie zwraca żadnych wiadomości i dzieje się to niezależnie od tego, czy konsola jest otwarta. W tym scenariuszu zaangażowana jest tylko jedna wiadomość, która po prostu siedzi w kolejce niewidoczna dla konsumentów.
Czy ktoś widział to zachowanie i co mogę zrobić, aby to poprawić?
Oto sdk dla java, którego używam:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.5.2</version>
</dependency>
Oto kod, który wykonuje odczyt (max = 10, maxwait = 0 startup config):
void read(MessageConsumer consumer) {
List<Message> messages = read(max, maxWait);
for (Message message : messages) {
if (tryConsume(consumer, message)) {
delete(message.getReceiptHandle());
}
}
}
private List<Message> read(int max, int maxWait) {
AmazonSQS sqs = getClient();
ReceiveMessageRequest rq = new ReceiveMessageRequest(queueUrl);
rq.setMaxNumberOfMessages(max);
rq.setWaitTimeSeconds(maxWait);
List<Message> messages = sqs.receiveMessage(rq).getMessages();
if (messages.size() > 0) {
LOG.info("read {} messages from SQS queue",messages.size());
}
return messages;
}
Wiersz dziennika „czytaj ..” nigdy nie pojawia się, gdy to się dzieje, i to, co powoduje, że wchodzę z konsolą i sprawdzam, czy wiadomość jest, czy nie, i tak jest.