Может ли Cache WorkerRole добавить свой собственный кеш?

У меня есть рабочая роль кэша в Azure. Я планировал переопределить поведение OnStart роли для предварительного заполнения моего кеша и использовать собственный планировщик для заполнения кеша из самой рабочей роли. Это не масштабируется, я знаю это, но мне это не нужно.

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

DataCacheFactory cacheFactory = new DataCacheFactory();
DataCache cache = cacheFactory.GetDefaultCache();

Но создаст ли изменение Web.config какие-либо проблемы? Я бы сделал это?

<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />

Или я бы сделал:

<autoDiscover isEnabled="true" identifier="CacheRoleName" />

Кто-нибудь делал это раньше и есть какие-либо советы о том, как это настроить?


person Faraday    schedule 15.02.2014    source источник


Ответы (1)


Я попробовал это очень быстро, и он отлично сработал, добавив пакет Nuget Microsoft.WindowsAzure.Caching в роль Worker, в которой размещен выделенный кеш. Пакет NuGet добавил элемент autoDiscover выше, и я просто обновил идентификатор, чтобы он стал именем роли. Я отменил OnStart и добавил элементы в кеш, как и в любом другом месте (строки, которые у вас есть в вопросе, предоставят вам доступ к кешу по умолчанию).

Мне удалось прочитать данные из кеша из веб-роли, которую я также добавил в проект.

Однако здесь следует предостеречь. Вы уже упоминали, что рабочая роль при загрузке OnStart сама по себе является проблемой масштабирования, и это в некоторой степени. Во время первоначального развертывания вы не можете гарантировать порядок того, как роли и экземпляры будут подключены к сети. Это означает, что потребители (веб-роли и т. д.) кэша могут быть доступны до того, как кластер кэша будет готов к работе. Им нужно знать, как справиться с получением пустых значений из кеша или с невозможностью найти то, что им нужно. Вот почему широко используется шаблон Cache Aside. Другими словами, не делайте ошибку, полагая, что предварительное заполнение кеша таким образом гарантирует наличие данных в кеше при запросе. Может произойти любое количество вещей, из-за которых это не будет правдой. Если потребители кеша не знают, как получить данные из чего-то другого, кроме кеша, вы можете оказаться в плохой ситуации.

Кроме того, если у вас есть более одного экземпляра выделенного кэш-воркера, они будут пытаться запускать этот код каждый раз при запуске или перезапуске. Убедитесь, что эти вызовы являются идемпотентными, и если у вас есть значения, которые будут медленно изменяться в вашем кеше, что вы непреднамеренно не переопределяете их значениями «запуска».

person MikeWo    schedule 15.02.2014
comment
Всем добрый совет. Это только для прототипа. Нужно создавать быстро и дешево, не масштабируемо для этого, и у потребителей есть разумные запасные варианты. Это всего лишь быстрый (и грязный) способ достижения цели. Но спасибо за комментарии :D - person Faraday; 15.02.2014