0

Donc, mon site tombe en panne lors d'une charge élevée lors de l'utilisation de AmazonKinesisFireHoseClient pour mettre des enregistrements en kinésis.Site se bloque lors d'une charge élevée lors de l'utilisation d'Amazon Kinesis Client, problème avec le nombre de connexions ouvertes

Je n'obtiens aucune exception, il suffit de trier et il faut redémarrer l'application pour la faire fonctionner à nouveau, parfois elle commence juste à fonctionner par elle-même après un plantage.

Je sais que cela a quelque chose à voir avec le nombre de connexions qui sont ouvertes mais je n'ai aucune idée de comment le réparer.

c'est mon enregistreur que j'instancier comme un singleton

public class KinesisFirehoseLogger<T> 
{ 
    private string streamName; 

    private AmazonKinesisFirehoseClient client; 

    protected ILogger logger; 

    public KinesisFirehoseLogger(IKinesisLogConfig config, ILogger logger) 
    { 
     this.streamName = config.StreamName; 
     this.logger = logger; 
     this.PartitionKey = config.PartitionKey; 
     AWSCredentials credentials = new BasicAWSCredentials(config.AccessKey, config.SecretKey); 
     this.client = new AmazonKinesisFirehoseClient(credentials, config.Region); 
    } 

    public async Task<bool> WriteToKinesisAsync(T logObject) 
    { 
     using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(logObject) + "\n"))) 
     { 
      PutRecordRequest putRecordRequest = new PutRecordRequest() { DeliveryStreamName = this.streamName, Record = new Record() { Data = ms } }; 

      // Put record into the DeliveryStream 
      return (await client.PutRecordAsync(putRecordRequest)).HttpStatusCode == HttpStatusCode.OK; 
     } 
    } 
} 

Suis-je censé utiliser la méthode Éliminez() du AmazonKinesisFirehoseClient quelque part? Comment savoir quand l'appeler.

Répondre

0

En supposant que le client.PutRecordAsync ouvre la connexion, il peut être judicieux de le placer également dans un bloc using. Par exemple:

using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(logObject) + "\n"))) 
{ 
    PutRecordRequest putRecordRequest = new PutRecordRequest() { DeliveryStreamName = this.streamName, Record = new Record() { Data = ms } }; 

    // Put record into the DeliveryStream 
    using (PutRecordResponse response = await client.PutRecordAsync(putRecordRequest)) 
    { 
     return response.HttpStatusCode == HttpStatusCode.Ok; 
    } 
}