Compressione delle richieste HTTP in Amazon OpenSearch Service - Amazon OpenSearch Service

Compressione delle richieste HTTP in Amazon OpenSearch Service

È possibile comprimere le richieste HTTP e le risposte nei domini Amazon OpenSearch Service utilizzando la compressione gzip. La compressione gzip consente di ridurre le dimensioni dei documenti e di ridurre l'utilizzo della larghezza di banda e la latenza, migliorando così la velocità di trasferimento.

La compressione gzip è supportata per tutti i domini che eseguono OpenSearch o Elasticsearch 6.0 o versioni successive. Alcuni client OpenSearch hanno il supporto integrato per la compressione gzip e molti linguaggi di programmazione hanno librerie che semplificano il processo.

Abilitazione della compressione gzip

Da non confondere con impostazioni OpenSearch simili, http_compression.enabled è specifico del servizio OpenSearch e abilita o disabilita la compressione gzip su un dominio. Per impostazione predefinita, i domini che eseguono OpenSearch o Elasticsearch 7.x hanno la compressione gzip abilitata, mentre per i domini che eseguono Elasticsearch 6.x è disabilitata.

Per abilitare la compressione gzip, inviare la seguente richiesta:

PUT _cluster/settings { "persistent" : { "http_compression.enabled": true } }

Le richieste a _cluster/settings devono essere decompresse, quindi potrebbe essere necessario utilizzare un client separato o una richiesta HTTP standard per aggiornare le impostazioni del cluster.

Intestazioni richieste

Quando si include un corpo di richiesta compresso con gzip, mantenere l'intestazione Content-Type: application/json standard e aggiungere l'intestazione Content-Encoding: gzip. Per accettare una risposta gzip compressa, aggiungere anche l'intestazione Accept-Encoding: gzip. Se un client OpenSearch supporta la compressione gzip, probabilmente include automaticamente queste intestazioni.

Codice di esempio (Python 3)

Nell'esempio seguente viene utilizzato opensearch-py per eseguire la compressione e inviare la richiesta. Questo codice firma la richiesta utilizzando le credenziali IAM.

from opensearchpy import OpenSearch, RequestsHttpConnection from requests_aws4auth import AWS4Auth import boto3 host = '' # e.g. my-test-domain.us-east-1.es.amazonaws.com region = '' # e.g. us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Create the client. search = OpenSearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, http_compress = True, # enables gzip compression for request bodies connection_class = RequestsHttpConnection ) document = { "title": "Moneyball", "director": "Bennett Miller", "year": "2011" } # Send the request. print(search.index(index='movies', id='1', body=document, refresh=True)) # print(search.index(index='movies', doc_type='_doc', id='1', body=document, refresh=True))

In alternativa, è possibile specificare le intestazioni corrette, comprimere il corpo della richiesta da soli e utilizzare una libreria HTTP standard come Requests. Questo codice firma la richiesta utilizzando le credenziali di base HTTP, che il dominio potrebbe supportare se si utilizza il controllo granulare degli accessi.

import requests import gzip import json base_url = '' # The domain with https:// and a trailing slash. For example, https://my-test-domain.us-east-1.es.amazonaws.com/ auth = ('master-user', 'master-user-password') # For testing only. Don't store credentials in code. headers = {'Accept-Encoding': 'gzip', 'Content-Type': 'application/json', 'Content-Encoding': 'gzip'} document = { "title": "Moneyball", "director": "Bennett Miller", "year": "2011" } # Compress the document. compressed_document = gzip.compress(json.dumps(document).encode()) # Send the request. path = 'movies/_doc?refresh=true' url = base_url + path response = requests.post(url, auth=auth, headers=headers, data=compressed_document) print(response.status_code) print(response.text)