2013-06-12 10 views
5

Mam działający program monitorujący w czasie rzeczywistym, ale jego architektura klasowa jest zbyt złożona. A to bardzo mnie niepokoi. Zacznę od wyjaśnienia programu.Architektura klas monitorowania danych dziennika

interakcji użytkownika

Jest to program monitorujący z interakcji z użytkownikiem. Oznacza to, że użytkownik może wybierać różne wymiary, różne dane, uwzględniać je, wykluczać lub grupować, a za każdym razem zmienia wykres w czasie rzeczywistym zgodnie z decyzjami użytkownika.

przykład z danych dziennika DB

Req Success OrderFunction 5 60ms WebServer2 
Req Failed OrderFunction 2 176ms WebServer5 
Resp Success SuggestFunction 8 45ms WebServer2 

konwersja

Zatem każdy rząd jest ważne z jego każdej kolumnie. I musi to być po stronie klienta w ten sposób. Ponieważ użytkownik może wybrać opcję Successful OrderFunctions lub Wszystkie funkcje w WebServer2 lub All Failed Request itp. Potrzebuję wszystkich relacji między tymi kolumnami, aby to zrobić.

Kolejną rzeczą jest to, że wartości pochodzą z bazy danych. Mam również wyszukiwania dla tych wartości, które zawierają tekst, który użytkownicy muszą zobaczyć. Podobnie jak Req to Request, Resp to Response.

Wiem, że można zobaczyć to pytanie jako ogólne. Ale próbuję znaleźć sposób. Być może ten rodzaj architektury klasowej ma swoją nazwę w branży. Jestem tutaj po kilka porad, które poprowadzą mnie we właściwy sposób.

Thanks a lot

+0

Wygląda mi to jak zwykła krotka w bazie danych. – darijan

+0

Tak, ale trzymanie tego w klasie jest uciążliwe. Istnieje 15 000 rekordów w 3-minutowych odstępach. – Xelom

+1

Następnie pomyśl o utrzymywaniu go w relacyjnej bazie danych i wydobywaniu potrzebnych informacji za pośrednictwem zestawu usług. LUB, możesz to wszystko zrobić z bieżącą strukturą i rzeczywistymi obiektami, ale umożliwiając zachowanie tych obiektów (zwykle automatyczne, po utworzeniu i modyfikacji) w bazie danych obiektów (patrz na przykład Versant). – darijan

Odpowiedz

1

15k rejestruje co 3 minuty, brzmi trochę jak co Widywałem z aplikacji do monitorowania sieci w centrach danych (SNMP może być bardzo głośno w tego rodzaju środowisku). To, co zrobimy, to określenie, ile potrzebnych danych, na jak długo, na jakim poziomie szczegółowości, i jakie informacje zostaną wykorzystane do określenia, jakiego rodzaju strategii należy użyć - także, ile przestrzeni dyskowej chcieliśmy rzucić na problem. Dzięki strategii zwijania, w której możesz łączyć się w szeregi czasowe, łącząc ich kolumny, możesz upewnić się, że istnieje ograniczony limit rozmiaru bazy danych.

