使用Amazon Kinesis客户端时,在使用Amazon Kinesis客户端时发生高负载网站崩溃问题,并打开连接数

问题描述:

因此,当使用AmazonKinesisFireHoseClient将记录放入kinesis时,我的网站在高负载时崩溃。使用Amazon Kinesis客户端时,在使用Amazon Kinesis客户端时发生高负载网站崩溃问题,并打开连接数

我没有得到任何例外记录它只是有点死,你需要重新启动应用程序,让它再次运行,有时它只是在崩溃后开始自行工作。

我知道它与打开的连接数有关,但我不知道如何解决它。

这是我的记录,我作为实例化一个单身

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某处()方法?我怎么知道该什么时候打电话。

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