

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.

# Verwendung APIs mit Amazon SQS
<a name="sqs-working-with-apis"></a>

Dieses Thema enthält Informationen zur Konstruktion von Amazon SQS SQS-Endpunkten, zur Erstellung von API-Abfragen mit den Methoden GET und POST und zur Verwendung von Batch-API-Aktionen. Detaillierte Informationen zu Amazon-SQS-[Aktionen](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html) – einschließlich Parametern, Fehlern, Beispielen und [Datentypen](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Types.html) – finden Sie in der [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/).

Um mit einer Vielzahl von Programmiersprachen auf Amazon SQS zuzugreifen, können Sie auch verwenden [AWS SDKs](https://aws.amazon.com/tools/#sdk), die die folgenden automatischen Funktionen enthalten:
+ Kryptographisches Signieren Ihrer Serviceanfragen
+ Wiederholen von Anfragen
+ Umgang mit Fehlerreaktionen

Weitere Informationen finden Sie unter [Amazon SQS mit einem AWS SDK verwenden](sdk-general-information-section.md).

Informationen zum Befehlszeilen-Tool finden Sie in den Amazon-SQS-Abschnitten in der [https://docs.aws.amazon.com/cli/latest/reference/sqs/index.html](https://docs.aws.amazon.com/cli/latest/reference/sqs/index.html) und der [https://docs.aws.amazon.com/powershell/latest/reference/](https://docs.aws.amazon.com/powershell/latest/reference/).

**Amazon SQS APIs mit AWS JSON-Protokoll**

Amazon SQS verwendet das AWS JSON-Protokoll als Transportmechanismus für alle Amazon SQS APIs auf den angegebenen [AWS SDK-Versionen](sqs-json-faqs.md#json-protocol-getting-started). AWS Das JSON-Protokoll bietet einen höheren Durchsatz, eine geringere Latenz und eine schnellere application-to-application Kommunikation. AWS Das JSON-Protokoll ist im Vergleich zum AWS Abfrageprotokoll effizienter bei serialization/deserialization der Bearbeitung von Anfragen und Antworten. Wenn Sie das AWS Abfrageprotokoll immer noch lieber mit SQS verwenden möchten APIs, finden Sie [Welche Sprachen werden für das in Amazon SQS APIs verwendete AWS JSON-Protokoll unterstützt?](sqs-json-faqs.md#json-protocol-supported-languages) die AWS SDK-Versionen, die das Amazon SQS AWS SQS-Abfrageprotokoll unterstützen.

Amazon SQS verwendet das AWS JSON-Protokoll für die Kommunikation zwischen AWS SDK-Clients (z. B. Java, Python, Golang JavaScript) und dem Amazon SQS-Server. Eine HTTP-Anfrage eines Amazon-SQS-API-Vorgangs akzeptiert Eingaben im JSON-Format. Der Amazon-SQS-Vorgang wird ausgeführt und die Ausführungsantwort im JSON-Format an den SDK-Client zurückgesendet. Im Vergleich zu AWS Query ist AWS JSON einfacher, schneller und effizienter, wenn es darum geht, Daten zwischen Client und Server zu transportieren.
+ AWS Das JSON-Protokoll fungiert als Vermittler zwischen dem Amazon SQS SQS-Client und dem Server.
+ Der Server versteht die Programmiersprache, in der der Amazon SQS SQS-Vorgang erstellt wurde, nicht, aber er versteht das AWS JSON-Protokoll.
+ Das AWS JSON-Protokoll verwendet die Serialisierung (Objekt in das JSON-Format konvertieren) und die Deserialisierung (JSON-Format in Objekt konvertieren) zwischen Amazon SQS SQS-Client und -Server.

Weitere Informationen zum AWS JSON-Protokoll mit Amazon SQS finden Sie unter[Amazon SQS AWS JSON-Protokoll FAQs](sqs-json-faqs.md).

AWS Das JSON-Protokoll ist in der angegebenen [AWS SDK-Version](sqs-json-faqs.md#json-protocol-getting-started) verfügbar. Informationen zur SDK-Version und zu den Veröffentlichungsdaten der verschiedenen Sprachvarianten finden Sie in der [AWS SDKs Matrix zur Unterstützung von Versionen AWS](https://docs.aws.amazon.com/sdkref/latest/guide/version-support-matrix.html) *SDKs und Tools im Referenzhandbuch zu Tools*

# Abfrage-API-Anfragen mithilfe des AWS JSON-Protokolls in Amazon SQS stellen
<a name="sqs-making-api-requests-json"></a>

In diesem Thema wird erklärt, wie Sie einen Amazon SQS SQS-Endpunkt erstellen, POST-Anfragen stellen und Antworten interpretieren.

**Anmerkung**  
AWS Das JSON-Protokoll wird für die meisten Sprachvarianten unterstützt. Eine Liste der unterstützten Sprachvarianten finden Sie unter [Welche Sprachen werden für das in Amazon SQS APIs verwendete AWS JSON-Protokoll unterstützt?](sqs-json-faqs.md#json-protocol-supported-languages).

## Erstellen eines Endpunkts
<a name="sqs-api-constructing-endpoints-json"></a>

Für die Arbeit mit Amazon-SQS-Warteschlangen müssen Sie einen Endpunkt erstellen. Informationen zu Amazon-SQS-Endpunkten finden Sie auf den folgenden Seiten im *Allgemeine Amazon Web Services-Referenz*:
+ [Regionale Endpunkte](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints)
+ [Endpunkte und Kontingente von Amazon Simple Queue Service](https://docs.aws.amazon.com/general/latest/gr/sqs-service)

Jeder Amazon-SQS-Endpunkt ist unabhängig. Wenn z. B. bei zwei Warteschlangen mit dem identischen Namen *MyQueue* eine über Endpunkt `sqs.us-east-2.amazonaws.com` und die andere über Endpunkt `sqs.eu-west-2.amazonaws.com` verfügt, nutzen die beiden Warteschlangen keine Daten gemeinsam.

Das folgende Beispiel zeigt einen Endpunkt, der eine Anforderung zum Erstellen einer Warteschlange stellt. 

```
POST / HTTP/1.1
Host: sqs.us-west-2.amazonaws.com
X-Amz-Target: AmazonSQS.CreateQueue
X-Amz-Date: <Date>
Content-Type: application/x-amz-json-1.0
Authorization: <AuthParams>
Content-Length: <PayloadSizeBytes>
Connection: Keep-Alive 
{
    "QueueName":"MyQueue",
    "Attributes": {
        "VisibilityTimeout": "40"
    },
    "tags": {
        "QueueType": "Production"
    }
}
```

**Anmerkung**  
Bei Warteschlangennamen und Warteschlangen wird zwischen Groß- und Kleinschreibung URLs unterschieden.  
Die Struktur von *`AUTHPARAMS`* hängt davon ab, wie Sie Ihre API-Anforderung signieren. Weitere Informationen finden Sie unter [AWS API-Anfragen signieren](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) in der *Allgemeinen Referenz zu Amazon Web Services*.

## Durchführen einer POST-Anforderung
<a name="structure-post-request"></a>

Eine Amazon-SQS-POST-Anforderung sendet Abfrageparameter als Formular im Text einer HTTP-Anforderung.

Im Folgenden finden Sie ein Beispiel für einen HTTP-Header mit der `X-Amz-Target`-Einstellung auf `AmazonSQS.<operationName>` und einen HTTP-Header mit der `Content-Type`-Einstellung auf `application/x-amz-json-1.0`.

```
POST / HTTP/1.1
Host: sqs.<region>.<domain>
X-Amz-Target: AmazonSQS.SendMessage
X-Amz-Date: <Date>
Content-Type: application/x-amz-json-1.0
Authorization: <AuthParams>
Content-Length: <PayloadSizeBytes>
Connection: Keep-Alive 
{
    "QueueUrl": "https://sqs.<region>.<domain>/<awsAccountId>/<queueName>/",
    "MessageBody": "This is a test message"
}
```

Diese HTTP-POST-Anforderung sendet eine Nachricht an eine Amazon-SQS-Warteschlange.

**Anmerkung**  
Beide HTTP-Header, `X-Amz-Target` und `Content-Type`, sind erforderlich.  
Der HTTP-Client fügt abhängig von der HTTP-Version des Clients möglicherweise weitere Elemente zur HTTP-Anforderung hinzu.

# Interpretieren von Amazon-SQS-JSON-API-Antworten
<a name="sqs-json-api-responses"></a>

Wenn Sie eine Anfrage an Amazon SQS senden, wird eine JSON-Antwort mit den Ergebnissen zurückgegeben. Die Antwortstruktur hängt von der API-Aktion ab, die Sie verwendet haben.

Weitere Informationen zu diesen Antworten finden Sie unter:
+ Die spezifische API-Aktion in den [API-Aktionen](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html) in der *Amazon Simple Queue Service API-Referenz*
+ Die [Amazon SQS AWS JSON-Protokoll FAQs](sqs-json-faqs.md)

## Struktur einer JSON-Antwort bei Erfolg
<a name="sqs-json-api-successful-response-structure"></a>

Ist die Anfrage erfolgreich, ist das Hauptantwortelement `x-amzn-RequestId`, das den Universal Unique Identifier (UUID) der Anfrage sowie weitere angehängte Antwortfelder enthält. Beispielsweise enthält die folgende [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html)-Antwort das Feld `QueueUrl`, das wiederum die URL der erstellten Warteschlange enthält.

```
HTTP/1.1 200 OK
x-amzn-RequestId: <requestId>
Content-Length: <PayloadSizeBytes>
Date: <Date>
Content-Type: application/x-amz-json-1.0
{
    "QueueUrl":"https://sqs.us-east-1.amazonaws.com/111122223333/MyQueue"
}
```

## Struktur einer JSON-Antwort bei Fehlschlagen
<a name="sqs-api-error-response-structure"></a>

Wenn eine Anfrage nicht erfolgreich ist, gibt Amazon SQS die Hauptantwort zurück, einschließlich des HTTP-Headers und des Texts.

`x-amzn-RequestId` enthält im HTTP-Header die UUID der Anfrage. `x-amzn-query-error` enthält zwei Informationen: die Art des Fehlers, und ob es sich bei dem Fehler um einen Produzenten- oder einen Konsumentenfehler handelt. 

`"__type"` gibt im Antworttext weitere Fehlerdetails an und `Message` zeigt die Fehlerbedingung in lesbarem Format an. 

Im Folgenden finden Sie eine Beispielfehlerantwort im JSON-Format:

```
HTTP/1.1 400 Bad Request
x-amzn-RequestId: 66916324-67ca-54bb-a410-3f567a7a0571
x-amzn-query-error: AWS.SimpleQueueService.NonExistentQueue;Sender
Content-Length: <PayloadSizeBytes>
Date: <Date>
Content-Type: application/x-amz-json-1.0
{
    "__type": "com.amazonaws.sqs#QueueDoesNotExist",
    "message": "The specified queue does not exist."
}
```

# Amazon SQS AWS JSON-Protokoll FAQs
<a name="sqs-json-faqs"></a>

Dieses Thema behandelt häufig gestellte Fragen zur Verwendung des AWS JSON-Protokolls mit Amazon SQS.

## Was ist das AWS JSON-Protokoll und wie unterscheidet es sich von bestehenden Amazon SQS SQS-API-Anfragen und -Antworten?
<a name="json-protocol-what-is"></a>

JSON ist eine der am weitesten verbreiteten und akzeptierten Verbindungsmethoden für die Kommunikation zwischen heterogenen Systemen. Amazon SQS verwendet JSON als Medium für die Kommunikation zwischen einem AWS SDK-Client (z. B. Java, Python, Golang JavaScript) und einem Amazon SQS-Server. Eine HTTP-Anfrage eines Amazon-SQS-API-Vorgangs akzeptiert Eingaben in Form von JSON. Der Amazon-SQS-Vorgang wird ausgeführt und die Ausführungsantwort wird im JSON-Format an den SDK-Client zurückgesendet. Im Vergleich zu AWS -Abfragen ist JSON effizienter, wenn es darum geht, Daten zwischen Client und Server zu transportieren. 
+ Das Amazon SQS AWS JSON-Protokoll fungiert als Vermittler zwischen dem Amazon SQS SQS-Client und dem Server.
+ Der Server versteht die Programmiersprache, in der der Amazon SQS SQS-Vorgang erstellt wurde, nicht, aber er versteht das AWS JSON-Protokoll.
+ Das Amazon SQS AWS JSON-Protokoll verwendet die Serialisierung (Objekt in das JSON-Format konvertieren) und Deserialisierung (JSON-Format in Objekt konvertieren) zwischen dem Amazon SQS SQS-Client und -Server.

## Wie fange ich mit AWS JSON-Protokollen für Amazon SQS an?
<a name="json-protocol-getting-started"></a>

Um mit der neuesten AWS SDK-Version zu beginnen und schnelleres Messaging für Amazon SQS zu erreichen, aktualisieren Sie Ihr AWS SDK auf die angegebene Version oder eine nachfolgende Version. Weitere Informationen zu SDK-Clients finden Sie in der Spalte „Leitfaden“ in der Tabelle unten.

Im Folgenden finden Sie eine Liste der SDK-Versionen in allen Sprachvarianten für das AWS JSON-Protokoll zur Verwendung mit Amazon SQS: APIs


| Sprache | SDK-Client-Repository | Erforderliche SDK-Clientversion | Richtlinie | 
| --- | --- | --- | --- | 
|  C\$1\$1  |  [aws/ aws-sdk-cpp](https://github.com/aws/aws-sdk-cpp)  |  [1.11.98](https://github.com/aws/aws-sdk-cpp/releases/tag/1.11.198)  |  [AWS SDK for C\$1\$1](https://aws.amazon.com/sdk-for-cpp/)  | 
|  Golang 1.x  |  [aws/ aws-sdk-go](https://github.com/aws/aws-sdk-go)  |  [v1.47.7](https://github.com/aws/aws-sdk-go/releases/tag/v1.47.7)  |  [AWS SDK for Go](https://aws.amazon.com/sdk-for-go/)  | 
|  Golang 2.x  |  [aws/2 aws-sdk-go-v](https://github.com/aws/aws-sdk-go-v2)  |  [v1.28.0](https://github.com/aws/aws-sdk-go-v2/blob/release-2023-11-09/service/sqs/CHANGELOG.md#v1270-2023-11-09)  |  [AWS SDK for Go V2](https://aws.github.io/aws-sdk-go-v2/docs/)  | 
|  Java 1.x  |  [aws/ aws-sdk-java](https://github.com/aws/aws-sdk-java)  |  [1.12.585](https://github.com/aws/aws-sdk-java/releases/tag/1.12.585)  |  [AWS SDK für Java](https://aws.amazon.com/sdk-for-java/)  | 
|  Java 2.x  |  [Ahnen/ 2 aws-sdk-java-v](https://github.com/aws/aws-sdk-java-v2)  |  [2.21,19](https://github.com/aws/aws-sdk-java-v2/releases/tag/2.21.19)  |  [AWS SDK für Java](https://aws.amazon.com/sdk-for-java/)  | 
|  JavaScript v2.x  |  [aws/ aws-sdk-js](https://github.com/aws/aws-sdk-js)  |  [JavaScript nein AWS](https://aws.amazon.com/developer/language/javascript/)  | 
|  JavaScript v3.x  |  [aws/3 aws-sdk-js-v](https://github.com/aws/aws-sdk-js-v3)  |  [v3.447.0](https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.447.0)  |  [JavaScript nein AWS](https://aws.amazon.com/developer/language/javascript/)  | 
|  .NET  |  [aws/ aws-sdk-net](https://github.com/aws/aws-sdk-net)  |  [3.7.681,0](https://github.com/aws/aws-sdk-net/releases/tag/3.7.681.0)  |  [AWS SDK for .NET](https://aws.amazon.com/sdk-for-net/)  | 
|  PHP  |  [aws/ aws-sdk-php](https://github.com/aws/aws-sdk-php)  |  [3,285,2](https://github.com/aws/aws-sdk-php/releases/tag/3.285.2)  |  [AWS SDK for PHP](https://aws.amazon.com/sdk-for-php/)  | 
|  Python-boto3  |   [boto/boto3](https://github.com/boto/boto3)   |  [1.28.82](https://github.com/boto/boto3/releases/tag/1.28.82)  |  [AWS SDK for Python (Boto3)](https://aws.amazon.com/sdk-for-python/)  | 
|  Python-botocore  |   [boto/botocore](https://github.com/boto/botocore/)   |  [1.31.82](https://github.com/boto/botocore/releases/tag/1.31.82)  |  [AWS SDK for Python (Boto3)](https://aws.amazon.com/sdk-for-python/)  | 
|  awscli  |  [AWS -CLI](https://github.com/aws/aws-cli)  |  [1.29.82](https://github.com/aws/aws-cli/releases/tag/1.29.82)  |  [AWS-Befehlszeilenschnittstelle](https://aws.amazon.com/cli/)  | 
|  Ruby  |  [sägen/ aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby)  |  [1,67,0](https://rubygems.org/gems/aws-sdk-sqs/versions/1.67.0)  |  [AWS SDK for Ruby](https://aws.amazon.com/sdk-for-ruby/)  | 

## Was sind die Risiken, wenn ich das JSON-Protokoll für meine Amazon-SQS-Workloads aktiviere?
<a name="json-protocol-risks"></a>

Wenn Sie eine benutzerdefinierte Implementierung von AWS SDK oder eine Kombination aus benutzerdefinierten Clients und AWS SDK für die Interaktion mit Amazon SQS verwenden, das AWS abfragebasierte (auch bekannt als XML-basierte) Antworten generiert, ist dies möglicherweise nicht mit dem AWS JSON-Protokoll kompatibel. Wenn Sie auf Probleme stoßen, wenden Sie sich an den AWS Support.

## Was ist, wenn ich bereits die neueste AWS SDK-Version verwende, aber meine Open-Source-Lösung JSON nicht unterstützt?
<a name="json-protocol-sdk-version-open-source"></a>

Sie müssen Ihre SDK-Version auf die Version ändern, die vor der von Ihnen verwendeten Version liegt. Weitere Informationen [Wie fange ich mit AWS JSON-Protokollen für Amazon SQS an?](#json-protocol-getting-started) finden Sie unter. AWS Die unter aufgeführten SDK-Versionen [Wie fange ich mit AWS JSON-Protokollen für Amazon SQS an?](#json-protocol-getting-started) verwenden das JSON-Wire-Protokoll für Amazon SQS. APIs Wenn Sie Ihr AWS SDK auf die vorherige Version ändern, verwendet Ihr Amazon SQS APIs die AWS Abfrage.

## Welche Sprachen werden für das in Amazon SQS APIs verwendete AWS JSON-Protokoll unterstützt?
<a name="json-protocol-supported-languages"></a>

Amazon SQS unterstützt alle Sprachvarianten, sofern sie allgemein verfügbar AWS SDKs sind (GA). Derzeit unterstützen wir Kotlin, Rust oder Swift nicht. Weitere Informationen zu anderen Sprachvarianten finden Sie unter [Tools, auf der Grundlage von AWS](https://aws.amazon.com/developer/tools/).

## Welche Regionen werden für das in Amazon SQS verwendete AWS JSON-Protokoll unterstützt APIs
<a name="json-protocol-supported-regions"></a>

Amazon SQS unterstützt das AWS JSON-Protokoll in allen [AWS Regionen](https://docs.aws.amazon.com/general/latest/gr/sqs-service.html), in denen Amazon SQS verfügbar ist. 

## Welche Latenzverbesserungen kann ich erwarten, wenn ich ein Upgrade auf die angegebenen AWS SDK-Versionen für Amazon SQS mithilfe des AWS JSON-Protokolls durchführe?
<a name="json-protocol-upgrading-sdk"></a>

AWS Das JSON-Protokoll ist im Vergleich zum Abfrageprotokoll effizienter bei der Serialisierung und Deserialisierung von Anfragen und Antworten. AWS Basierend auf AWS Leistungstests für eine Nachrichtennutzlast von 5 KB reduziert das JSON-Protokoll für Amazon SQS die Latenz bei der end-to-end Nachrichtenverarbeitung um bis zu 23% und reduziert die clientseitige CPU- und Speicherauslastung der Anwendung. 

## Wird das AWS Abfrageprotokoll veraltet sein?
<a name="query-protocol"></a>

AWS Das Abfrageprotokoll wird weiterhin unterstützt. Sie können das AWS Abfrageprotokoll weiterhin verwenden, solange für Ihre AWS SDK-Version eine andere Version festgelegt ist als die, die unter [Wie fange ich mit AWS JSON-Protokollen für Amazon SQS an](#json-protocol-getting-started)? aufgeführt ist.

## Wo finde ich weitere Informationen zum AWS JSON-Protokoll?
<a name="json-protocol-more-info"></a>

Weitere Informationen zum JSON-Protokoll finden Sie unter [AWS -JSON-1.0-Protokoll](https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html) in der *Smithy*-Dokumentation. Weitere Informationen zu Amazon-SQS-API-Anfragen mit dem AWS -JSON-Protokoll finden Sie unter [Abfrage-API-Anfragen mithilfe des AWS JSON-Protokolls in Amazon SQS stellen](sqs-making-api-requests-json.md).

# Abfrage-API-Anfragen mithilfe des AWS Abfrageprotokolls in Amazon SQS stellen
<a name="sqs-making-api-requests-xml"></a>

In diesem Thema wird erklärt, wie Sie einen Amazon SQS SQS-Endpunkt erstellen, GET- und POST-Anfragen stellen und Antworten interpretieren.

## Erstellen eines Endpunkts
<a name="sqs-api-constructing-endpoints"></a>

Für die Arbeit mit Amazon-SQS-Warteschlangen müssen Sie einen Endpunkt erstellen. Informationen zu Amazon-SQS-Endpunkten finden Sie auf den folgenden Seiten im *Allgemeine Amazon Web Services-Referenz*:
+ [Regionale Endpunkte](https://docs.aws.amazon.com/general/latest/gr/rande.html#sqs_region)
+ [Endpunkte und Kontingente von Amazon Simple Queue Service](https://docs.aws.amazon.com/general/latest/gr/sqs-service)

Jeder Amazon-SQS-Endpunkt ist unabhängig. Wenn z. B. bei zwei Warteschlangen mit dem identischen Namen *MyQueue* eine über Endpunkt `sqs.us-east-2.amazonaws.com` und die andere über Endpunkt `sqs.eu-west-2.amazonaws.com` verfügt, nutzen die beiden Warteschlangen keine Daten gemeinsam.

Das folgende Beispiel zeigt einen Endpunkt, der eine Anforderung zum Erstellen einer Warteschlange stellt. 

```
https://sqs.eu-west-2.amazonaws.com/   
?Action=CreateQueue
&DefaultVisibilityTimeout=40
&QueueName=MyQueue
&Version=2012-11-05
&AUTHPARAMS
```

**Anmerkung**  
Bei Warteschlangennamen und Warteschlangen wird zwischen Groß- und URLs Kleinschreibung unterschieden.  
Die Struktur von *`AUTHPARAMS`* hängt davon ab, wie Sie Ihre API-Anforderung signieren. Weitere Informationen finden Sie unter [AWS API-Anfragen signieren](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) in der *Allgemeinen Referenz zu Amazon Web Services*.

## Durchführen einer GET-Anforderung
<a name="structure-get-request"></a>

Eine Amazon-SQS-GET-Anforderung ist als URL mit den folgenden Komponenten aufgebaut:
+ **Endpunkt** – Die Ressource, für die die Anforderung ausgeführt wird (der [Warteschlangenname und die URL](sqs-queue-message-identifiers.md#queue-name-url)), z. B.: `https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue`
+ **Aktion** – Die [Aktion](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html), die Sie für den Endpunkt ausführen möchten. Ein Fragezeichen (`?`) trennt den Endpunkt von der Aktion, z. B.: `?Action=SendMessage&MessageBody=Your%20Message%20Text`
+ **Parameter** – Beliebige Anforderungsparameter. Jeder Parameter ist durch ein kaufmännisches Und (`&`) vom Text getrennt, zum Beispiel: `&Version=2012-11-05&AUTHPARAMS` 

Im Folgenden finden Sie ein Beispiel für eine GET-Anforderung, die eine Nachricht an eine Amazon-SQS-Warteschlange sendet.

```
https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue
?Action=SendMessage&MessageBody=Your%20message%20text
&Version=2012-11-05
&AUTHPARAMS
```

**Anmerkung**  
Bei Warteschlangennamen und Warteschlangen wird zwischen Groß- und Kleinschreibung URLs unterschieden.  
Da dies bei GET-Anfragen der Fall ist URLs, müssen Sie alle Parameterwerte URL-kodieren. Da Leerzeichen nicht erlaubt sind URLs, ist jedes Leerzeichen URL-kodiert als. `%20` Für den Rest des Beispiels wurde zum Zweck der besseren Lesbarkeit keine URL-Codierung durchgeführt.

## Durchführen einer POST-Anforderung
<a name="structure-post-request"></a>

Eine Amazon-SQS-POST-Anforderung sendet Abfrageparameter als Formular im Text einer HTTP-Anforderung.

Es folgt ein Beispiel eines HTTP-Headers mit der Einstellung `application/x-www-form-urlencoded` für `Content-Type`.

```
POST /123456789012/MyQueue HTTP/1.1
Host: sqs.us-east-2.amazonaws.com
Content-Type: application/x-www-form-urlencoded
```

Auf den Header folgt eine `[form-urlencoded](https://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2)`-GET-Anforderung, die eine Nachricht an eine Amazon-SQS-Warteschlange sendet. Jeder Parameter ist durch ein kaufmännisches Und (`&`) vom Text getrennt.

```
Action=SendMessage
&MessageBody=Your+Message+Text
&Expires=2020-10-15T12%3A00%3A00Z
&Version=2012-11-05
&AUTHPARAMS
```

**Anmerkung**  
Nur der `Content-Type` HTTP-Header ist erforderlich. Der `AUTHPARAMS` ist für die GET-Anforderung derselbe.  
Der HTTP-Client fügt abhängig von der HTTP-Version des Clients möglicherweise weitere Elemente zur HTTP-Anforderung hinzu.

# Interpretieren von Amazon-SQS-XML-API-Antworten
<a name="sqs-xml-api-responses"></a>

Wenn Sie eine Anfrage an Amazon SQS senden, wird eine XML-Antwort mit den Ergebnissen der Anfrage zurückgegeben. Informationen zur Struktur und zu den Einzelheiten dieser Antworten finden Sie in den spezifischen [API-Aktionen](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html) in der *Amazon Simple Queue Service API-Referenz*.

## Struktur einer XML-Antwort bei Erfolg
<a name="sqs-api-successful-response-structure"></a>

Wenn die Anforderung erfolgreich ist, wird das Hauptantwortelement nach der Aktion mit dem Zusatz `Response` (zum Beispiel `ActionNameResponse`) benannt.

Dieses Element enthält die folgenden untergeordneten Elemente:
+ **`ActionNameResult`** – Enthält ein aktionsspezifisches Element. Das Element `CreateQueueResult` enthält das Element `QueueUrl`, das wiederum die URL der erstellten Warteschlange enthält.
+ **`ResponseMetadata`** – Enthält die `RequestId`, die wiederum die UUID (Universal Unique Identifier) der Anforderung enthält.

Nachfolgend finden Sie ein Beispiel für eine Antwort bei Erfolg im XML-Format:

```
<CreateQueueResponse
   xmlns=https://sqs.us-east-2.amazonaws.com/doc/2012-11-05/
   xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
   xsi:type=CreateQueueResponse>
   <CreateQueueResult>
      <QueueUrl>https://sqs.us-east-2.amazonaws.com/770098461991/queue2</QueueUrl>
   </CreateQueueResult>
   <ResponseMetadata>
      <RequestId>cb919c0a-9bce-4afe-9b48-9bdf2412bb67</RequestId>
   </ResponseMetadata>
</CreateQueueResponse>
```

## XML-Fehler-Antwortstruktur
<a name="sqs-api-error-response-structure"></a>

Wenn eine Anforderung fehlschlägt, gibt Amazon SQS immer das Haupt-Antwort-Element `ErrorResponse` zurück. Dieses Element enthält ein `Error`- und ein `RequestId`-Element.

Das Element `Error` enthält die folgenden untergeordneten Elemente:
+ **`Type`** – Gibt an, ob es sich bei dem Fehler um einen Produzenten- oder einen Konsumentenfehler handelt.
+ **`Code`** – Gibt den Typ des Fehlers an.
+ **`Message`** – Gibt die Fehlerbedingung in einem lesbaren Format an.
+ **`Detail`** – (Optional) Gibt zusätzliche Details zu dem Fehler an.

Das Element `RequestId` enthält die UUID der Anforderung.

Nachfolgend finden Sie ein Beispiel für eine Antwort bei Fehlschlagen im XML-Format:

```
<ErrorResponse>
   <Error>
      <Type>Sender</Type>
      <Code>InvalidParameterValue</Code>
      <Message>
         Value (quename_nonalpha) for parameter QueueName is invalid.
         Must be an alphanumeric String of 1 to 80 in length.
      </Message>
   </Error>
   <RequestId>42d59b56-7407-4c4a-be0f-4c88daeea257</RequestId>
</ErrorResponse>
```

# Authentifizieren von Anfragen für Amazon SQS
<a name="sqs-api-request-authentication"></a>

Authentifizierung bezeichnet den Prozess der Identifizierung und Überprüfung des Absenders einer Anforderung. Während der ersten Phase der Authentifizierung überprüft AWS die Identität des Produzenten, und ob der Produzent [für die Verwendung von AWS registriert ist](https://aws.amazon.com/) (weitere Informationen finden Sie unter [Schritt 1: Erstellen Sie einen AWS-Konto und IAM-Benutzer](sqs-setting-up.md#sqs-creating-aws-account)). Halten Sie sich AWS als Nächstes an das folgende Verfahren:

1. Der Produzent (Absender) erhält die notwendigen Anmeldeinformationen.

1. Der Produzent sendet eine Anforderung mit den Anmeldeinformationen an den Konsumenten (Empfänger).

1. Der Konsument überprüft anhand der Anmeldeinformationen, ob der Produzent die Anforderung gesendet hat.

1. Es tritt einer der beiden folgenden Fälle ein:
   + Wenn die Authentifizierung erfolgreich durchgeführt wurde, wird die Anforderung vom Konsumenten verarbeitet.
   + Wenn die Authentifizierung fehlschlägt, wird die Anforderung vom Verbraucher abgelehnt und es wird eine Fehlermeldung zurückgegeben.

## Grundlegender Authentifizierungsprozess mit HMAC-SHA
<a name="sqs-api-basic-authentication-process"></a>

Beim Zugriff auf Amazon SQS mit der Abfrage-API müssen Sie die folgenden Elemente angeben, um die Anforderung zu authentifizieren:
+ Die **AWS Zugangsschlüssel-ID, mit** der Sie AWS-Konto identifiziert werden und AWS anhand derer Ihr geheimer Zugriffsschlüssel nachgeschlagen wird.
+ Die **HMAC-SHA-Anforderungssignatur**, berechnet anhand Ihres geheimen Zugangsschlüssels (ein gemeinsam genutzter geheimer Schlüssel, der nur Ihnen bekannt ist und AWS— weitere Informationen finden Sie unter). [RFC2104](http://www.faqs.org/rfcs/rfc2104.html) Das [AWS -SDK](https://aws.amazon.com/code/) übernimmt die Signatur. Wenn Sie jedoch eine Abfrageanforderung über HTTP oder HTTPS senden, müssen Sie in jede Abfrageanforderung eine Signatur einschließen.

  1. Ableiten eines Signature Version 4-Signaturschlüssels. Weitere Informationen finden Sie unter [Ableiten des Signaturschlüssels mit Java](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-java).
**Anmerkung**  
Amazon SQS unterstützt Signature Version 4, die im Vergleich zu früheren Versionen eine verbesserte SHA256 Sicherheit und Leistung bietet. Wenn Sie neue Anwendungen erstellen, die Amazon SQS nutzen, verwenden Sie Signature Version 4.

  1. Codieren Sie die Anforderungssignatur mit Base64. Das folgende Java-Codebeispiel führt folgende Schritte aus:

     ```
     package amazon.webservices.common;
     
     // Define common routines for encoding data in AWS requests.
     public class Encoding {
     
         /* Perform base64 encoding of input bytes.
          * rawData is the array of bytes to be encoded.
          * return is the base64-encoded string representation of rawData.
          */
         public static String EncodeBase64(byte[] rawData) {
             return Base64.encodeBytes(rawData);
         }
     }
     ```
+ Der **Zeitstempel (oder die Ablaufzeit)** der Anforderung. Der Zeitstempel, den Sie in der Anforderung verwenden, muss ein `dateTime`-Objekt mit [dem vollständigen Datum, einschließlich Stunden, Minuten und Sekunden, sein](http://www.w3.org/TR/xmlschema-2/#dateTime). Beispiel: `2007-01-31T23:59:59Z` Obwohl dies nicht erforderlich ist, empfehlen wird, die Angabe des Objekts in der UTC-Zeitzone (Greenwich Mean Time).
**Anmerkung**  
Stellen Sie sicher, dass Ihre Serverzeit richtig eingestellt ist. Wenn Sie einen Zeitstempel (statt eines Ablaufs) angeben, läuft die Anfrage automatisch 15 Minuten nach der angegebenen Zeit ab (Anfragen, deren Zeitstempel mehr als 15 Minuten vor der aktuellen Uhrzeit auf AWS Servern liegen, werden AWS nicht verarbeitet).  
Falls Sie .NET verwenden, dürfen Sie keine extrem spezifischen Zeitstempel senden (da unterschiedlich interpretiert wird, nach welchem Zeitraum die Anforderung verworfen werden sollte). In diesem Fall sollten Sie manuell `dateTime`-Objekte mit einer Genauigkeit von nicht mehr als einer Millisekunde erstellen.

## Teil 1: Die Anforderung von dem Benutzer
<a name="sqs-authentication-user"></a>

Gehen Sie wie folgt vor, um AWS Anfragen mithilfe einer HMAC-SHA-Anforderungssignatur zu authentifizieren.

![\[Diagramm, das die Anfrage des Benutzers beschreibt.\]](http://docs.aws.amazon.com/de_de/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-user.png)


1. Konstruieren Sie eine Anfrage an AWS. 

1. Berechnen Sie eine verschlüsselte Hash-Signatur (HMAC-SHA) für die Nachrichtenauthentifizierung anhand des geheimen Zugriffsschlüssels.

1. Fügen Sie die Signatur und Ihre Zugriffsschlüssel-ID in die Anfrage ein und senden Sie die Anfrage dann an AWS.

## Teil 2: Die Antwort von AWS
<a name="sqs-authentication-aws"></a>

AWS startet als Antwort den folgenden Prozess.

![\[Diagramm, das die Antwort von beschreibt AWS.\]](http://docs.aws.amazon.com/de_de/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-aws.png)


1. AWS verwendet die Zugriffsschlüssel-ID, um nach Ihrem geheimen Zugriffsschlüssel zu suchen.

1. AWS generiert eine Signatur aus den Anforderungsdaten und dem Secret Access Key und verwendet dabei denselben Algorithmus, den Sie zur Berechnung der Signatur verwendet haben, die Sie in der Anfrage gesendet haben.

1. Es tritt einer der beiden folgenden Fälle ein:
   + Wenn die AWS generierte Signatur mit der Signatur übereinstimmt, die Sie in der Anfrage gesendet haben, wird die Anfrage als authentisch AWS betrachtet.
   + Schlägt der Vergleich fehl, wird die Anfrage verworfen und es wird ein Fehler AWS zurückgegeben. 

# Amazon-SQS-Stapelaktionen
<a name="sqs-batch-api-actions"></a>

Amazon SQS bietet Batch-Aktionen, mit denen Sie Kosten senken und bis zu 10 Nachrichten mit einer einzigen Aktion bearbeiten können. Zu diesen Batch-Aktionen gehören:
+ `[SendMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessageBatch.html)`
+ `[DeleteMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessageBatch.html)`
+ `[ChangeMessageVisibilityBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibilityBatch.html)`

Mithilfe von Batch-Aktionen können Sie mehrere Operationen in einem einzigen API-Aufruf ausführen, wodurch die Leistung optimiert und die Kosten gesenkt werden können. Sie können die Batch-Funktionalität mithilfe der Abfrage-API oder eines beliebigen AWS SDK nutzen, das Amazon SQS SQS-Batch-Aktionen unterstützt.

**Wichtige Details**
+ **Größenbeschränkung für Nachrichten:** Die Gesamtgröße aller Nachrichten, die in einem einzigen `SendMessageBatch` Anruf gesendet werden, darf 1.048.576 Byte (1 MiB) nicht überschreiten
+ **Berechtigungen:** Sie können Berechtigungen für, oder nicht explizit festlegen. `SendMessageBatch` `DeleteMessageBatch` `ChangeMessageVisibilityBatch` Stattdessen werden durch das Festlegen von Berechtigungen für `SendMessage``DeleteMessage`, oder Berechtigungen für die entsprechenden Batchversionen der Aktionen `ChangeMessageVisibility` festgelegt.
+ **Konsolenunterstützung:** Die Amazon SQS SQS-Konsole unterstützt keine Batch-Aktionen. Sie müssen die Abfrage-API oder ein AWS SDK verwenden, um Batch-Operationen durchzuführen.

## Stapelverarbeitungsaktionen für Nachrichten
<a name="batching-message-actions"></a>

Um Kosten und Effizienz weiter zu optimieren, sollten Sie die folgenden bewährten Methoden für die Batchverarbeitung von Nachrichtenaktionen berücksichtigen:
+ **Batch-API-Aktionen:** Verwenden Sie die [Amazon SQS SQS-Batch-API-Aktionen](#sqs-batch-api-actions), um Nachrichten zu senden, zu empfangen und zu löschen und um das Timeout für die Nachrichtensichtbarkeit mehrerer Nachrichten mit einer einzigen Aktion zu ändern. Dies reduziert die Anzahl der API-Aufrufe und die damit verbundenen Kosten.
+ **Clientseitige Pufferung und lange Abfragen: Kombinieren Sie die clientseitige Pufferung** [mit der Batchverarbeitung von Anfragen, indem Sie lange Abfragen zusammen mit dem gepufferten asynchronen Client verwenden, der im Lieferumfang von enthalten ist.](sqs-client-side-buffering-request-batching.md) AWS SDK für Java Dieser Ansatz trägt dazu bei, die Anzahl der Anfragen zu minimieren und die Verarbeitung großer Nachrichtenmengen zu optimieren.

**Anmerkung**  
Der Amazon SQS Buffered Asynchronous Client unterstützt derzeit keine FIFO-Warteschlangen.

# Aktivierung der clientseitigen Pufferung und der Batchverarbeitung von Anfragen mit Amazon SQS
<a name="sqs-client-side-buffering-request-batching"></a>

[AWS SDK für Java](https://aws.amazon.com/sdkforjava/) enthält den `AmazonSQSBufferedAsyncClient`, der auf Amazon SQS zugreift. Dieser Client ermöglicht eine einfache Batchverarbeitung von Anfragen mithilfe der clientseitigen Pufferung. Aufrufe vom Client werden zuerst gepuffert und dann als Batch-Anfrage an Amazon SQS gesendet.

Mit der clientseitigen Pufferung können bis zu 10 Anforderungen zwischengespeichert und als Stapelanforderung gesendet werden. Dadurch werden Ihre Kosten für die Verwendung von Amazon SQS gesenkt und die Anzahl der gesendeten Anforderungen verringert. `AmazonSQSBufferedAsyncClient` puffert synchrone und asynchrone Aufrufe. Als Stapel verarbeitete Anforderungen und die Unterstützung für [langes Abrufen](sqs-short-and-long-polling.md) können ebenfalls zu einem erhöhten Durchsatz beitragen. Weitere Informationen finden Sie unter [Steigerung des Durchsatzes durch horizontale Skalierung und Action-Batching mit Amazon SQS](sqs-throughput-horizontal-scaling-and-batching.md).

Da `AmazonSQSBufferedAsyncClient` die gleiche Schnittstelle implementiert wie `AmazonSQSAsyncClient`, sollte die Migration von `AmazonSQSAsyncClient` zu `AmazonSQSBufferedAsyncClient` in der Regel lediglich minimale Änderungen an Ihrem vorhandenen Code erfordern.

**Anmerkung**  
Der Amazon SQS Buffered Asynchronous Client unterstützt derzeit keine FIFO-Warteschlangen.

## Amazon verwenden SQSBuffered AsyncClient
<a name="using-buffered-async-client"></a>

Bevor Sie beginnen, führen Sie die Schritte in [Einrichten von Amazon SQS](sqs-setting-up.md) aus. 

### AWS SDK for Java 1.x
<a name="using-buffered-async-client-java1"></a>

Für AWS SDK for Java 1.x können Sie ein neues erstellen, das auf dem folgenden Beispiel `AmazonSQSBufferedAsyncClient` basiert:

```
// Create the basic Amazon SQS async client
final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();
 
// Create the buffered client
final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync);
```

Nachdem Sie den neuen `AmazonSQSBufferedAsyncClient` erstellt haben, können Sie ihn verwenden, um mehrere Anforderungen an Amazon SQS zu senden (wie mit dem `AmazonSQSAsyncClient`), beispielsweise:

```
final CreateQueueRequest createRequest = new CreateQueueRequest().withQueueName("MyQueue");
 
final CreateQueueResult res = bufferedSqs.createQueue(createRequest);
 
final SendMessageRequest request = new SendMessageRequest();
final String body = "Your message text" + System.currentTimeMillis();
request.setMessageBody( body );
request.setQueueUrl(res.getQueueUrl());
 
final Future<SendMessageResult> sendResult = bufferedSqs.sendMessageAsync(request);
 
final ReceiveMessageRequest receiveRq = new ReceiveMessageRequest()
    .withMaxNumberOfMessages(1)
    .withQueueUrl(queueUrl);
final ReceiveMessageResult rx = bufferedSqs.receiveMessage(receiveRq);
```

### Amazon konfigurieren SQSBuffered AsyncClient
<a name="configuring-buffered-async-client"></a>

`AmazonSQSBufferedAsyncClient` ist mit Einstellungen vorkonfiguriert, die für die meisten Anwendungsfälle verwendet werden können. Sie können `AmazonSQSBufferedAsyncClient` weiter konfigurieren, z. B.:

1. Erstellen Sie eine Instance der Klasse `QueueBufferConfig` mit den erforderlichen Konfigurationsparametern.

1. Stellen Sie die Instance dem `AmazonSQSBufferedAsyncClient`-Konstruktor zur Verfügung.

```
// Create the basic Amazon SQS async client
final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();
 
final QueueBufferConfig config = new QueueBufferConfig()
    .withMaxInflightReceiveBatches(5)
    .withMaxDoneReceiveBatches(15);
 
// Create the buffered client
final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync, config);
```


**QueueBufferConfig Konfigurationsparameter**  

| Parameter | Standardwert | Description | 
| --- | --- | --- | 
| longPoll | true |  Wenn `longPoll` auf `true` festgelegt ist, versucht `AmazonSQSBufferedAsyncClient`, Nachrichten durch langes Abrufen abzurufen.  | 
| longPollWaitTimeoutSeconds | 20 s |  Die maximale Dauer (in Sekunden), die ein `ReceiveMessage`-Aufruf beim Warten auf das Auftauchen von Nachrichten in der Warteschlange auf dem Server blockiert wird, bevor er mit einem leeren Empfangsergebnis zurückkehrt.  Wenn langes Abrufen deaktiviert ist, hat diese Einstellung hat keine Auswirkungen.   | 
| maxBatchOpenMs | 200 ms |  Die maximale Dauer (in Millisekunden), die ein ausgehender Aufruf auf andere Aufrufe desselben Typs wartet, mit denen er Nachrichten desselben Typs zu einem Stapel zusammenfasst. Je höher die Einstellung, desto weniger Stapel sind erforderlich, um dieselbe Anzahl an Aufgaben auszuführen (der erste Aufruf eines Stapels muss jedoch länger in der Warteschlange warten). Wenn Sie diesen Parameter auf `0` einstellen, warten gesendete Anforderungen nicht auf andere Anforderungen, wodurch die Stapelverarbeitung effektiv deaktiviert wird.  | 
| maxBatchSize | 10 Anforderungen pro Stapel |  Die maximale Anzahl von Nachrichten, die in einer einzelnen Stapelanforderung zusammengefasst werden. Je höher die Einstellung, desto weniger Stapel müssen die gleiche Anzahl von Anforderungen ausführen.  10 Anforderungen pro Stapel ist der maximal zulässige Wert für Amazon SQS.   | 
| maxBatchSizeBytes | 1 MiB |  Die maximale Größe eines Nachrichtenstapels in Bytes, die der Client versucht, an Amazon SQS zu senden.  1 MiB ist der maximal zulässige Wert für Amazon SQS.   | 
| maxDoneReceiveBatches | 10 Stapel |  Die maximale Anzahl von Empfangsstapeln, die `AmazonSQSBufferedAsyncClient` vorab abruft und clientseitig speichert. Je höher die Einstellung, desto mehr Empfangsanforderungen können erfüllt werden, ohne dass ein Aufruf an Amazon SQS gestartet werden muss (je mehr Nachrichten jedoch vorab abgerufen werden, desto länger bleiben sie im Puffer, was bedeutet, dass deren Zeitbeschränkung für die Sichtbarkeit abläuft).  `0`gibt an, dass der gesamte Vorabruf von Nachrichten deaktiviert ist und Nachrichten nur bei Bedarf abgerufen werden.   | 
| maxInflightOutboundBatches | 5 Stapel |  Die maximale Anzahl der aktiven ausgehenden Stapel, die gleichzeitig verarbeitet werden können. Je höher die Einstellung, desto schneller können ausgehende Stapel gesendet werden (in Abhängigkeit von anderen Kontingenten, z. B. durch CPU oder Bandbreite) und desto mehr Threads werden von `AmazonSQSBufferedAsyncClient` verbraucht.  | 
| maxInflightReceiveBatches | 10 Stapel |  Die maximale Anzahl der aktiven Empfangsstapel, die gleichzeitig verarbeitet werden können. Je höher die Einstellung, desto mehr Nachrichten können empfangen werden (in Abhängigkeit von anderen Kontingenten, z. B. durch CPU oder Bandbreite) und desto mehr Threads werden von `AmazonSQSBufferedAsyncClient` verbraucht.  `0`gibt an, dass der gesamte Vorabruf von Nachrichten deaktiviert ist und Nachrichten nur bei Bedarf abgerufen werden.   | 
| visibilityTimeoutSeconds | -1 |  Wenn dieser Parameter auf einen positiven Wert ungleich null festgelegt ist, überschreibt die hier festgelegte Zeitbeschränkung für die Sichtbarkeit diejenige, die für die Warteschlange festgelegt ist, über die Nachrichten abgerufen werden.  `-1` gibt an, dass die Standardeinstellung für die Warteschlange ausgewählt ist. Sie können als Zeitbeschränkung für die Sichtbarkeit nicht `0` festlegen.   | 

### AWS SDK for Java 2.x
<a name="using-buffered-async-client-java2"></a>

Für AWS SDK for Java 2.x können Sie ein neues erstellen, das auf dem folgenden Beispiel `SqsAsyncBatchManager` basiert:

```
// Create the basic Sqs Async Client
SqsAsyncClient sqs = SqsAsyncClient.builder() 
    .region(Region.US_EAST_1) 
    .build();

// Create the batch manager
SqsAsyncBatchManager sqsAsyncBatchManager = sqs.batchManager();
```

Nachdem Sie den neuen `SqsAsyncBatchManager` erstellt haben, können Sie ihn verwenden, um mehrere Anforderungen an Amazon SQS zu senden (wie mit dem `SqsAsyncClient`), beispielsweise:

```
final String queueName = "MyAsyncBufferedQueue" + UUID.randomUUID();
final CreateQueueRequest request = CreateQueueRequest.builder().queueName(queueName).build();
final String queueUrl = sqs.createQueue(request).join().queueUrl();
System.out.println("Queue created: " + queueUrl);


// Send messages
CompletableFuture<SendMessageResponse> sendMessageFuture;
for (int i = 0; i < 10; i++) {
    final int index = i;
    sendMessageFuture = sqsAsyncBatchManager.sendMessage(
            r -> r.messageBody("Message " + index).queueUrl(queueUrl));
    SendMessageResponse response= sendMessageFuture.join();
    System.out.println("Message " + response.messageId() + " sent!");
}

// Receive messages with customized configurations
CompletableFuture<ReceiveMessageResponse> receiveResponseFuture = customizedBatchManager.receiveMessage(
        r -> r.queueUrl(queueUrl)
                .waitTimeSeconds(10)
                .visibilityTimeout(20)
                .maxNumberOfMessages(10)
);
System.out.println("You have received " + receiveResponseFuture.join().messages().size() + " messages in total.");

// Delete messages
DeleteQueueRequest deleteQueueRequest =  DeleteQueueRequest.builder().queueUrl(queueUrl).build();
int code = sqs.deleteQueue(deleteQueueRequest).join().sdkHttpResponse().statusCode();
System.out.println("Queue is deleted, with statusCode " + code);
```

### Konfiguration SqsAsyncBatchManager
<a name="configuring-SqsAsyncBatchManager"></a>

`SqsAsyncBatchManager` ist mit Einstellungen vorkonfiguriert, die für die meisten Anwendungsfälle verwendet werden können. Sie können `SqsAsyncBatchManager` weiter konfigurieren, z. B.:

Erstellen einer benutzerdefinierten Konfiguration über`SqsAsyncBatchManager.Builder`:

```
SqsAsyncBatchManager customizedBatchManager = SqsAsyncBatchManager.builder() 
    .client(sqs)
    .scheduledExecutor(Executors.newScheduledThreadPool(5))
    .overrideConfiguration(b -> b 
        .maxBatchSize(10)
        .sendRequestFrequency(Duration.ofMillis(200))
        .receiveMessageMinWaitDuration(Duration.ofSeconds(10))
        .receiveMessageVisibilityTimeout(Duration.ofSeconds(20)) 
        .receiveMessageAttributeNames(Collections.singletonList("*"))
        .receiveMessageSystemAttributeNames(Collections.singletonList(MessageSystemAttributeName.ALL)))
    .build();
```


**`BatchOverrideConfiguration`-Parameter**  

| Parameter | Standardwert | Description | 
| --- | --- | --- | 
| maxBatchSize |  10 Anforderungen pro Stapel  | Die maximale Anzahl von Nachrichten, die in einer einzelnen Stapelanforderung zusammengefasst werden. Je höher die Einstellung, desto weniger Stapel müssen die gleiche Anzahl von Anforderungen ausführen.  Der zulässige Höchstwert für Amazon SQS beträgt 10 Anfragen pro Stapel.  | 
| sendRequestFrequency |  200 ms  | Die maximale Dauer (in Millisekunden), die ein ausgehender Aufruf auf andere Aufrufe desselben Typs wartet, mit denen er Nachrichten desselben Typs zu einem Stapel zusammenfasst. Je höher die Einstellung, desto weniger Stapel sind erforderlich, um dieselbe Anzahl an Aufgaben auszuführen (der erste Aufruf eines Stapels muss jedoch länger in der Warteschlange warten). Wenn Sie diesen Parameter auf `0` einstellen, warten gesendete Anforderungen nicht auf andere Anforderungen, wodurch die Stapelverarbeitung effektiv deaktiviert wird. | 
| receiveMessageVisibilityTimeout |  -1  | Wenn dieser Parameter auf einen positiven Wert ungleich null festgelegt ist, überschreibt die hier festgelegte Zeitbeschränkung für die Sichtbarkeit diejenige, die für die Warteschlange festgelegt ist, über die Nachrichten abgerufen werden.   `1` gibt an, dass die Standardeinstellung für die Warteschlange ausgewählt ist. Sie können als Zeitbeschränkung für die Sichtbarkeit nicht `0` festlegen.   | 
| receiveMessageMinWaitDuration |  50 ms  | Die Mindestzeit (in Millisekunden), die ein `receiveMessage` Anruf darauf wartet, dass verfügbare Nachrichten abgerufen werden. Je höher die Einstellung, desto weniger Batches sind erforderlich, um dieselbe Anzahl von Anfragen auszuführen.  | 

# Steigerung des Durchsatzes durch horizontale Skalierung und Action-Batching mit Amazon SQS
<a name="sqs-throughput-horizontal-scaling-and-batching"></a>

Amazon SQS unterstützt Nachrichtenübermittlung mit hohem Durchsatz. Einzelheiten zu Durchsatzgrenzen finden Sie unter. [Amazon SQS SQS-Nachrichtenkontingente](quotas-messages.md)

So maximieren Sie den Durchsatz:
+ [Skalieren](#horizontal-scaling) Sie Hersteller und Verbraucher horizontal, indem Sie jeweils weitere Instanzen hinzufügen.
+ Verwenden Sie [Action-Batching](#request-batching), um mehrere Nachrichten in einer einzigen Anfrage zu senden oder zu empfangen und so den Aufwand für API-Aufrufe zu reduzieren.

## Horizontale Skalierung
<a name="horizontal-scaling"></a>

Da Sie über ein HTTP-Anfrage-Antwort-Protokoll auf Amazon SQS zugreifen, beschränkt die *Anforderungslatenz* (der Zeitraum zwischen dem Initiieren einer Anforderung und dem Empfangen einer Antwort) den Durchsatz, den Sie über einen einzelnen Thread über eine einzelne Verbindung erzielen können. Wenn beispielsweise der Mittelwert der Latenz eines auf EC2 basierenden Clients zu Amazon SQS in derselben Region ca. 20 ms beträgt, liegt der Mittelwert des maximalen Durchsatzes eines einzelnen Threads über eine einzelne Verbindung bei 50 TPS. 

*Horizontale Skalierung* bedeutet, dass die Anzahl Ihrer Nachrichtenproduzenten (die `[SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)`-Anforderungen erstellen) und Konsumenten (die `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)`- und `[DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html)`-Anforderungen erstellen) erhöht wird, um den Gesamtdurchsatz der Warteschlange zu steigern. Sie können auf drei Arten horizontal skalieren:
+ Erhöhen der Anzahl der Threads pro Client
+ Hinzufügen weiterer Clients
+ Erhöhen der Anzahl der Threads pro Client und Hinzufügen weiterer Clients

Wenn Sie weitere Clients hinzufügen, erzielen Sie eine wesentliche lineare Steigerung des Durchsatzes der Warteschlange. Wenn Sie die Anzahl der Clients beispielsweise verdoppeln, verdoppeln Sie auch den Durchsatz. 

## Stapelverarbeitung von Aktionen
<a name="request-batching"></a>

Mit der *Stapelverarbeitung* wird in den einzelnen Roundtrips an den Service mehr Arbeit ausgeführt (z. B. das Senden mehrerer Nachrichten mit einer einzelnen `SendMessageBatch`-Anforderung). Die Amazon-SQS-Stapelaktionen sind `[SendMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessageBatch.html)`, `[DeleteMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessageBatch.html)` und `[ChangeMessageVisibilityBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibilityBatch.html)`. Um die Stapelverarbeitung zu nutzen, ohne Ihre Produzenten und Konsumenten zu ändern, können Sie den [Amazon SQS Buffered Asynchronous Client](sqs-client-side-buffering-request-batching.md) verwenden.

**Anmerkung**  
Da mit `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)` 10 Nachrichten gleichzeitig verarbeitet werden können, wird keine `ReceiveMessageBatch`-Aktion ausgeführt.

Die Stapelverarbeitung verteilt die Latenz der Stapelaktion über mehrere Nachrichten in einer Stapelanforderung, anstatt die gesamte Latenz für eine einzelne Nachricht (z. B. eine `[SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)`-Anforderung) zu akzeptieren. Da jeder Roundtrip mehr Arbeit verrichtet, nutzen Stapelanforderungen Threads und Verbindungen effektiver und verbessern somit den Durchsatz.

Sie können die Stapelverarbeitung mit der horizontalen Skalierung kombinieren, um einen Durchsatz mit weniger Threads, Verbindungen und Anforderungen zu bieten, als dies bei einzelnen Nachrichtenanforderungen der Fall ist. Mit Amazon-SQS-Aktionen im Stapel können Sie bis zu 10 Nachrichten gleichzeitig senden, empfangen oder löschen. Da in Amazon SQS Gebühren nach Anforderung berechnet werden, kann die Stapelverarbeitung wesentlich zur Verringerung der Kosten beitragen. 

Mit der Stapelverarbeitung kann eine gewisse Komplexität für Ihre Anwendung einhergehen (z. B. muss die Anwendung Nachrichten vor der Übermittlung sammeln oder gelegentlich länger auf eine Antwort warten). Die Stapelverarbeitung kann in folgenden Fällen jedoch weiterhin effektiv sein: 
+ Ihre Anwendung erstellt in kurzer Zeit viele Nachrichten, sodass es niemals zu einer sehr langen Verzögerung kommt. 
+ Anders als typische Nachrichtenproduzenten, die Nachrichten als Antwort auf Ereignisse senden müssen, die sie nicht steuern können, ruft ein Nachrichtenkonsument Nachrichten nach eigenem Ermessen aus einer Warteschlange ab. 

**Wichtig**  
Eine Stapelanforderung kann erfolgreich ausgeführt werden, auch wenn einzelne Nachrichten im Stapel fehlgeschlagen sind. Überprüfen Sie nach einer Stapelanforderung stets, ob einzelne Nachrichten nicht zugestellt werden konnten, und führen Sie diese bei Bedarf erneut aus.

## Funktionierendes Java-Beispiel für einzelne Operationsanforderungen und Stapelanforderungen
<a name="working-java-example-batch-requests"></a>

### Voraussetzungen
<a name="batch-request-java-example-prerequisites"></a>

Fügen Sie dem Pfad für Ihre Java-Build-Klasse die Pakete `aws-java-sdk-sqs.jar`, `aws-java-sdk-ec2.jar` und `commons-logging.jar` hinzu. Das folgende Beispiel zeigt diese Abhängigkeiten in der `pom.xml`-Datei eines Maven-Projekts.

```
<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-sqs</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-ec2</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>LATEST</version>
    </dependency>
</dependencies>
```

### SimpleProducerConsumer.java
<a name="batch-request-java-example-code"></a>

Das nachstehende Java-Code-Beispiel veranschaulicht ein einfaches Produzent-Konsument-Muster. Der Haupt-Thread ruft eine Reihe von Produzenten- und Konsumenten-Threads auf, die 1-KB-Nachrichten für eine bestimmte Zeit verarbeiten. Dieses Beispiel enthält Produzenten und Konsumenten, die einzelne Operationsanforderungen senden, und solche, die Stapelanforderungen senden.

```
/*
 * Copyright 2010-2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  https://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 *
 */

import com.amazonaws.AmazonClientException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Start a specified number of producer and consumer threads, and produce-consume
 * for the least of the specified duration and 1 hour. Some messages can be left
 * in the queue because producers and consumers might not be in exact balance.
 */
public class SimpleProducerConsumer {

    // The maximum runtime of the program.
    private final static int MAX_RUNTIME_MINUTES = 60;
    private final static Log log = LogFactory.getLog(SimpleProducerConsumer.class);

    public static void main(String[] args) throws InterruptedException {

        final Scanner input = new Scanner(System.in);

        System.out.print("Enter the queue name: ");
        final String queueName = input.nextLine();

        System.out.print("Enter the number of producers: ");
        final int producerCount = input.nextInt();

        System.out.print("Enter the number of consumers: ");
        final int consumerCount = input.nextInt();

        System.out.print("Enter the number of messages per batch: ");
        final int batchSize = input.nextInt();

        System.out.print("Enter the message size in bytes: ");
        final int messageSizeByte = input.nextInt();

        System.out.print("Enter the run time in minutes: ");
        final int runTimeMinutes = input.nextInt();

        /*
         * Create a new instance of the builder with all defaults (credentials
         * and region) set automatically. For more information, see Creating
         * Service Clients in the AWS SDK for Java Developer Guide.
         */
        final ClientConfiguration clientConfiguration = new ClientConfiguration()
                .withMaxConnections(producerCount + consumerCount);

        final AmazonSQS sqsClient = AmazonSQSClientBuilder.standard()
                .withClientConfiguration(clientConfiguration)
                .build();

        final String queueUrl = sqsClient
                .getQueueUrl(new GetQueueUrlRequest(queueName)).getQueueUrl();

        // The flag used to stop producer, consumer, and monitor threads.
        final AtomicBoolean stop = new AtomicBoolean(false);

        // Start the producers.
        final AtomicInteger producedCount = new AtomicInteger();
        final Thread[] producers = new Thread[producerCount];
        for (int i = 0; i < producerCount; i++) {
            if (batchSize == 1) {
                producers[i] = new Producer(sqsClient, queueUrl, messageSizeByte,
                        producedCount, stop);
            } else {
                producers[i] = new BatchProducer(sqsClient, queueUrl, batchSize,
                        messageSizeByte, producedCount,
                        stop);
            }
            producers[i].start();
        }

        // Start the consumers.
        final AtomicInteger consumedCount = new AtomicInteger();
        final Thread[] consumers = new Thread[consumerCount];
        for (int i = 0; i < consumerCount; i++) {
            if (batchSize == 1) {
                consumers[i] = new Consumer(sqsClient, queueUrl, consumedCount,
                        stop);
            } else {
                consumers[i] = new BatchConsumer(sqsClient, queueUrl, batchSize,
                        consumedCount, stop);
            }
            consumers[i].start();
        }

        // Start the monitor thread.
        final Thread monitor = new Monitor(producedCount, consumedCount, stop);
        monitor.start();

        // Wait for the specified amount of time then stop.
        Thread.sleep(TimeUnit.MINUTES.toMillis(Math.min(runTimeMinutes,
                MAX_RUNTIME_MINUTES)));
        stop.set(true);

        // Join all threads.
        for (int i = 0; i < producerCount; i++) {
            producers[i].join();
        }

        for (int i = 0; i < consumerCount; i++) {
            consumers[i].join();
        }

        monitor.interrupt();
        monitor.join();
    }

    private static String makeRandomString(int sizeByte) {
        final byte[] bs = new byte[(int) Math.ceil(sizeByte * 5 / 8)];
        new Random().nextBytes(bs);
        bs[0] = (byte) ((bs[0] | 64) & 127);
        return new BigInteger(bs).toString(32);
    }

    /**
     * The producer thread uses {@code SendMessage}
     * to send messages until it is stopped.
     */
    private static class Producer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final AtomicInteger producedCount;
        final AtomicBoolean stop;
        final String theMessage;

        Producer(AmazonSQS sqsQueueBuffer, String queueUrl, int messageSizeByte,
                 AtomicInteger producedCount, AtomicBoolean stop) {
            this.sqsClient = sqsQueueBuffer;
            this.queueUrl = queueUrl;
            this.producedCount = producedCount;
            this.stop = stop;
            this.theMessage = makeRandomString(messageSizeByte);
        }

        /*
         * The producedCount object tracks the number of messages produced by
         * all producer threads. If there is an error, the program exits the
         * run() method.
         */
        public void run() {
            try {
                while (!stop.get()) {
                    sqsClient.sendMessage(new SendMessageRequest(queueUrl,
                            theMessage));
                    producedCount.incrementAndGet();
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("Producer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * The producer thread uses {@code SendMessageBatch}
     * to send messages until it is stopped.
     */
    private static class BatchProducer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final int batchSize;
        final AtomicInteger producedCount;
        final AtomicBoolean stop;
        final String theMessage;

        BatchProducer(AmazonSQS sqsQueueBuffer, String queueUrl, int batchSize,
                      int messageSizeByte, AtomicInteger producedCount,
                      AtomicBoolean stop) {
            this.sqsClient = sqsQueueBuffer;
            this.queueUrl = queueUrl;
            this.batchSize = batchSize;
            this.producedCount = producedCount;
            this.stop = stop;
            this.theMessage = makeRandomString(messageSizeByte);
        }

        public void run() {
            try {
                while (!stop.get()) {
                    final SendMessageBatchRequest batchRequest =
                            new SendMessageBatchRequest().withQueueUrl(queueUrl);

                    final List<SendMessageBatchRequestEntry> entries =
                            new ArrayList<SendMessageBatchRequestEntry>();
                    for (int i = 0; i < batchSize; i++)
                        entries.add(new SendMessageBatchRequestEntry()
                                .withId(Integer.toString(i))
                                .withMessageBody(theMessage));
                    batchRequest.setEntries(entries);

                    final SendMessageBatchResult batchResult =
                            sqsClient.sendMessageBatch(batchRequest);
                    producedCount.addAndGet(batchResult.getSuccessful().size());

                    /*
                     * Because SendMessageBatch can return successfully, but
                     * individual batch items fail, retry the failed batch items.
                     */
                    if (!batchResult.getFailed().isEmpty()) {
                        log.warn("Producer: retrying sending "
                                + batchResult.getFailed().size() + " messages");
                        for (int i = 0, n = batchResult.getFailed().size();
                             i < n; i++) {
                            sqsClient.sendMessage(new
                                    SendMessageRequest(queueUrl, theMessage));
                            producedCount.incrementAndGet();
                        }
                    }
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("BatchProducer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * The consumer thread uses {@code ReceiveMessage} and {@code DeleteMessage}
     * to consume messages until it is stopped.
     */
    private static class Consumer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final AtomicInteger consumedCount;
        final AtomicBoolean stop;

        Consumer(AmazonSQS sqsClient, String queueUrl, AtomicInteger consumedCount,
                 AtomicBoolean stop) {
            this.sqsClient = sqsClient;
            this.queueUrl = queueUrl;
            this.consumedCount = consumedCount;
            this.stop = stop;
        }

        /*
         * Each consumer thread receives and deletes messages until the main
         * thread stops the consumer thread. The consumedCount object tracks the
         * number of messages that are consumed by all consumer threads, and the
         * count is logged periodically.
         */
        public void run() {
            try {
                while (!stop.get()) {
                    try {
                        final ReceiveMessageResult result = sqsClient
                                .receiveMessage(new
                                        ReceiveMessageRequest(queueUrl));

                        if (!result.getMessages().isEmpty()) {
                            final Message m = result.getMessages().get(0);
                            sqsClient.deleteMessage(new
                                    DeleteMessageRequest(queueUrl,
                                    m.getReceiptHandle()));
                            consumedCount.incrementAndGet();
                        }
                    } catch (AmazonClientException e) {
                        log.error(e.getMessage());
                    }
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("Consumer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * The consumer thread uses {@code ReceiveMessage} and {@code
     * DeleteMessageBatch} to consume messages until it is stopped.
     */
    private static class BatchConsumer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final int batchSize;
        final AtomicInteger consumedCount;
        final AtomicBoolean stop;

        BatchConsumer(AmazonSQS sqsClient, String queueUrl, int batchSize,
                      AtomicInteger consumedCount, AtomicBoolean stop) {
            this.sqsClient = sqsClient;
            this.queueUrl = queueUrl;
            this.batchSize = batchSize;
            this.consumedCount = consumedCount;
            this.stop = stop;
        }

        public void run() {
            try {
                while (!stop.get()) {
                    final ReceiveMessageResult result = sqsClient
                            .receiveMessage(new ReceiveMessageRequest(queueUrl)
                                    .withMaxNumberOfMessages(batchSize));

                    if (!result.getMessages().isEmpty()) {
                        final List<Message> messages = result.getMessages();
                        final DeleteMessageBatchRequest batchRequest =
                                new DeleteMessageBatchRequest()
                                        .withQueueUrl(queueUrl);

                        final List<DeleteMessageBatchRequestEntry> entries =
                                new ArrayList<DeleteMessageBatchRequestEntry>();
                        for (int i = 0, n = messages.size(); i < n; i++)
                            entries.add(new DeleteMessageBatchRequestEntry()
                                    .withId(Integer.toString(i))
                                    .withReceiptHandle(messages.get(i)
                                            .getReceiptHandle()));
                        batchRequest.setEntries(entries);

                        final DeleteMessageBatchResult batchResult = sqsClient
                                .deleteMessageBatch(batchRequest);
                        consumedCount.addAndGet(batchResult.getSuccessful().size());

                        /*
                         * Because DeleteMessageBatch can return successfully,
                         * but individual batch items fail, retry the failed
                         * batch items.
                         */
                        if (!batchResult.getFailed().isEmpty()) {
                            final int n = batchResult.getFailed().size();
                            log.warn("Producer: retrying deleting " + n
                                    + " messages");
                            for (BatchResultErrorEntry e : batchResult
                                    .getFailed()) {

                                sqsClient.deleteMessage(
                                        new DeleteMessageRequest(queueUrl,
                                                messages.get(Integer
                                                        .parseInt(e.getId()))
                                                        .getReceiptHandle()));

                                consumedCount.incrementAndGet();
                            }
                        }
                    }
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("BatchConsumer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * This thread prints every second the number of messages produced and
     * consumed so far.
     */
    private static class Monitor extends Thread {
        private final AtomicInteger producedCount;
        private final AtomicInteger consumedCount;
        private final AtomicBoolean stop;

        Monitor(AtomicInteger producedCount, AtomicInteger consumedCount,
                AtomicBoolean stop) {
            this.producedCount = producedCount;
            this.consumedCount = consumedCount;
            this.stop = stop;
        }

        public void run() {
            try {
                while (!stop.get()) {
                    Thread.sleep(1000);
                    log.info("produced messages = " + producedCount.get()
                            + ", consumed messages = " + consumedCount.get());
                }
            } catch (InterruptedException e) {
                // Allow the thread to exit.
            }
        }
    }
}
```

### Überwachen von Volume-Metriken aus der Beispielausführung
<a name="batch-request-java-example-monitoring-metrics"></a>

Amazon SQS erstellt automatisch Volumen-Metriken für gesendete, empfangene und gelöschte Nachrichten. Auf diese und andere Metriken können Sie über die Registerkarte **Monitoring (Überwachung)** für Ihre Warteschlange oder in der [CloudWatch -Konsole](https://console.aws.amazon.com/cloudwatch/home) zugreifen.

**Anmerkung**  
Nach dem Starten der Warteschlange kann es bis zu 15 Minuten dauern, bis die Metriken verfügbar sind.

# Amazon SQS mit einem AWS SDK verwenden
<a name="sdk-general-information-section"></a>

AWS Software Development Kits (SDKs) sind für viele gängige Programmiersprachen verfügbar. Jedes SDK bietet eine API, Codebeispiele und Dokumentation, die es Entwicklern erleichtern, Anwendungen in ihrer bevorzugten Sprache zu erstellen.


| SDK-Dokumentation | Codebeispiele | 
| --- | --- | 
| [AWS SDK für C\$1\$1](https://docs.aws.amazon.com/sdk-for-cpp) | [AWS SDK für C\$1\$1 Codebeispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp) | 
| [AWS CLI](https://docs.aws.amazon.com/cli) | [AWS CLI Code-Beispiele](https://docs.aws.amazon.com/code-library/latest/ug/cli_2_code_examples.html) | 
| [AWS SDK für Go](https://docs.aws.amazon.com/sdk-for-go) | [AWS SDK für Go Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/gov2) | 
| [AWS SDK für Java](https://docs.aws.amazon.com/sdk-for-java) | [AWS SDK für Java Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2) | 
| [AWS SDK für JavaScript](https://docs.aws.amazon.com/sdk-for-javascript) | [AWS SDK für JavaScript Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3) | 
| [AWS SDK für Kotlin](https://docs.aws.amazon.com/sdk-for-kotlin) | [AWS SDK für Kotlin Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin) | 
| [AWS SDK für .NET](https://docs.aws.amazon.com/sdk-for-net) | [AWS SDK für .NET Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3) | 
| [AWS SDK für PHP](https://docs.aws.amazon.com/sdk-for-php) | [AWS SDK für PHP Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php) | 
| [AWS -Tools für PowerShell](https://docs.aws.amazon.com/powershell) | [AWS -Tools für PowerShell Code-Beispiele](https://docs.aws.amazon.com/code-library/latest/ug/powershell_5_code_examples.html) | 
| [AWS SDK für Python (Boto3)](https://docs.aws.amazon.com/pythonsdk) | [AWS SDK für Python (Boto3) Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python) | 
| [AWS SDK für Ruby](https://docs.aws.amazon.com/sdk-for-ruby) | [AWS SDK für Ruby Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby) | 
| [AWS SDK für Rust](https://docs.aws.amazon.com/sdk-for-rust) | [AWS SDK für Rust Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1) | 
| [AWS SDK für SAP ABAP](https://docs.aws.amazon.com/sdk-for-sapabap) | [AWS SDK für SAP ABAP Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap) | 
| [AWS SDK für Swift](https://docs.aws.amazon.com/sdk-for-swift) | [AWS SDK für Swift Code-Beispiele](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift) | 

**Beispiel für die Verfügbarkeit**  
Sie können nicht finden, was Sie brauchen? Fordern Sie ein Codebeispiel an, indem Sie unten den Link **Provide feedback** (Feedback geben) auswählen.