Я храню биты json на S3 из приложения ASP.NET MVC, размещенного на AppHarbor.Я могу читать, писать, удалять и т.д. на S3 без каких-либо проблем.Большинство взаимодействий довольно быстрые.Однако при чтении содержимого что-то в моей текущей реализации идет довольно медленно.
Код в контроллере очень прост, он делает вызов прямо в репо, который говорит с S3:
public class ContentController : Controller
{
public ActionResult LoadContent(string slug)
{
IContentRepository repo = new S3ContentRepository(ConfigurationManager.AppSettings["BucketName"]);
var content = repo.GetContent(slug);
return View(content);
}
}
В репо у меня чтение из S3 работает довольно быстро.Он извлекает объект из S3, помещает его в память, собирает его в виде строки, затем преобразует в json, а затем преобразует json в мою модель.Здесь нет задержки.
public Content GetContent(string slug)
{
Content result = null;
using (client = Amazon.AWSClientFactory.CreateAmazonS3Client())
{
try
{
GetObjectRequest request = new GetObjectRequest().WithBucketName(_bucketName).WithKey(slug);
using (GetObjectResponse response = client.GetObject(request))
{
string title = response.Metadata["x-amz-meta-title"];
byte[] arr = new byte[response.ContentLength];
response.ResponseStream.BeginRead(arr, 0, Convert.ToInt32(response.ContentLength), null, null);
string json = new System.Text.ASCIIEncoding().GetString(arr);
result = JsonConvert.DeserializeObject<Content>(json);
return result;
}
}
...
}
}
Однако, как только я возвращаю модель из репо обратно в контроллер, запрос серьезно задерживается.Производительность на моей локальной машине такая же, как и в AppHarbor.Буквально секунды проходят до загрузки страницы.Код представления только что сгенерирован из класса, который является его моделью ... очень просто.
Мысли?
Обновление 1: Если немного поторопиться, яобнаружение, что задержка находится где-то в закрытии потока ответов.Я добавил специальный вызов, чтобы «закрыть» поток ... и именно здесь задержка ощущается больше всего.Ранее это было оставлено оператору using для обработки смерти объекта ответа.Требуется больше тычков ...
Обновление 2: Я не отказался от этого, так как думаю, что смогу считывать объект из S3 непосредственно в память без каких-либо проблем, нов интересах экономии времени я поменял свою реализацию на запись в локальную систему с S3, а затем загрузил локальный файл в память.Довольно отстойно .. но достаточно хорошо, пока я не решу эту проблему!Я буду продолжать искать лучшее решение.Хотя с локальным файлом я могу реализовать решение «изящно завершиться неудачей», если S3 перестанет отвечать ... файловый кеш!:)