требуется помощь в решении вопросов appfabric

Мое приложение использует AppFabric для нашей модели распределенного кэширования в производственной веб-ферме серверов Windows Web 5. Приложение представляет собой веб-приложение .net4 c#. Мы столкнулись с некоторыми проблемами с AppFabric и у нас есть несколько вопросов относительно их настройки. Основная проблема, с которой мы сталкиваемся, заключается в том, что если один из веб-серверов 5 будет перезапущен, сайт на других серверах также перестанет работать в течение короткого периода времени с исключениями appfabric, такими как следующие, которые появляются в наших журналах событий:

  • Сообщение: ErrorCode:SubStatus:Произошла временная ошибка. Повторите попытку позже.
  • ErrorCode:SubStatus:Упомянутый регион не существует. Используйте CreateRegion API, чтобы исправить ошибку.

У нас есть класс-оболочка поставщика кеша, который создает объект datacachefactory и т. д. и используется в качестве посредника между веб-приложением и appfabric. Это одноэлементный класс, поэтому при инициализации класса создается только один экземпляр объекта datacachefactory.

Вторая ошибка выше я кажется нашел причину, в нашем коде регион создавался на Init т.е. в самом начале, но если из кластера выходит нода которая содержит регион в своей памяти, то вышеприведенное ошибка - это результат. Чтобы решить эту проблему, следует пытаться создавать регион при каждом запросе appfabric — но создавать его только в том случае, если он не существует — правильно ли это звучит?

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

     <?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="dataCache" type="Microsoft.ApplicationServer.Caching.DataCacheSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </configSections>
    <dataCache size="Small">
        <caches>
            <cache consistency="StrongConsistency" name="App1Cache"
                secondaries="1">
                <policy>
                    <eviction type="Lru" />
                    <expiration defaultTTL="10" isExpirable="true" />
                </policy>
            </cache>
            <cache consistency="StrongConsistency" name="App2Cache" 
        secondaries="1">
                <policy>
                    <eviction type="Lru" />
                    <expiration defaultTTL="10" isExpirable="true" />
                </policy>
            </cache>
            <cache consistency="StrongConsistency" name="App3Cache"
                secondaries="1">
                <policy>
                    <eviction type="Lru" />
                    <expiration defaultTTL="10" isExpirable="true" />
                </policy>
            </cache>
            <cache consistency="StrongConsistency" name="default">
                <policy>
                    <eviction type="Lru" />
                    <expiration defaultTTL="10" isExpirable="true" />
                </policy>
            </cache>
        </caches>
        <hosts>
            <host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
                hostId="724664608" size="1228" leadHost="true" account="SERVER1\user"
                cacheHostName="AppFabricCachingService" name="SERVER1"
                cachePort="22233" />
            <host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
                hostId="598646137" size="1228" leadHost="true" account="SERVER2\user"
                cacheHostName="AppFabricCachingService" name="SERVER2"
                cachePort="22233" />
            <host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
                hostId="358039700" size="1228" leadHost="true" account="SERVER3\user"
                cacheHostName="AppFabricCachingService" name="SERVER3"
                cachePort="22233" />
            <host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
                hostId="929915039" size="1228" leadHost="false" account="SERVER4\user"
                cacheHostName="AppFabricCachingService" name="SERVER4"
                cachePort="22233" />
            <host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
                hostId="1752630351" size="1228" leadHost="false" account="SERVER5\user"
                cacheHostName="AppFabricCachingService" name="SERVER5"
                cachePort="22233" />
        </hosts>
        <advancedProperties>
            <securityProperties>
                <authorization>
                    <allow users="everyone" />
                </authorization>
            </securityProperties>
        </advancedProperties>
    </dataCache>
</configuration>

Примечание. У нас настроено несколько кешей, так как у нас есть несколько приложений, использующих appfabric, и мы наблюдаем одинаковые проблемы со всеми ними.

А это запись web.config в приложении на каждом из серверов:

<dataCacheClient requestTimeout="15000" channelOpenTimeout="3000" maxConnectionsToServer="1">
<localCache isEnabled="true" sync="TimeoutBased" ttlValue="300" objectCount="10000" />
<clientNotification pollInterval="300" maxQueueLength="10000" />
<hosts>
  <host name="SERVER1" cachePort="22233" />
  <host name="SERVER2" cachePort="22233" />
  <host name="SERVER3" cachePort="22233" />
  <host name="SERVER4" cachePort="22233" />
  <host name="SERVER5" cachePort="22233" />
</hosts>
<transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456" maxBufferSize="8388608" maxOutputDelay="2" channelInitializationTimeout="60000" receiveTimeout="600000" /></dataCacheClient>

Кто-нибудь видит проблему с вышеперечисленным? Как видите, у нас есть 3 ведущих хоста и 2 вторичных.

Вот некоторые вопросы, которые у меня возникают в связи с этим:

  • Я читал о наличии локального кеша - в чем его техническая выгода? т.е. даст ли это локальную копию данных для каждого узла.
  • Какова наилучшая практика в отношении портов? Верны ли вышеуказанные порты или могут возникнуть конфликты с теми же используемыми портами?
  • 3 ведущих хоста и 2 вторичных, это рекомендуемое разделение? Означает ли это, что существует 3 копии данных?

Когда мы перезапускаем серверы, мы стараемся никогда не перезапускать ведущие хосты одновременно.

Спасибо за любой отзыв по этому поводу!


person amateur    schedule 11.02.2012    source источник


Ответы (1)


Мы широко используем кэширование AppFabric. Вы собираетесь увидеть

Message: ErrorCode:SubStatus:There is a temporary failure. Please retry later.

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

Конфигурация кэша в файле Web.config используется только для создания фабрики кэшей. Он свяжется с одним из хостов и получит от него конфигурацию кластера. Единственное преимущество перечисления всех хостов в вашем Web.config заключается в том, что если хост не работает, он может связаться с другим хостом. Даже если вы указали только один хост, при условии, что он присутствует, ваше кэширование будет работать нормально.

Использование локального кэша, скорее всего, повысит производительность, если вы читаете объекты чаще, чем записываете их. Вам придется настроить его размер экспериментальным путем.

person Dave Bending    schedule 18.02.2013