Temporäre Amazon-SQS-Warteschlangen - Amazon Simple Queue Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Temporäre Amazon-SQS-Warteschlangen

Temporäre Warteschlangen helfen Ihnen, Entwicklungszeit und Bereitstellungskosten zu sparen, wenn Sie gängige Nachrichtenmuster wie Anfrage-Antwort verwenden. Sie können den temporären Warteschlangen-Client verwenden, um kostengünstige, anwendungsverwaltete temporäre Warteschlangen mit hohem Durchsatz zu erstellen.

Der Client ordnet mehrere temporäre Warteschlangen – anwendungsverwaltete Warteschlangen, die bei Bedarf für einen bestimmten Prozess erstellt werden – automatisch einer einzigen Amazon-SQS-Warteschlange zu. Auf diese Weise kann Ihre Anwendung weniger API-Aufrufe durchführen und einen höheren Durchsatz verzeichnen, wenn der Datenverkehr zu jeder temporären Warteschlange gering ist. Wenn eine temporäre Warteschlange nicht mehr verwendet wird, bereinigt der Client die temporäre Warteschlange automatisch. Dies gilt auch dann, wenn einige Prozesse, die den Client nutzen, nicht ordnungsgemäß heruntergefahren werden.

Im Folgenden werden die Vorteile von temporären Warteschlangen beschrieben:

  • Sie dienen als einfache Kommunikationskanäle für bestimmte Threads oder Prozesse.

  • Sie können erstellt und gelöscht werden, ohne dass zusätzliche Kosten anfallen.

  • Diese sind API-kompatibel mit statischen (normalen) Amazon-SQS-Warteschlangen. Dies bedeutet, dass vorhandener Code, mit dem Nachrichten gesendet und empfangen werden, Nachrichten an virtuelle Warteschlangen senden und von ihnen empfangen kann.

Themen

Virtuelle Warteschlangen

Virtuelle Warteschlangen sind lokale Datenstrukturen, die vom Client temporärer Warteschlangen erstellt werden. Mit virtuellen Warteschlangen können Sie mehrere Ziele mit geringem Datenverkehr in einer einzigen Amazon-SQS-Warteschlange zusammenfassen. Bewährte Methoden finden Sie unter Vermeiden Sie die Wiederverwendung derselben Nachrichtengruppen-ID in virtuellen Warteschlangen.

Anmerkung
  • Beim Erstellen einer virtuellen Warteschlange werden nur temporäre Datenstrukturen erstellten, in denen Konsumenten Nachrichten empfangen können. Da eine virtuelle Warteschlange keine API-Aufrufe an Amazon SQS sendet, entstehen für virtuelle Warteschlangen keine Kosten.

  • TPS-Kontingente gelten für alle virtuellen Warteschlangen in einer einzelnen Hostwarteschlange. Weitere Informationen finden Sie unter Amazon SQS SQS-Nachrichtenkontingente.

Die AmazonSQSVirtualQueuesClient-Wrapper-Klasse wurde um neue Unterstützung für Attribute im Zusammenhang mit virtuellen Warteschlangen erweitert. Um eine virtuelle Warteschlange erstellen zu können, müssen Sie die CreateQueue-API-Aktion mit dem Attribut HostQueueURL aufrufen. Dieses Attribut gibt die vorhandene Warteschlange an, in der die virtuellen Warteschlangen gehostet werden.

Die URL einer virtuellen Warteschlange hat das folgende Format.

https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue#MyVirtualQueueName

Wenn ein Produzent die API-Aktion SendMessage oder SendMessageBatch für die URL einer virtuellen Warteschlange aufruft, verfährt der Client temporärer Warteschlangen wie folgt:

  1. Er extrahiert den Namen der virtuellen Warteschlange.

  2. Er fügt den Namen der virtuellen Warteschlange als zusätzliches Nachrichtenattribut an.

  3. Er sendet die Nachricht an die Host-Warteschlange.

Während der Produzent Nachrichten sendet, fragt ein Hintergrund-Thread die Host-Warteschlange ab und sendet die empfangenen Nachrichten gemäß den entsprechenden Nachrichtenattributen an virtuelle Warteschlangen.

Während der Konsument die ReceiveMessage-API-Aktion für die URL einer virtuellen Warteschlange aufruft, blockiert der Client temporärer Warteschlangen den Aufruf lokal, bis der Hintergrund-Thread eine Nachricht in die virtuelle Warteschlange sendet. (Dieser Vorgang ist mit dem Vorabrufen von Nachrichten im gepufferten asynchronen Client vergleichbar: eine einzelne API-Aktion kann für bis zu 10 virtuelle Warteschlangen Nachrichten bereitstellen.) Wenn eine virtuelle Warteschlange gelöscht wird, werden alle Client-seitigen Ressourcen entfernt, ohne Amazon SQS selbst aufzurufen.

Die AmazonSQSTemporaryQueuesClient-Klasse wandelt alle von ihr erstellten Warteschlangen automatisch in temporäre Warteschlangen um. Sie erstellt außerdem Host-Warteschlangen mit denselben Warteschlangenattributen automatisch nach Bedarf. Den Namen dieser Warteschlangen ist ein konfigurierbares Präfix (standardmäßig __RequesterClientQueues__) gemeinsam, durch das sie als temporäre Warteschlangen identifiziert werden. Auf diese Weise kann der Client als Drop-In-Ersatz fungieren, durch den vorhandener Code optimiert wird, mit dem Warteschlangen erstellt und gelöscht werden. Der Client umfasst auch die AmazonSQSRequester- und AmazonSQSResponder-Schnittstellen, die eine bidirektionale Kommunikation zwischen Warteschlangen ermöglichen.

