Как эффективно прочитать объект AWS S3 и вернуться в качестве модели представления - PullRequest
2 голосов
/ 11 марта 2012

Я храню биты 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 перестанет отвечать ... файловый кеш!:)

1 Ответ

0 голосов
/ 11 марта 2012

Похоже на проблему сериализации. Я бы проверил сложность объекта json, который вы десериализовали, это вложенные объекты, и если да, вы можете сгладить его?

...