0

Amazon KinesisFireHoseClientを使用してkinesisにレコードを置くと、負荷が高いときにWebサイトがクラッシュする。Amazon Kinesis Clientを使用しているときに高負荷時にWebサイトがクラッシュし、開いている接続数で問題が発生する

例外が記録されているだけで、何らかの死亡が発生し、アプリケーションを再起動する必要があります。クラッシュした後で動作することがあります。

私はそれが開いている接続の数と関係があることを知っていますが、私はそれを修正する方法は考えていません。

これは私がシングルトン

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; 
     } 
    } 
} 

としてインスタンス化し、私のロガーである私は、どこかAmazonKinesisFirehoseClientの処分()メソッドを使用することになっているだろうか?どのように呼び出すべきかをどのように知っていますか?

答えて

0

client.PutRecordAsyncが接続を開くと仮定すると、ブロックをusingブロックに置くことも意味があります。たとえば、

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; 
    } 
} 
関連する問題