Są prawdopodobnie nowsze narzędzia tam obecnie, ale użyłem na przykład RRD (http://oss.oetiker.ch/rrdtool/) i BerkeleyDB dla tego rodzaju problemów z monitorowaniem. Możesz także skorzystać z funkcji deduplikacji oprogramowania, która polega na tym, że po prostu zaktualizujesz liczbę, jeśli wiersz okaże się podobny do poprzedniego wiersza, ze względu na zawartość jego kolumn. Kiedyś robiliśmy to, aby zapobiec burzom z powodu zalania ekranów NOC i spowodowaniu, że technicy przegapią ważne wydarzenia. Nawiasem mówiąc, zostawiłbym to jako komentarz, ale stackoverflow robi to, co mi przeszkadza, i właśnie zacząłem odpowiadać na pytania tutaj wczoraj.

więc być bardziej kompletne, używając swoich danych jako przykład:

Req Success OrderFunction 5 60ms WebServer2 
Req Failed OrderFunction 2 176ms WebServer5 
Resp Success SuggestFunction 8 45ms WebServer2 

Zakładam Req/Resp są tylko dwie wartości - odpowiadającej żądania i odpowiedzi? W takim przypadku ustaw kolumnę binarną, 1 bit - niezależnie od tego, czy była to prośba, czy nie. Druga kolumna, Sukces/Niepowodzenie - brzmi jak 1-bitowe lub w najgorszym trójskładnikowym polu 2-bitowym. Funkcje (OrderFunction, SuggestFunction, itp.) Mogą być prawdopodobnie wyliczone - lub jeśli robisz deduplikację, możesz ustawić ją jako maskę bitową. Można również użyć klucza obcego do tego w tabeli sprzężenia. W wyliczonej opcji, powiedzmy, że masz mniej niż 256, ale więcej niż 128, użyj bajtu.Jeśli możesz je zwinąć w rozwiązaniu deduplikacji zdarzeń w celu zapisania wierszy, szczególnie jeśli są one szybkie, i masz 256 opcji, potrzebujesz dokładnie tyle bitów dla swojej maski bitowej, chyba że jest to możliwe. przypadek, w którym nie każda permutacja musi być reprezentowana, w takim przypadku, ustal maksymalną liczbę permutacji, a to jest liczba bitów w masce bitowej, aby deduplikacja została poprawnie zwinięta. W następnej kolumnie z 5,2 i 8 w niej nie jestem pewien, co to oznacza, liczbą całkowitą jakiegoś, a może po prostu bajtem? Milisekundy mogą być reprezentowane, w zależności od twojego dialektu SQL i maksymalnych milisekund, które powinieneś reprezentować, z int, a może z unsigned short, lub może tylko z krótkim (który byłby w zasadzie około 32,7 sekundy). Jeśli używasz krótkiego lub niepodpisanego skrótu, po prostu upewnij się, że wartość przekraczająca wartość maksymalną jest reprezentowana w logice aplikacji jako maksimum, a nie zero. Ostatnia kolumna wygląda jak ciąg reprezentujący twoje serwery, więc prawdopodobnie jest to kolumna, której użyjesz, aby pomóc w usuwaniu duplikatów lub roll-upach. Możesz więc uczynić to obcym kluczem.

W każdym razie RRD był kiedyś bardzo dobry, ale nie używałem go od kilkunastu lat - przyjmuję go, nie używałem RRD od kilkunastu lat :). Jestem pewien, że BerkeleyDB jest nadal dobrą bazą danych dla tego rodzaju rzeczy - więc sprawdź te narzędzia i narzędzia, jak te i jestem pewien, że z tego wyjdzie dobre rozwiązanie.

Nadzieję, że pomaga!

+0

Dziękujemy za szczegółową odpowiedź. Nie mam problemu z moją strukturą bazy danych. Jedyny problem to moje dane w aplikacji. I wyjaśniłeś mój problem bardzo dobrze. De-duplikacja. Ponieważ chcę przechowywać wszystkie dane i chcę, aby użytkownik je zmienił, odfiltruj go lub pogrupuj. Posiadam wiele zduplikowanych danych. Na przykład, jeśli użytkownik nie chce zobaczyć nieudanych transakcji. Muszę odfiltrować każdy wiersz z nie powiodło się w mojej aplikacji i musi zmniejszyć numery OrderFunction nie powiodło się. – Xelom

+0

Jednym ze sposobów może być zmniejszenie logiki aplikacji - czyli wymiana większej liczby wycieczek do bazy danych i ograniczenie liczby zwracanych wierszy, które mają być pomijane w warstwie aplikacji lub w kliencie w celu zwiększenia wydajności i zmniejszyć złożoność.Do wykonania kompresji można użyć procedur przechowywanych, można nawet wykonać kompresowanie bazy danych replikowanych lub podrzędnych i zarezerwować wzorzec dla wstawek. De-duplikacja przy wstawianiu sprawi, że zapytania użytkownika końcowego będą szybsze, natomiast usuwanie duplikatów w czasie zapytania zapewnia elastyczność dla przyszłych wymagań. – hoonto

+0

Tak więc niektóre filtrowanie może mieć miejsce w aplikacji lub kliencie, ale na zredukowanym zestawie danych. Ponadto w przypadkach, w których naprawdę trzeba filtrować wiele nieprzetworzonych danych, należy to zrobić jako procedurę przechowywaną z opcjami filtrowania. – hoonto

Powiązane problemy