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