2

2 つのサーバーに Web サイト コードがあり、それらの間で共有キャッシュが必要なため、Microsoft AppFabric を使用しています。キャッシュには 1 つのアイテムだけが必要です。サイトの訪問者ごとに 1 つのアイテムではなく、合計で 1 つのアイテムだけです。

これを達成するために使用しているコードを以下に示しますが、思い通りに動作していません。問題は、すべて同じキーを持っているにもかかわらず、キャッシュに多くのアイテムがあることだと思います。しかし、それは別のことが起こっている可能性があります。詳細については、コードのコメントを参照してください。

Web.config

<dataCacheClient>
    <hosts>
      <host name="MyHost1" cachePort="22233"/>
      <host name="MyHost2" cachePort="22233"/>
    </hosts>
    <securityProperties mode="None" protectionLevel="None" />
</dataCacheClient>
...
<system.web>
    <sessionState mode="InProc" customProvider="AppFabricCacheSessionStoreProvider">
        <providers>
            <add
                name="AppFabricCacheSessionStoreProvider"
                type="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider"
                cacheName="MyCache"
                sharedId="MySharedApp"/>
        </providers>
    </sessionState>
    ...
</system.web>

Global.asax.cs

private static DataCacheFactory _cacheFactory = new DataCacheFactory();
private static DataCache _cache;

private void RegisterCacheEntry(){
    try
    {
        // Set up cache
        _cache = _cacheFactory.GetCache("MyCache");

        // Prevent duplicate key addition
        if (_cache.GetCacheItem(CacheItemKey) != null || _cache.Get(CacheItemKey) != null) 
            return;

        // Add item to cache
        _cache.Add(CacheItemKey, CacheItem, TimeSpan.FromMinutes(10));

        // When the cache item is removed, the callback:
        // 1) sends me an email 
        // 2) adds the same item with the same key to the cache again.
        // So I SHOULD be getting one email every 10 minutes.
        // However, it starts with one, but the number of emails that I get increases every 10 minutes.
        // i.e., I get one email at time t=0, two emails at t=1, three at t=2, then four, etc.
        _cache.AddItemLevelCallback(CacheItemKey, DataCacheOperations.RemoveItem, CacheItemRemovedCallback);
    }
    catch (Exception e){}
}

私が行っていることとその理由について詳しく知りたい場合は、ここで説明されているように、キャッシュ タイムアウトを使用して Windows サービスをシミュレートしようとしています。しかし、これを2つのサーバーで動作させようとしています。

4

1 に答える 1

1

web.config に AppFabric セッション状態プロバイダーを追加しました。すべてのセッションはクラスターに永続化されます。そのため、複数のキャッシュ アイテムがあります。

また、ここで述べたように、システムにエラー管理を追加する必要があります。

キャッシュ ホストは、一定量のキャッシュ操作のみをメモリに保持できます。システムの負荷によっては、一部のキャッシュ クライアントが、キャッシュ ホスト キューで切り捨てられる前に通知を受信しない場合があります。クラスターの残りの部分が実行されている間に、キャッシュ サーバーの障害が原因でデータが失われた場合、キャッシュ クライアントも通知を見逃す可能性があります。このような場合、キャッシュ クライアントは、失敗通知を使用して、一部のキャッシュ通知を見逃したことを検出できます。アプリケーションは、AddFailureNotificationCallback メソッドを使用して、失敗通知を受け取るコールバックを追加できます。詳細については、失敗通知コールバックの追加を参照してください。

EDIT : CacheItemRemovedCallbackキャッシュから削除されるキーを提供します。常に同じかどうかを確認してください。分散キャッシュを単一のアイテムに制限しないこともお勧めします。他の誰かがキャッシュに何かを追加すると、システムは失敗します。

于 2013-04-29T11:07:46.800 に答える