Szukam informacji na temat skalowania usługi systemu Windows, która jest obecnie uruchomiona w mojej firmie. Jesteśmy przy użyciu .NET 4.0 (może i zostanie uaktualniony do 4,5 w pewnym momencie w przyszłości) i działa to w systemie Windows Server 2012.Skalowanie usług systemu Windows
O służbie
praca usługa jest do kwerendy dla nowych wierszy tabelę rejestrowania (pracujemy z bazą danych Oracle), przetwarzamy informacje, tworzymy i/lub aktualizujemy kilka rzędów w 5 innych tabelach (nazwijmy je tabelami śledzenia), aktualizuj tabelę rejestrowania i powtarzaj.
Tabela rejestrowania zawiera duże ilości danych XML (może wzrosnąć do 20 MB na wiersz), które należy wybrać i zapisać w pozostałych 5 tabelach śledzenia. Nowe wiersze dodawane są przez cały czas z maksymalną szybkością 500 000 wierszy na godzinę.
Ruch w tabelach śledzenia jest znacznie wyższy, od 90 000 nowych wierszy od najmniejszego do potencjalnie milionów wierszy w największym stole, co godzinę. Nie wspominając już o tym, że są również operacje aktualizacji na tych tabelach.
O przetwarzanych danych
czuję ten bit jest ważne dla znalezienia rozwiązania w oparciu o jak te obiekty są grupowane i przetwarzane. Struktura danych wygląda następująco:
public class Report
{
public long Id { get; set; }
public DateTime CreateTime { get; set; }
public Guid MessageId { get; set; }
public string XmlData { get; set; }
}
public class Message
{
public Guid Id { get; set; }
}
- Raport jest rejestrowanie danych muszę wybrać i proces
- Do każdej wiadomości nie są średnio 5 Reports. W niektórych przypadkach może to wynosić od 1 do setek.
- Wiadomość zawiera kilka innych kolekcji i innych relacji, ale nie mają one znaczenia dla pytania.
Dziś usługa Windows mamy ledwo udaje obciążenie na serwerze 16-rdzeniowego (nie pamiętam pełne specyfikacje, ale to na pewno powiedzieć, maszyna ta jest bestia). Mam za zadanie znaleźć sposób na skalowanie i dodać więcej maszyn, które będą przetwarzać wszystkie te dane i nie przeszkadzać innym instancjom.
Obecnie każda wiadomość otrzymuje własny wątek i obsługuje odpowiednie raporty. Obsługujemy raporty w partiach pogrupowane według ich ID wiadomości, aby zmniejszyć liczbę zapytań DB do minimum podczas przetwarzania danych.
Ograniczenia
- Na tym etapie jestem pozwoliło ponownie napisać ten serwis od podstaw przy użyciu dowolnego architekturę I regulaminem.
- Jeśli wystąpi awaria instancji, inne instancje muszą być w stanie wykryć miejsce, w którym nastąpiło uszkodzenie. Żadne dane nie mogą zostać utracone.
- To przetwarzanie musi być jak najbardziej zbliżone do czasu rzeczywistego z raportów wstawianych do bazy danych.
szukam dowolnego wejścia radę lub o tym, jak zbudować taki projekt. Zakładam, że usługi będą musiały być bezpaństwowcami, czy też istnieje sposób synchronizacji pamięci podręcznych dla wszystkich wystąpień? Jak powinienem koordynować wszystkie wystąpienia i upewnić się, że nie przetwarzają tych samych danych?Jak mogę równomiernie rozłożyć obciążenie między nimi? I oczywiście, jak radzić sobie z zawieszaniem się instancji i nie kończeniem jej pracy?
EDIT
Usunięto informacje nieistotne
To * brzmi * jak proces ETL. Czy zastanawiałeś się nad patrzeniem na coś takiego jak SQL Server Integration Services (SSIS) i pisaniem pakietów, które można zaplanować tak, aby regularnie przeprowadzały ten proces? –
Używamy Oracle, a wyżsi nie chcą słyszeć słowa o SQL Server, niestety. – Artless
Myślałem tylko o części SSIS, a nie o silniku bazy danych :) Alternatywą byłoby coś takiego jak Pentaho Data Integration (http://www.pentaho.com/explore/pentaho-data-integration/) lub Talend etl analytics (http://www.talend.com/solutions/etl-analytics) –