tło
Pracuję nad aplikacją dla klienta, która zawiera niektóre funkcje sieci społecznościowych. Początkowo opracowywałem mobilny front-end, ale okoliczności sprawiły, że jestem odpowiedzialny za rozwój back-endu.
Jako ogólny kontekst, nasz system pozwala użytkownikom śledzić innych użytkowników i otrzymywać powiadomienia o tych, których obserwują, jak można oczekiwać od sieci społecznościowej. Zastrzeżenie polega na tym, że tylko niewielki podzbiór (najwyżej kilkaset) użytkowników będzie przestrzegany, przy czym oczekuje się, że większość użytkowników będzie śledzić co najmniej jedną z tych osób.
Po stronie interfejsu użytkownika pojawi się przycisk powiadomienia z numerem, a kliknięcie przycisku spowoduje przejście do ekranu powiadomień.
Problem
Badam strategie wdrażania powiadomień i większość zasobów, które znalazłem, wskazuje na utworzenie jednej lub więcej tabel powiadomień w bazie danych. (Przykładem, który podoba mi się, jest akceptowana odpowiedź tutaj: /programming/9735578/building-a-notification-system ).
Rzeczą, która mnie odrzuca, jest to, że większość strategii powiadomień opartych na bazie danych wymaga wstawienia wiersza dla każdego powiadomienia dla każdego obserwatora. Więc jeśli tysiąc osób śledzi Sally, wstawiamy tysiąc wierszy do odpowiedniej tabeli. Czy to jest skalowalne? Co się stanie, jeśli dojdziemy do punktu, w którym dziesiątki lub setki tysięcy użytkowników śledzą Sally, a ona publikuje kilkadziesiąt postów dziennie?
Mój pierwotny pomysł polegał na tym, aby obsłużyć wszystko za pomocą zapytań: numer na przycisku powiadomień zostałby uzyskany przez żądanie liczenia wierszy treści opublikowanych ostatnio niż podczas ostatniej wizyty na ekranie powiadomień, podczas gdy indywidualne powiadomienia byłyby generowane na podstawie bardziej szczegółowych zapytań kiedy odwiedziłeś ekran powiadomienia. Takie podejście nie wymagałoby zapisywania ani dodatkowej pamięci, ale jest mało elastyczne i prawdopodobnie mocno uderzyłoby w serwer.
USTAWIAĆ
Backend (jak ustalił poprzedni programista) używa CodeIgniter i bazy danych MySQL . Obecnie działa na kiepskim wspólnym koncie hostingowym GoDaddy, ale zakładam (mam nadzieję, że) to zostanie zaktualizowane, zanim przejdziemy do produkcji, a pakiet hostingowy będzie skalowany wraz ze wzrostem liczby użytkowników.
Obecnie naszym jedynym front-endem jest aplikacja mobilna, ale planujemy również później zbudować stronę internetową. W tej chwili nie jestem zainteresowany uzyskiwaniem od serwera aktualizacji wypychanych w czasie rzeczywistym dotyczących powiadomień.
UZUPEŁNIENIE
Nie specjalizuję się w backendach i jestem nad głową w tym dziale. Klient wie o tym i dołożyłem wszelkich starań, aby wyjaśnić zakres projektu tego rodzaju, ale dali jasno do zrozumienia, że w tym momencie nie będą ufać nikomu innemu do pracy nad projektem. Prawdopodobnie mamy jeszcze miesiąc do zrobienia, zanim zaczniemy dodawać testery i będę mógł uzyskać jakiekolwiek pomiary wydajności. Naprawdę nie jestem w stanie oszacować, ilu użytkowników moglibyśmy mieć ani na jakim sprzęcie moglibyśmy być obecni w ciągu najbliższych 5 lat, ale myślę, że klient liczy na setki tysięcy użytkowników lub więcej.
Mam nadzieję, że jest to na tyle specyficzny problem, że można go tutaj opublikować; Mogę to udoskonalić, jeśli zajdzie taka potrzeba. Zapytaj, czy masz jakieś pytania lub pominąłem ważne szczegóły.
tl; dr
- Czy oparty na bazie danych system powiadomień ma negatywne konsekwencje dla długoterminowej skalowalności, gdy wszyscy użytkownicy śledzą tylko niektóre z tych samych kilkuset osób?
- Czy istnieje sposób, aby bazy danych powiadomień były sterowane bez potrzeby oddzielnego wiersza powiadomień dla każdego powiadomienia dla każdego obserwatora?
- Czy system powiadomień oparty wyłącznie na zapytaniach byłby skalowalny, czy miałby jakieś zalety oprócz nie zapisywania żadnych danych w bazie danych?
- Czy zbyt wcześnie się nad tym zastanawiam? Czy powinienem po prostu zbudować coś, co na razie działa i możemy się martwić o optymalizację, jeśli stanie się to problemem, biorąc pod uwagę, że klient ma ograniczony budżet i nie wiemy jeszcze, czy produkt końcowy będzie popularny?
źródło
Odpowiedzi:
Tak, pod warunkiem, że tabele bazy danych są odpowiednio indeksowane.
Będziesz generować kilkadziesiąt lub setki tysięcy rekordów powiadomień dziennie dla Sally, zakładając, że chcesz na bieżąco śledzić każde powiadomienie. Odsetek użytkowników takich jak Sally z tego rodzaju ruchem jest zawsze bardzo mały.
To wydaje się niepotrzebnie skomplikowane. Jeśli potrzebujesz szczegółowych statystyk dotyczących powiadomień, po prostu przechowuj powiadomienia.
Właśnie dlatego działa ... niewielka liczba osób zawsze generuje zdecydowaną większość ruchu.
Tak ... Nie przechowuj powiadomień; po prostu wyślij e-mail z powiadomieniem w stylu „zapomnij”. Lub przechowuj powiadomienia przez określony czas, a następnie je odrzuć. Lub odrzuć każde powiadomienie po jego odczytaniu.
Nie jestem pewien, co przez to rozumiesz. Jeśli chcesz wysyłać zapytania do powiadomień, musisz je przechowywać w bazie danych. W przeciwnym razie nie ma nic do zapytania.
Porozmawiaj z kimś, kto może pomóc Ci zaprojektować właściwie znormalizowaną, indeksowaną bazę danych z odpowiednimi tabelami. Nie widzę powodu, dla którego taka baza danych nie byłaby w stanie skutecznie obsłużyć opisywanych scenariuszy.
Przykład z prawdziwego życia
O ile mi wiadomo, Stack Exchange przechowuje wszystko bez końca, w tym wszystkie powiadomienia. Używają technologii baz danych podobnych do MySql i niektórych technologii buforowania. Podczas gdy ich sprzęt i przestrzeń dyskowa są znaczne, to duży ruch jest dużym problemem.
źródło