2010-09-24 6 views
33

Szukam najbardziej wydajnego sposobu na ustawienie użycia pamięci podręcznej i fabryki datacache dla wywołań buforowania AppFabric, dla od 400 do 700 cache pobiera na załadowanie strony (i prawie żadnych puts) . Wygląda na to, że do zrobienia wystarczy użycie pojedynczego statycznego DataCacheFactory (lub prawdopodobnie pary w konfiguracji typu round-robin).Buforowanie AppFabric - Prawidłowe korzystanie z DataCacheFactory i DataCache

Czy nazywam GetCache ("cacheName") dla każdego żądania obiektu DataCache, czy też mogę utworzyć jeden statyczny w czasie inicjowania fabryki DataCache i używać go do wszystkich połączeń?

Czy muszę obsługiwać wyjątki, sprawdzać kody błędów i próbować ponawiania prób?

Czy muszę rozważyć rywalizację, gdy więcej niż jeden wątek próbuje użyć magazynu pamięci podręcznej i chce tego samego produktu (według klucza)?

Czy istnieje dokumentacja, która właściwie analizuje projekt i wykorzystanie tego?


Niektóre informacje mam zebrane dotychczas z forum:

http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/98d4f00d-3a1b-4d7c-88ba-384d3d5da915

„Tworzenie fabryki wymaga podłączenia do klastra i może zająć trochę czasu, ale raz. masz obiekt fabryczny i pamięć podręczną, z którymi chcesz pracować, możesz po prostu ponownie użyć te obiekty, aby zrobić puts i dostać się do pamięci podręcznej, a powinieneś zobaczyć znacznie szybszą wydajność. "

http://social.msdn.microsoft.com/Forums/en-US/velocity/thread/0c1d7ce2-4c1b-4c63-b525-5d8f98bb8a49

„Tworzenie pojedynczego DataCacheFactory (singleton) jest bardziej niż jego efektywności tworzenia wielu DataCacheFactory. Nie należy tworzyć DataCacheFactory dla każdego połączenia, będzie miał wydajność.”

"Proszę spróbować zaimplementować algorytm round-robin (posiadający fabryczne wersje 3/4/5) w swoim singletonie i porównać wyniki testu obciążenia."

http://blogs.msdn.com/b/velocity/archive/2009/04/15/pushing-client-performance.aspx

„Można zwiększyć liczbę klientów, aby zwiększyć przepustowość pamięci podręcznej. Ale czasami, jeśli chcesz mieć mniejszą liczbę klientów i zwiększyć przepustowość, trick jest wykorzystanie wielu wystąpień DataCacheFactory. The DataCacheFactory instancji tworzy połączenie z serwerami (e..g, jeśli istnieją 3 serwery, utworzy 3 połączenia) i zmultipleksuje wszystkie żądania z baz danych na te połączenia. Tak więc, jeśli wolumin put/get jest bardzo wysoki, te połączenia TCP mogą być jednym ze sposobów tworzenia wielu instancji DataCacheFactory, a następnie korzystać z operacji na nich. "


Tutaj, co jest używane do tej pory ... właściwość jest wywoływana i jeśli zwracana wartość nie jest pusta, wykonywana jest operacja.

private static DataCache Cache 
{ 
    get 
    { 
     if (_cacheFactory == null) 
     { 
      lock (Sync) 
      { 
       if (_cacheFactory == null) 
       { 
        try 
        { 
         _cacheFactory = new DataCacheFactory(); 
        } 
        catch (DataCacheException ex) 
        { 
         if (_logger != null) 
         { 
          _logger.LogError(ex.Message, ex); 
         } 
        } 
       } 
      } 
     } 

     DataCache cache = null; 

     if (_cacheFactory != null) 
     { 
      cache = _cacheFactory.GetCache(_cacheName); 
     } 

     return cache; 
    } 
} 

Zobacz to pytanie na Microsoft AppFabric forum: http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/e0a0c6fb-df4e-499f-a023-ba16afb6614f

+0

Jest odpowiedzią na to teraz na forum. Sprawdź powyższy link. – CRice

Odpowiedz

15

Oto odpowiedź z wątku na forum:

Cześć. Przepraszam za opóźnioną odpowiedź, , ale chcę powiedzieć, że są to wspaniałe pytania i prawdopodobnie będą przydatne dla innych: .

Nie powinno być potrzeby więcej niż niż jednego DataCacheFactory dla jednego wątku , chyba że wymaga się różnych konfiguracji . Na przykład, jeśli programowo skonfigurować DataCacheFactory z klasą DataCacheFactoryConfiguration, wtedy może chcieć stworzyć taki, który ma włączoną lokalnej pamięci podręcznej i inny że nie. W takim przypadku użytkownik będzie używał różnych obiektów DataCacheFactory w zależności od konfiguracji wymaganej dla danego scenariusza. Ale inne niż różnice w konfiguracji, ty nie powinien zobaczyć wzrost wydajności przez tworzenie wielu DataCacheFactories.

na tym samym przedmiocie jest ustawienie MaxConnectionsToServer (albo programowy DataCacheFactoryConfiguration lub pliku konfiguracji aplikacji w atrybut elementu dataCacheClient ).To określa liczbę chennels na DataCacheFactory, które są otwierane do klastra pamięci podręcznej. Jeśli masz wysokie wymagania przepustowości , a także dostępną przepustowość procesora/sieci , zwiększenie tego ustawienia do 3 lub wyższej może zwiększyć przepustowość. Nie zalecamy zwiększania tej wartości bez przyczyny ani do wartości, która jest zbyt wysoka dla Twoich potrzeb. Należy zmienić wartość, a następnie przetestować scenariusz , aby zaobserwować wyniki. Mamy nadzieję, że w przyszłości będziemy mieć więcej oficjalnych wskazówek na temat .

