2016-09-14 2 views
1

Что такое способ калитки для загрузки пользовательских загрузок из AWS S3?Идиоматический калибровочный способ обслуживания ресурсов от Amazon S3

Требования:

  • Нет прямых запросов от браузера до S3; весь трафик проксируется через наши серверы;
  • Разрешить кэширование активов в браузере с использованием кэша (через контрольные суммы или поле version в базе данных);
  • Активы предоставляются только авторизованным пользователям.

я могу думать о следующих решениях:

  1. Один SharedResource для всех ресурсов, которые разбирает URL и потоки активов:

    // resource definition: 
    mountResources("/assets/${path}", new ResourceReference("assets") { 
        public IResource getResource() { 
         return new AbstractResource() { 
          public ResourceResponse newResourceResponse(RequestAttribute attributes) { 
           String path = attributes.getParameters().get("path").toString() 
           // request S3 and stream the content 
           // handle caching/busting by hand 
          } 
         } 
        } 
    }) 
    
    // Usage: 
    page.add(new Image("image", new SharedResourceReference("assets"), new PageParameters().add("path", "image.jpg")) 
    
  2. Создать новую ResourceReference для каждого актив и передать его прямо на изображение. Подключитесь кэшами калитки путем позволяя ресурсы осуществлять IStaticCacheableResource:

    class S3ResourceReference extends ResourceReference { 
        private String path; 
        public S3ResourceReference(String path) { ... } 
        public IResource getResource() { 
         return new S3Resource(path); 
        } 
    } 
    class S3Resource extends AbstractResource implements IStaticCacheableResource { 
        public S3ResourceStream getResourceStream() { 
         S3Object object = getObject(path); 
         return new S3ResourceStream(object); 
        } 
        public ResourceResponse newResourceResponse(Attributes attributes) { 
         S3ResourceStream stream = getResourceStream(); 
         // populate response 
        } 
    } 
    
    class S3ResourceStream extends AbstractResourceStream { 
        S3ResourceStream(S3Object object) { 
         // ... 
        } 
    
        public InputStream getInputStream() { return object.objectContent } 
        // override metadata methods 
    } 
    
    // Usage: 
    page.add(new Image("image"), new S3ResourceReference("image.jpg")); 
    

Какой из этих подходов выглядит более идиоматическим?

Есть ли подводные камни с использованием IStaticCacheableResource во втором фрагменте?

ответ

1

Вот различие в этих двух подходах:

экземпляр страницы блокировки

  • В 1) запросы на ресурсы сделаны к приложению области видимости ресурса
  • В 2) запрос на ресурс, скопированный по страницам

Во втором случае Wicket заблокирует доступ к t он экземпляр страницы во время обслуживания ресурса. По этой причине я предпочитаю использовать ресурс с областью приложения.

IStaticCacheableResource

Если ресурс реализует этот интерфейс, то калитка будет искажать полученный URL ресурса и добавить что-то вроде -123456789 в имени файла. Этот хэш - это время модификации ресурса в режиме РАЗВИТИЯ и его контрольная сумма MD5 в режиме ПРОИЗВОДСТВА. Это помогает кэшировать.

Надеюсь, вы поймете, что вы можете использовать сочетание 1) и 2) - ссылку на ресурс с привязкой к приложениям + IStaticCacheableResource.

Еще одна вещь: обычно я использую new MyResourceReference() вместо new SharedResourceReference("the-name").

+0

«В 2) запрос относится к ресурсу с областью страницы» - это та же область, что и в параметрах конструктора ResourceReference? –

+0

No.Под этим я подразумеваю, что Wicket должен заблокировать доступ к экземпляру страницы, затем найти изображение в дереве компонентов, а затем найти ссылки на ресурсы по этому изображению. Во время этого запроса вы не сможете использовать какую-либо ссылку (Ajax) на странице. В 1) запрос относится к общему ресурсу, и вообще нет блокировки. –

+0

Спасибо, это немного разъясняет! Таким образом, было бы нецелесообразно использовать IStaticCacheableResource для пользовательских загрузок, таких как аватары и т. Д.? –

Смежные вопросы