требуется помощь в решении проблем с тканями - PullRequest
1 голос
/ 11 февраля 2012

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

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

У нас есть класс-оболочка провайдера кэша, который создает объект datacachefactory и т. Д. И используется в качестве посредника между веб-приложением и appfabric. Это одноэлементный класс, поэтому в Init класса создается только один экземпляр объекта 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 копии данных?

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

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

1 Ответ

1 голос
/ 18 февраля 2013

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

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

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

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

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

...