2009-06-20 11 views
5

Chcemy zapisywać wszystkie najważniejsze wydarzenia w naszych systemach. Na przykład, gdy baza danych może przechowywać bieżący stan użytkownika, dziennik zdarzeń powinien rejestrować wszystkie zmiany tego stanu wraz z czasem, w którym nastąpiły zmiany.Minimalna biblioteka zdarzeń rozproszonych napowietrznych zdarzeń/framework?

Funkcja rejestrowania zdarzeń powinna być bliska narzutowi zerowemu dla obiektu rzutującego zdarzenia, powinna uwzględniać informacje strukturalne (w przeciwieństwie do komunikatów protokołu tekstowego) i powinna obsługiwać rozproszone rozmieszczenie (wiele skrzynek wyrzuca wiele zdarzeń).

W poprzednim życiu mieliśmy system oparty na UDP, który działał dobrze, ponieważ mieliśmy doskonałą kontrolę nad systemem (zminimalizowana utrata pakietów). Rzucane równomiernie rzucają pakiety UDP, które mogłyby zostać przechwycone i zapisane w dzienniku na innych skrzynkach. Szukam czegoś podobnego, mam nadzieję, open source, z półki i można go użyć w bardziej ogólnych sieciach. Alternatywnie jestem otwarty na sugestie, jak zbudować coś takiego.

Powinno to działać w wielu językach, ale będzie głównie przeznaczone dla języków Java i Python. Opłaty za uczestnictwo (wydarzenie) będą się różnić; niektóre będą aplikacjami internetowymi, innymi aplikacjami zorientowanymi na partie. Wyniki prawdopodobnie będą żyły w Hadoop/HDFS/HBase.

+0

Sprawdź to: http://logstash.net/docs/1.3.3/samouczki/rozpoczęcie-scentralizowane – hB0

Odpowiedz

3

Jeśli chcesz zejść z trasy UDP (co wydaje ci się być szczęśliwym), a Java jest opcją, sprawdź, czy Log4j i jej obsługa transmisji UDP przez Log4j UDPAppender.

LoggingEvent pobiera komunikat java.lang.Object jako wiadomość, więc jest dość ogólny i można w nim umieścić dowolne dane. Jeśli przechodzisz przez sieć, powinna (najprawdopodobniej) być szeregowalna, a biorąc pod uwagę, że chcesz UDP, powinna mieć współmierny rozmiar - 64k lub mniej, a następnie zależna od warstwy transportowej). Musisz po prostu przechwycić LoggingEvent po stronie serwera, a następnie przetworzyć go, jak chcesz.

Pamiętaj, że aplikator UDP jest dostarczany jako komponent towarzysz do Log4j i będziesz musiał go sam zbudować. Ale to trywialne.

+0

Dobrze, zaktualizowane pytanie z informacjami o języku i infrastrukturze. Czy Log4J obsługuje dane strukturalne? Używałem go tylko z zwykłymi wiadomościami tekstowymi, ale przypuszczam, że możemy wrzucić w to JSON i być skończonym. – Parand

+0

Komunikat klasy LoggingEvent jest obiektem java.lang.Object, więc jest dość ogólny. Obiekt LoggingEvent zostanie wysłany (a w niektórych przypadkach może być serializowany, więc wiadomość będzie musiała być seryjna), a następnie trzeba go przechwycić na końcu odbiornika UDP. Ale to nic wielkiego. Prawdopodobnie zapewniłoby to trochę eksperymentów. –

+0

Edytowane w celu odzwierciedlenia powyższego w odpowiedzi –

0

To brzmi jak potencjalny kandydat do przesyłania wiadomości (ogień i zapomnij). Jestem głównie osobą .NET, więc nie wiem, jakie są ramy logowania dla Javy. Ale szybko rzuciłem okiem, aby sprawdzić, czy w log4j nie ma żadnych komunikatorów (często używam log4net) - IBM ma artykuł na temat a WebSphere MQ JMS appender, który może ci się przydać.

Zamiast przyjmować moją odpowiedź jako zalecenie użycia produktu WebSphere MQ, proszę przyjąć sugestię dotyczącą przesyłania komunikatów - istnieje wiele frameworków do obsługi otwartego oprogramowania - tylko jeden przykład to RabbitMQ.

+0

Dzięki Richard, systemy MQ mogą być rozwiązaniem. Chciałbym zobaczyć najgorsze scenariusze dotyczące czasu potrzebnego na wysłanie wiadomości, ponieważ ważne jest, aby system rejestracji miał jak najmniejszy wpływ na rzucającego. Zakładałem, że systemy MQ mogą być zbyt ciężkie, ale to może być błędne założenie. – Parand

+0

Wygląda na to, że należy rozważyć wykonanie testów porównawczych. Powinieneś również wziąć pod uwagę inne wskaźniki, np. Jak ważna jest gwarancja dostawy, czy komponenty będą działać w nieoczekiwanym otoczeniu itd. – RichardOD

2

Możesz rozważyć użycie starego dobrego sysloga * nix. Ma bardzo mały narzut i jest najczęściej używany przez UDP lub lokalne gniazda UNIX, ale może używać TCP, jeśli potrzebujesz niezawodnego logowania. Działa dla mojego (Python/Perl, głównie, ale jest to całkowicie język/platforma-agnostyka) jak urok.

Niestety, nie jestem zaznajomiony z Java, ale cecha-mądry, to wydaje się, że niektóre dobre biblioteki Mam googed: http://syslog4j.org/

Edit Szybkie googling odkryłem artykuł o nazwie "Robust event logging with Syslog" co wydaje się być dość szczegółowe na ten temat. Niestety, źle odczytałem go, gdy został opublikowany i pomyślałem, że jest to biblioteka * nix syslog, ale tak nie jest.

Powiązane problemy