taki case:
jest sobie aplikacja x przetwarzająca pewne dane z różnych źródeł (csv, xml, zewnętrzne api) i zapisująca je w bazie danych mysql. Dla uproszczenia przyjmijmy że w aplikacji user tworzy projekt i ma on swoje źródło danych, projekty nie mają ze sobą żadnych powiązań i dane pobierane są przynajmniej raz dziennie. Projektów do przetworzenia jest coraz więcej i zaczynają się problemy z wydajnością. W pierwszej kolejności zamiast pojedynczej bazy danych robimy bazę per projekt, przynosi to spory wzrost wydajności (baza była wąskim gardłem), później migrujemy aplikację na większy serwer i zwiększamy liczbę przetwarzanych na raz projektów. Następnie dokładamy drugi serwer bazodanowy i tu zaczyna się problem. Na ten moment mamy dwa serwery bazodanowe i jeden backendowy. Proces pobierania danych wygląda następująco:
- żądanie pobrania leci do kolejki (sqs w AWS)
- proces uruchomiony na serwerze backendowym bierze wiadomość, pobiera dane i zapisuje w konkretnej bazie danych.
Jak najlepiej zbalansować obciążenie serwerów bazodanowych? Zakładając że na backendzie mamy uruchomione 100 procesów, w kolejce jest 1000 wiadomości - 500 wiadomości dotyczy projektów z serwera bazodanowego 1 i 500 wiadomości serwera 2, może nastąpić sytuacja że najpierw będzie obrobione 500 z serwera 1 a potem 500 z serwera 2, chciałbym tego uniknąć.
To co na ten moment mam w głowie to zrobić osobne kolejki per serwer bazy i do każdej z nich osobna pula procesów obrabiających dane. Ewentualnie przejść na kolejki fifo i grupować wiadomości po serwerze. Docelowo będziemy zwiększać liczbę serwerów backendowych i bazodanowych więc pewnie zrobienie na sztywno: serwera bazodanowego, serwera backendowego i obsługującej tą parę kolejki nie byłoby złym rozwiązaniem. Planujemy tez zrezygnować z sqs na rzecz rabbitMQ.
Może jest jakieś oczywiste rozwiązanie tego problemu tylko ja się tak zakręciłem że go nie widzę?