Нужна помощь в выборе между EBS и S3 в Amazon Web Services

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

27
задан andrewvnice 10 August 2012 в 23:27
поделиться

1 ответ

Если ваша служба будет использоваться неопределенным числом пользователей, важно иметь в виду, что масштабируемость всегда будет проблемой, независимо от принятого варианта, вам нужно будет масштабировать службу для удовлетворения спроса, поэтому было бы удобно предположить, что ваша служба будет работать в группе автоматического масштабирования с пулом экземпляров EC2, а не одним экземпляром.

Что касается защиты URL-адреса, позволяющей загружать файлы только авторизованным пользователям, существует множество способов сделать это, не требуя, чтобы ваша служба выполняла роль промежуточного звена, тогда вам нужно будет решить как минимум две проблемы:

  1. Предсказуемость имени файла : чтобы избежать предсказуемости URL, вы можете назвать загруженный файл как хэш и сохранить исходные имена файлов и владельцев в базе данных, такой как SimpleDB, при желании вы можете установить HTTP-заголовок, такой как «Content-Disposition: filename = original_file_name.ext», чтобы рекомендовать браузеру пользователей соответствующим образом назвать загруженный файл.

  2. авторизация : когда пользователь запрашивает загрузку заданного файла вашей службой, выдайте временную авторизацию с помощью Query String Authentication или Временные учетные данные безопасности для этого конкретного пользователя, предоставляющего доступ на чтение к файлу в течение некоторого времени, ваша служба перенаправляет на URL-адрес корзины S3 для прямой загрузки. Это может значительно разгрузить ваши экземпляры пула EC2, делая их доступными для более быстрой обработки других запросов.

Чтобы уменьшить пространство и трафик в вашем контейнере S3 (помните, что вы платите за хранимый и переданный ГБ), я бы также рекомендовал сжимать каждый отдельный файл, используя стандартный алгоритм, такой как gzip, перед загрузкой в ​​S3 и устанавливать заголовок " Content-Encoding: gzip ", чтобы автоматическая распаковка работала с браузером пользователей. Если вы выбираете язык программирования Java, я предлагаю взглянуть на код плагина webcache-s3-maven-plugin , который я создал для загрузки статических ресурсов из веб-проектов.

Что касается времени обработки при сжатии папки, вы часто не сможете обеспечить сжатие папок за короткое время, чтобы позволить пользователю загрузить его немедленно, поскольку в конечном итоге могут появиться огромные папки, Сжатие может занять минуты или даже часы. Для этого я предлагаю вам использовать службы SQS и SNS, чтобы разрешить обработку асинхронного сжатия , это будет работать следующим образом:

  1. пользователь запрашивает сжатие папок
  2. экземпляр внешнего интерфейса EC2 создает запрос сжатия в очереди SQS
  3. экземпляр внутреннего сервера EC2, использует запрос сжатия очереди SQS
  4. экземпляр внутреннего интерфейса загружает файлы из S3 на диск EBS так как сгенерированные файлы будут временными, я бы предложил использовать как минимум экземпляры m1.small с дисками эфемерного типа , которые являются локальными для виртуальной машины, чтобы уменьшить задержку ввода-вывода и обработку время.
  5. после того, как сжатый файл сгенерирован, служба загружает файл в корзину S3, опционально устанавливая свойства Истечение срока действия объекта , которые сообщают корзине S3 об автоматическом удалении файла через определенный период времени ( снова, чтобы уменьшить ваши затраты на хранение), и публикует уведомление о том, что файл готов к загрузке в теме SNS.
  6. Если пользователь все еще в сети, прочитайте уведомление из темы и уведомите пользователя о том, что zip-файл готов к загрузке, если через некоторое время это уведомление не пришло, вы можете сообщить пользователю, что сжатие выполняется дольше, чем ожидалось, и служба уведомит его по электронной почте, как только файл будет готов к загрузке.

В этом сценарии у вас может быть две группы автоматического масштабирования, соответственно фронтенд и бэкэнд, которые могут иметь разные ограничения масштабируемости.

21
ответ дан Alessandro Oliveira 10 August 2012 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: