Wpis z mikrobloga

Elo mirki.

Mam taki problem natury programistycznej.

Mam sobie aplikację, która wrzuca użytkownikowi jakieś tam notyfikację.
Tylko, że te notyfikacje są wrzucane na podstawie jakichś chorych reguł. Np. użytkownik dostaje notyfikację tylko i wyłącznie jeśli:
- wczoraj zalogował
- przez ostatnie 48h kliknął w jakiś checkbox
- urodził się przed rokie 95'
- ma ponad 165cm
- złożył depozyt o wartości min. XXX zł

Te reguły są trochę z dupy, tylko takie przykładowe dałem, ale ogólnie jest ich mnóstwo i dotyczą różnych zagadnień.

Aktualnie jest to rozwiązane tak, że mamy ogromne SQL-owe query (na ok. 500-700 linii), które zwraca mi którym użytkownikom należy wysłać notyfikację.

Czy da się to ograć jakoś inaczej? Co byście zrobili gdybyście mieli pisać taką aplikację od nowa i moglibyście użyć czegokolwiek chcecie?

#webdev #programowanie #pytanie #pytaniedoeksperta #informatyka
  • 11
@trevoz: nosql'owa baza, która trzyma id użytkownika i propertiesy czyli rekord wygląda tak

{"userId": "1", "lastLoginUtc": "21.05.2053 12:00", "bornedBefore95":false, "heightOver165": true, "checkboxDupaClickedUtc":"22.05.2053 13:00" }

i teraz jak powstaje Ci nowe property z czapy to dokleja się do tego rekordu. Jak jakiś event ma być sprawdzony to możesz sobie zrobić kompozycje ifów i orów na takim rekordzie.
Najlepiej osobna usługa do której ślesz message co ma się dodać do jakiego usera.

Osobno
a co do reguł to najlepiej zrobić prosty parser który zrozumie coś w stylu (bornedBefore95 && heightOver165 || ( chekcboxDupaClickedUtc > "21.05.2021") i jakiś kreator który będize to trzymał w bazie i łopatologicznie pozwalał tworzyć te rule użytkownikom i wiązał je z trescią notyfikacji
@trevoz: Zrób tak jak @januszgorszyciel mówi. Jest akcja => jest reakcja.
Podam tobie przykład.
Mamy u nas sobie jakiś silnik wyszukiwania produktów.
Użytkownicy zapisują sobie wyszukiwania. Mamy ich około pół miliona. Użytkownik ma dostać powiadomienie gdy nowy produkt wpadnie w jego search.
Produkty idą w tysiące.
I teraz:
- nie uruchamiamy co godzinę i nie oramy wszystkiego, tzn kiedyś tak robiliśmy, że 2 razy dziennie odpalaliśmy to i trwało 2h na
@trevoz: a gdzie jest problem? Jeśli logika jest zryta to i tak trzeba ją gdzieś zaklepać. Jeśli SQL się do tego nie nadaje to pobierasz użytkowników w aplikacji i tam klepiesz logikę. Niezależnie co wybierzesz to inna baza na pewno nie pomoże: SQL ma dużo wad, ale akurat tworzenie skomplikowanych zapytań jest tam bardzo dobre. Wybór NoSQL może tylko pogorszyć sprawę. Oczywiście jak pobierzesz zawartość z bazy do aplikacji bez żadnej
@trevoz: Pierwsza myśl - Użyłbym jakiegoś query builder, gdzie możesz dodawać filtry. W javie np. Querydsl lub jOOQ. Wtedy takie zapytania wyglądałby np. tak w dużym uproszczeniu:

def loggedYesterdayFilter = filter.between("lastLogin", "NOW - 2", "NOW - 1")
def heightMinFilter(height) {
return filter.min("height", height);
}

def query1() {
return query.table("user").filter(loggedYesterdayFilter)
}
def query2() {
return query1().filter(heightMinFilter(165));
}

query1().list();
query2().list();