Request-Response-Messaging-Muster (virtuelle Warteschlangen)

Der häufigste Anwendungsfall für temporäre Warteschlangen ist das request-response-Messaging-Muster, bei dem ein Anforderer eine temporäre Warteschlange für den Empfang der einzelnen Antwortnachrichten erstellt. Um zu vermeiden, dass für jede Antwortnachricht eine Amazon-SQS-Warteschlange erstellt wird, können Sie mit dem Client für temporäre Warteschlangen mehrere temporäre Warteschlangen ohne Amazon-SQS-API-Aufrufe erstellen. Weitere Informationen finden Sie unter Implementieren von Anfrage-Antwort-Systemen.

Das folgende Diagramm zeigt eine geläufige Konfiguration mit diesem Muster.

Ein Diagramm des mit Amazon SQS verwendeten Anforderung-Antwort-Musters.

Beispielszenario: Verarbeiten einer Anmeldeanforderung

Das folgende Beispielszenario veranschaulicht, wie die AmazonSQSRequester- und AmazonSQSResponder-Schnittstellen zur Verarbeitung der Anmeldeanforderung eines Benutzers verwendet werden.

Auf der Client-Seite

public class LoginClient { // Specify the Amazon SQS queue to which to send requests. private final String requestQueueUrl; // Use the AmazonSQSRequester interface to create // a temporary queue for each response. private final AmazonSQSRequester sqsRequester = AmazonSQSRequesterClientBuilder.defaultClient(); LoginClient(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Send a login request. public String login(String body) throws TimeoutException { SendMessageRequest request = new SendMessageRequest() .withMessageBody(body) .withQueueUrl(requestQueueUrl); // If no response is received, in 20 seconds, // trigger the TimeoutException. Message reply = sqsRequester.sendMessageAndGetResponse(request, 20, TimeUnit.SECONDS); return reply.getBody(); } }

Das Senden einer Anmeldeanforderung bewirkt Folgendes:

  1. Erstellt eine temporäre Warteschlange.

  2. Es fügt die URL der temporären Warteschlange als Attribut an die Nachricht an.

  3. Es sendet die Nachricht.

  4. Es empfängt eine Antwort von der temporären Warteschlange.

  5. Es löscht die temporäre Warteschlange.

  6. Es gibt die Antwort zurück.

Auf der Server-Seite

Im folgenden Beispiel wird davon ausgegangen, dass bei der Erstellung ein Thread zur Abfrage der Warteschlange und zum Aufruf der Methode handleLoginRequest() für jede Nachricht erstellt wird. Darüber hinaus handelt es sich bei doLogin() um eine angenommene Methode.

public class LoginServer { // Specify the Amazon SQS queue to poll for login requests. private final String requestQueueUrl; // Use the AmazonSQSResponder interface to take care // of sending responses to the correct response destination. private final AmazonSQSResponder sqsResponder = AmazonSQSResponderClientBuilder.defaultClient(); LoginServer(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Process login requests from the client. public void handleLoginRequest(Message message) { // Process the login and return a serialized result. String response = doLogin(message.getBody()); // Extract the URL of the temporary queue from the message attribute // and send the response to the temporary queue. sqsResponder.sendResponseMessage(MessageContent.fromMessage(message), new MessageContent(response)); } }

Bereinigen von Warteschlangen

Um sicherzustellen, dass Amazon SQS alle von virtuellen Warteschlangen beanspruchten Ressourcen im Arbeitsspeicher freigibt, wenn die Anwendung den Client für temporäre Warteschlangen nicht mehr benötigt, sollte die Methode shutdown() aufgerufen werden. Sie können auch die Methode shutdown() der die AmazonSQSRequester-Schnittstelle verwenden.

Der Client temporärer Warteschlangen bietet auch eine Option, mit der sich verwaiste Host-Warteschlangen vermeiden lassen. Alle Warteschlangen, die innerhalb eines Zeitraums (standardmäßig fünf Minuten) einen API-Aufruf empfangen, werden vom Client mit der API-Aktion TagQueue als weiterhin genutzte Warteschlangen markiert.

Anmerkung

API-Aktionen, die für eine Warteschlange ausgeführt werden, markieren diese als nicht im Leerlauf befindlich. Dazu gehört auch eine ReceiveMessage-Aktion, die keine Nachrichten zurückgibt.

Der Hintergrund-Thread verwendet die API-Aktionen ListQueues und ListTags, um alle Warteschlange mit dem konfigurierten Präfix zu überprüfen und alle Warteschlangen zu entfernen, die nicht schon mindestens fünf Minuten lang gekennzeichnet sind. Sollte ein Client nicht ordnungsgemäß heruntergefahren werden, können die anderen aktiven Clients ihn auf diese Weise bereinigen. Um einer Verdopplung des Arbeitsaufwands entgegenzuwirken, kommunizieren alle Clients mit demselben Präfix über eine freigegebene, interne Arbeitswarteschlange, die nach dem Präfix benannt ist, miteinander.