Gdy masz DataCacheFactory, ty nie trzeba zadzwonić GetCache() kilka razy, aby dostać wiele DataCache obiektów. Każde wywołanie funkcji GetCache() dla tej samej pamięci podręcznej w tej samej fabryce, co , powoduje zwrócenie tego samego obiektu DataCache o wartości . Ponadto, gdy już masz obiekt DataCache, nie potrzebujesz , aby kontynuować wywoływanie dla DataCacheFactory . Po prostu zapisz obiekt DataCache i kontynuuj go. Nie pozwól, aby obiekt DataCacheFactory został usunięty. Żywotność obiektu DataCache to powiązana z obiektem DataCacheFactory.

Nigdy nie powinieneś się martwić o rywalizację z prośbami o przyznanie numeru . Jednak w przypadku żądań Put/Add może wystąpić konflikt , jeśli klienci z wieloma pamięcią podręczną aktualizują ten sam klucz pod adresem w tym samym czasie. W takim przypadku uzyskasz wyjątek z kodem błędu ERRCA0017, RetryLater i substatus ES0005, KeyLatched. Jednak użytkownik może łatwo dodać obsługę wyjątku i logikę ponownej próby , aby ponownie wykonać próbę aktualizacji , gdy wystąpią takie błędy. Można to zrobić dla kodów RetryLater z różnymi wartościami podstanu. Więcej informacji można znaleźć na stronie : http://msdn.microsoft.com/en-us/library/ff637738.aspx. Można również użyć pesymistycznego blokowania za pomocą funkcji API GetAndLock() i PutAndUnlock(). Jeśli użyjesz tej metody , musisz upewnić się, że wszyscy klienci pamięci podręcznej korzystają z pesymistycznego blokowania . Wywołanie Put() wywoła zlikwiduje obiekt, który wcześniej był zablokowany przez GetAndLock().

Mam nadzieję, że to pomoże. Tak jak powiedziałem, mamy nadzieję, że wkrótce otrzymamy formalne treści w postaci tego rodzaju wytycznych. Ale to jest lepiej udostępnić go tutaj na forum do tego czasu. Dzięki!

Jason Roth

+2

MaxConnectionsToServer to zaawansowane ustawienie konfiguracji. Zapewnia równoległość bez jawnego kodowania tego samego. Pamiętaj, aby zaimplementować układ logiczny, aby wychwycić DataCacheExceptions i wyszukać kod błędu RetryLater lub limit czasu dla ponownych prób, ponieważ konflikty mogą występować znacznie częściej. – andrewbadera

4

zwę GetCache ("cacheName") dla każde żądanie obiektu DataCache, czy robię jednego statycznego u czas Fabryka DataCache została zainicjowana i używa tego do wszystkich połączeń?

Przypuszczam, że tak naprawdę powinna być odpowiedź; spróbuj w obie strony i zobacz, czy jest jakaś różnica, ale wydaje mi się, że jedna statyczna DataCache ma więcej sensu niż odpowiednie wywołanie do GetCache dla każdego wywołania Get.

Ten artykuł "Wysyłanie klienta wydajności" sugeruje, że istnieje słodkie miejsce, gdzie liczba instancji DataCacheFactory zapewnia maksymalną wydajność, powyżej której obciążenie pamięci zaczyna działać przeciwko tobie - to wstyd, że nie dał żadnych wytycznych (lub nawet regułą), gdzie może być to miejsce.

Nie natknąłem się na żadną dokumentację na temat maksymalizacji wydajności - myślę, że AppFabric wciąż jest zbyt nowy, aby te wytyczne zostały jeszcze wytępione. Spojrzałem w Spis treści na Pro AppFabric book, ale wydaje się, że bardziej dotyczy to ogólnie strony workflow (Dublin) w AppFabric niż w pamięci podręcznej (Velocity).

Jedna rzecz, którą chciałbym powiedzieć: czy istnieje możliwość buforowania "chunkier" obiektów, dzięki czemu można wykonać mniej połączeń do Get? Czy możesz cache kolekcje zamiast poszczególnych obiektów, a następnie rozpakować kolekcje na kliencie? 700 cache pobiera za ładowanie strony, wydaje mi się być ogromną liczbą!

+0

Tak, to jest ogromna liczba, ale dodaję dostawcę buforowania dla nieprzyjemnego systemu i nie mogę naprawdę zmienić jego podstawowych wymagań dotyczących buforowania. Dzięki za komentarze, nadal podkreśla to fakt, że nie ma zbyt wielu dobrych informacji na mój konkretny problem. – CRice

+2

Jeśli chodzi o wyciąganie dużej liczby przedmiotów z pamięci podręcznej, czy już widziałeś funkcje tagowania i regionu? Jeśli nie, przeczytaj ten post na blogu na ten temat: http: //blogs.msdn.com/b/skaufman/archive/2010/04/22/tagging-objects-in-the-appfabric-cache.aspx – Rohland

+1

@Rohland Tagi i regiony mogą być sposobem na uproszczenie kodu poprzez zmniejszenie liczby połączeń do cache.Get, ale nie jestem pewien, czy przyniosłoby to znaczącą korzyść z wydajności, ponieważ myślę, że kod nadal przyciągałby tę samą liczbę elementów z pamięci podręcznej na stronę, więc myślę, że nadal uderzałbyś w te same wąskie gardła. – PhilPursglove