Pracuję nad aplikacją, która wymaga bardzo wysokiej wydajności aktualizacji / wyboru zapytań w bazie danych.
Mam tabelę podstawową (A), która będzie zawierała około 500 rekordów dla jednostki na jeden dzień. I dla każdego użytkownika w systemie tworzona jest odmiana tego bytu na podstawie niektórych preferencji użytkownika i są one przechowywane w innej tabeli (B). Odbywa się to przez zadanie crona, które działa codziennie o północy.
Jeśli więc w tabeli A znajduje się 10 000 użytkowników i 500 rekordów, w tabeli B będzie 5 milionów rekordów tego dnia. W tych tabelach zawsze przechowuję dane na jeden dzień, a o północy archiwizuję dane historyczne w HBase. Ta konfiguracja działa dobrze i do tej pory nie mam problemów z wydajnością.
Ostatnio nastąpiła zmiana wymagań biznesowych, a teraz niektóre atrybuty w tabeli podstawowej A (dla 15-20 rekordów) będą się zmieniać co 20 sekund i na tej podstawie muszę ponownie obliczyć niektóre wartości dla wszystkich tych rekordów zmian w tabeli B dla wszyscy użytkownicy. Mimo że zmienia się tylko 20 rekordów głównych, muszę dokonać ponownego obliczenia i zaktualizować 200 000 rekordów użytkowników, co zajmuje więcej niż 20 sekund, a następnie następna aktualizacja nastąpi ostatecznie, w wyniku czego wszystkie zapytania Select zostaną umieszczone w kolejce. Dostaję około 3 żądań / 5 sekund od użytkowników online, co powoduje 6-9 Wybierz zapytania. Aby odpowiedzieć na żądanie interfejsu API, zawsze używam pól w tabeli B.
Mogę kupić większą moc obliczeniową i rozwiązać tę sytuację, ale jestem zainteresowany posiadaniem odpowiednio skalowanego systemu, który może obsłużyć nawet milion użytkowników.
Czy ktoś może tu zaproponować lepszą alternatywę? Czy relacyjna baza danych nosql + mi tu pomaga? Czy są jakieś platformy / magazyny danych, które pozwolą mi często aktualizować dane bez blokowania, a jednocześnie dadzą mi elastyczność uruchamiania wybranych zapytań na różnych polach w jednostce?