WindowsAzure: эксперименты с кэшем BLOB-объектов с помощью phpazure - PullRequest
1 голос
/ 11 февраля 2011

Я провожу некоторые эксперименты с кэшированием сайтов в хранилище больших двоичных объектов. Теперь я понимаю, что это не так быстро, как я ожидал. Например, следующий код проверяет, существует ли кэшированная версия запрошенного сайта, и возвращает содержимое:

$blobStorageClient = new Microsoft_WindowsAzure_Storage_Blob();
if (!$blobStorageClient->blobExists(self::CONTAINER, $path))
return false;

$blobData = $blobStorageClient->getBlobData(self::CONTAINER, $path);
$metaData = $blobStorageClient->getBlobMetadata(self::CONTAINER, $path);
...

Эта часть всегда занимает от 500 мс до 1000 мс (иногда 2000 мс). Я протестировал его с PHP Azure SDK , эмулятором вычислений Azure и оперативным хранилищем. Кто-нибудь знает, почему это так медленно, или это нормально, что я могу сделать лучше, это вообще хорошая идея сделать кэширование BLOB-объектов?

Ответы [ 5 ]

1 голос
/ 12 февраля 2011

Я не уверен, почему это так медленно с вашей стороны, но мне действительно удается получить «ложь» для несуществующих больших двоичных объектов за 5 мс и фактических данных за 44 мс (где фактические данные составляют всего несколько байтов).

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

Для распределенного кэширования установите флажок http://www.davidaiken.com/2011/01/11/windows-azure-memcached-plugin.Для кэширования на локальной виртуальной машине используйте файловую систему (http://phpazurecontrib.codeplex.com, проверьте локальный ресурс) или используйте доступные расширения WinCache.

И для справки: проверка, существует ли BLOB-объект, не требуется в вашем примере кода,просто попробуйте следующую структуру:

    $blobData = null;
$metaData = null;

try {
    $blobData = $blobStorageClient->getBlobData($container, $path);
    $blobStorageClient->getBlobMetadata($container, $path); 
} catch (Microsoft_WindowsAzure_Exception $ex) {
    return false;
}

return $blobData;

У этого будет на один прием туда и обратно меньше.

1 голос
/ 12 февраля 2011

согласованное хранилище больших двоичных объектов не может быть решением для кэширования приложений.Вы думали об использовании этого?http://www.davidaiken.com/2011/01/11/windows-azure-memcached-plugin

Спасибо за использование PHP SDK, еще какие-нибудь отзывы вы хотели бы поделиться с нашей командой инженеров?

TGIF:)

jas

1 голос
/ 11 февраля 2011

Я не думаю, что хранилище BLOB-объектов подходит для кэширования. Он все еще может использоваться в определенных ситуациях, но, как правило, вы не хотите, чтобы ваш кэш был настолько быстрым, насколько это возможно. Вы должны использовать кэш appfabric или кэш памяти. Кэш памяти может звучать плохо в среде с несколькими экземплярами, но, безусловно, есть случаи, когда вы можете использовать его, зависит от того, что именно вам нужно.

Об этом коде ... вы делаете 3 транзакции здесь (в случае, если существует BLOB-объект). Вы можете попытаться немедленно вызвать getBlobData, а в случае ошибки NotFound вернуть false. Я не знаю, насколько хорош PHP с обработкой исключений, но я сомневаюсь, что это медленнее, чем весь запрос к хранилищу больших двоичных объектов.

0 голосов
/ 31 мая 2012

Обновление за май 2012

В случае, если кто-то еще сталкивался с этой темой (как я это сделал), с момента ее написания в Azure произошли движения с кэшированием памяти. (И кеширование памяти дает пользователю возможность ответить на этот вопрос)

В Azure теперь есть собственное кэширование, но оно не поддерживается в PHP. Так что это еще не совсем вариант (по состоянию на май 2012 года).

Итак, на момент написания статьи лучшим вариантом (и тем, который я использую) является использование memcached. Тогда все документированные решения PHP все еще работают, и есть примеры развертывания memcached на https://github.com/interop-Bridges/Windows-Azure-PHP-Scaffolders/tree/master/Memcached - для установки memcached на сервер используется скаффолд, тогда вы можете использовать memcache PHP или memcached для доступа.

0 голосов
/ 11 февраля 2011

Мне кажется, что этот код выполняет три цикла обхода хранилища больших двоичных объектов (при наличии большого двоичного объекта).Я не очень хорошо знаком с библиотекой PHP, но, надеюсь, есть единственный метод, который вы можете вызвать, который сразу вызовет данные и метаданные BLOB-объектов.Вы можете просто попытаться сделать это, и если это не удастся, это означает, что блоб не существует.Если это удастся, используйте эти данные.

Что касается синхронизации, мое эмпирическое правило заключается в том, что обратное путешествие к хранилищу, вероятно, займет около 10-30 миллисекунд, а затем, конечно, есть время для передачи данных BLOB,зависит от размера капли.Это время, конечно, для кода, работающего в Windows Azure, для разговора с учетной записью хранения в том же месте.

...