2016-04-27 45 views
6

Mam aplikację internetową Java, która odbiera zdarzenia w czasie rzeczywistym i przenosi je do warstwy interfejsu użytkownika. Chcę rejestrować wszystkie postrzegane zdarzenia, a ponieważ ilość informacji będzie ogromna, wolę używać bazy danych NoSQL.Najlepsze praktyki dotyczące rejestrowania danych w czasie rzeczywistym w bazie danych NoSQL DB

W tym celu skonfigurowałem monondb, który wstawia dokument na zdarzenie. Problem polega na tym, że to podejście (dostęp do dysku na zdarzenie) znacznie spowalnia cały proces.

Jakie podejścia mogę przyjąć w tej sytuacji? jakie opcje są dostępne w mongodb (np. wstawianie zbiorcze, wstawianie asynchroniczne, buforowanie, ...)? czy zmiana na inną implementację db NoSQL robi różnicę? jakie są najlepsze praktyki tutaj?

+1

Byłoby dobrze, aby wiedzieć trochę więcej szczegółów na temat spodziewanych ograniczeń wydajności. Jak dużą przepustowość spodziewasz się mieć? 100/s? 10k/s? 1M/s? Średnie i możliwe wartości szczytowe? Jaki jest przybliżony rozmiar wydarzeń podczas serializacji? 100 bajtów? 1 megabajt? Czy rzadko chcesz przeglądać swoje przeszłe wydarzenia, np. Odtwarzając je w określonym przedziale czasu, czy też potrzebujesz zapytań ad-hoc na nich? Ile czasu potrzeba na ich przechowywanie - czy baza danych wzrośnie do wartości danych z lat, czy może co tydzień czyścisz coś do archiwizacji wtórnej? –

Odpowiedz

3

Czekałem przez jakiś czas, aby zobaczyć inne odpowiedzi, ale straciłem cierpliwość. Użyłem MongoDB jako magazynu dziennika dla 3 projektów (dwa dla Java i jeden dla C#). Na tej podstawie mogę zrozumieć następujące ważne zasady dotyczące rejestrowania:

  1. Nie używaj indeksów. Jeśli w większości piszesz, indeksy powodują pogorszenie wydajności. Jeśli potrzebujesz analizy procesów po procesie, skopiuj informacje do innej bazy danych lub kolekcji. Niestety nie można pozbyć się klucza podstawowego _id - po prostu pozostaw go tak, jak jest (GUID) lub zastąp go automatycznym przyrostem NumberLong.

  2. Niższy poziom zapisu. MongoDB ma bogate opcje kontrolowania świadomości operacji zapisu. Możesz ustawić dopasowanie między LogLevel a regułami zapisu. Na przykład DEBUG, INFO, WARN może być z WriteConcern.UNACKNOWLEDGED i ERROR, FATAL może być przechowywany z WriteConcern.ACKNOWLEDGED. W ten sposób poprawiasz wydajność aplikacji, unikając pauzy podczas pisania wiadomości o niskim priorytecie. W tym samym czasie masz pewność, że ważne wiadomości (które są rzadko) umieszczane w pamięci.

  3. Buforuj instancję kolekcji. Mam na myśli unikanie rozwiązywania obiektów Mongo przez getDB lub getCollection za każdym razem, gdy nadejdzie wiadomość.

  4. Minimalizuj ilość danych przekazywanych przez sieć. Ogranicz swoją wiadomość do minimalnego zestawu pól. Przytnij zbyt długi ślad stosu. Spójrz jak Wiosna 3.x skraca pełną nazwę klasy s.w.s.m.m.a.RequestMappingHandlerMapping zamiast some.whatever.sub.main.minimal.agent.RequestMappingHandlerMapping