2013-01-09 15 views
6

Mam ciągły strumień wiadomości, które są analizowane. Analiza zwraca różne zmienne, takie jak autor, temat, sentyment, liczba słów i zestaw odrębnych słów. Użytkownicy w systemie są w stanie zdefiniować reguły, które powinny wywołać alert, gdy są dopasowane. Reguły powinny być przechowywane w bazie danych SQL. Reguła jest połączeniem pojedynczych kryteriów z analizą wiadomości, tj. word-count > 15 && topic = 'StackOverflow' && sentiment > 2.0 && word-set contains 'great'. Każde dozwolone kryterium jest podawane na końcu analizy wiadomości, po czym zostanie uruchomione sprawdzanie poprawności reguł i zaimplementowane w Javie.Wzór do ciągłego porównywania reguł

Każda wiadomość musi być sprawdzona pod kątem wszystkich reguł zdefiniowanych przez wszystkich użytkowników w systemie, który wymaga dużej mocy obliczeniowej (obecnie 10 wiadomości na sekundę i 10 000+ reguł do sprawdzenia). Czy istnieje wspólny wzorzec przyspieszenia procesu dopasowywania, być może dlatego, że reguły można sprawdzać równolegle, z wyjątkiem pojedynczych elementów? Czy można to zrobić w czystym SQL, jak wyglądałby schemat dla reguł różnych typów?

+0

SQL jest typowy dla relacyjnych baz danych. Gdzie jest relacyjna baza danych w tym systemie? –

+0

gdzie są te reguły przechowywania, które są zdefiniowane przez użytkownika? – sourcecode

+0

Czy każda wiadomość zawiera wszystkie pola, które są potrzebne do rozwiązania dowolnej/wszystkich reguł? –

Odpowiedz

2

Twoje rozważania mogą być czymś więcej niż tylko przepustowością dopasowania. Musisz na przykład zachować zasady.

Przyjmijmy jednak statyczny zestaw reguł i komunikatów, które zawierają wszystkie pola potrzebne do spełnienia wszystkich reguł. Używając SQL, struktura zaczynałaby się od tabeli message. Ta tabela będzie miała wyzwalacz insert. Spust wprowadzający byłby odpowiedzialny za dopasowanie do reguł. Jaki jest najlepszy sposób na zrobienie tego?

Przy 10 wiadomościach na sekundę twoje przetwarzanie będzie z natury równoległe, nawet jeśli każdy mecz jest jednotomowy. Nie jestem pewien, ile wysiłku potrzeba, aby zrównoważyć mecz. Równoległość w bazach danych jest zwykle zawarta w instrukcjach SQL, a nie pomiędzy nimi.

Istnieje wiele różnych rozwiązań. Można na przykład zakodować reguły jako kod w gigantycznej procedurze przechowywanej. Byłoby to koszmar do utrzymania, może przekroczyć ograniczenia długości procedur przechowywanych i może być boleśnie powolne.

Kolejny szalony pomysł. Przechowuj odpowiednie wiadomości dla reguły w tabeli, dla tej reguły i ograniczaj tylko te, które pasują. Twój proces wygląda wtedy jak instrukcje z insertem zillion.

Więcej poważnie, można iść dalej z kodem takich jak:

select * 
from rules 
where . . . 

zestaw wyników musiałby dopasowania reguł. Klauzula where może być coś takiego:

select * 
from rules r 
where @wordcount > coalesce(r.wordcount, 0) and 
     @topic = coalesce(r.topic, @topic) and 
     . . . 

Oznacza to, że każde możliwe porównanie wszystkich przepisów byłoby w klauzuli where. Reguły zostaną wstępnie przetworzone w celu określenia, których klauzul potrzebują.

można nawet zrezygnować ze zmiennych zewnętrznych oraz bezpośredni dostęp do zapytania:

select * 
from rules r cross join inserted i 
where i.wordcount > coalesce(r.wordcount, 0) and 
     i.topic = coalesce(r.topic, @topic) and 
     . . . 

Tak, tak, to jest możliwe w SQL. I możesz wykonać dopasowanie równolegle. Trzeba tylko wykonać pracę, aby uzyskać reguły w formacie odpowiednim do porównań z bazami danych.

+0

Dzięki za te sugestie, największym problemem jest faktyczne dopasowanie reguł do wspólnego formatu bazy danych, ponieważ mogą one mieć bardzo różny charakter (różni operatorzy, wartości liczbowe lub zestawy do porównania itp.). – Thomas

+0

@Thomas. . . Dlatego istnieją konsultanci. –

1

Rozwiązałem podobny problem w języku C#, ale nie używając SQL.

Zapisałem reguły w postaci spersonalizowanego pliku XML w bazie danych, dla celów przenoszenia.

Przy uruchomieniu aplikacji lub po zmianie tabeli reguł (wymuszeniu przepełnienia pamięci podręcznej reguł) załadowałem wszystkie reguły z bazy danych i zserializowałem je do odpowiednich klas.

Następnie, gdy dane pojawiały się na każdym serwerze aplikacji, wykonywałem reguły przeciwko przychodzącym danym i dla przekazywania reguł wykonano odpowiednią akcję. (W tym czasie wykonywałem działanie w proc na serwerze aplikacji, ale teraz zrzucałem je do kolejki.)

Ma to tę zaletę, że rozkłada obliczenia w klastrze aplikacji i nie zachowuje wszystkich zasysanie cykli na komputerze bazy danych.

Powiązane problemy