Teraz ten komputer technologia mobilna rozwijany przy złej pogodzie, kwestia pierwszorzędnej wagi koncentruje się na umiejętności utrzymywania wzajemnej komunikacji.

Komunikatory pozwalają na omawianie dowolnych zagadnień w czasie rzeczywistym, od prywatnych po konferencje biznesowe. Dlatego ich popularność jest nie mniejsza niż gier wieloosobowych.

Wszystkie komunikatory internetowe mają jeden problem, którym jest szybkie gromadzenie się starych wiadomości. Zajmują dodatkową pamięć na Twoim urządzeniu.

Czyszczenie czatu w Discord (instrukcja)

Regularna komunikacja w komunikatorze ma tendencję do zapychania pamięci urządzenia. Wiadomości gromadzą się, a wiele z nich nie niesie ze sobą ładunku semantycznego. Dlatego konieczne jest ich usunięcie.

Ponadto przechowywanie całej korespondencji jest bardzo ryzykowne. Istnieje duże prawdopodobieństwo wycieku danych, w wyniku czego mogą one zostać wykorzystane jako kompromitujące dowody na siebie. Aby zapobiec takiemu skutkowi zdarzeń, konieczne jest terminowe oczyszczenie historii. W Discordzie można to zrobić na trzy sposoby:

  • Usuń kanał.
  • Oddzielne usuwanie każdej wiadomości.
  • Usuń wszystkie wiadomości z ostatniego tygodnia.

Po wysłaniu wystarczy kilka sekund, aby usunąć wiadomość, zanim zobaczą ją wszyscy członkowie kanału. Wybór metody czyszczenia jest bardzo sytuacyjny i dobierany zgodnie z osobistymi potrzebami twórcy serwera. Dowiedz się więcej o każdej z metod wraz z instrukcją użycia.

Sposób pierwszy, usuń cały kanał i utwórz nowy P2>

Nie możesz wymyślić prostszej opcji. Kiedy temat się wyczerpał lub po prostu zgromadziło się wiele kompromitujących informacji w dyskusjach, całkowicie usuń kanał i utwórz nowy. Usunięcie następuje po kilku sekundach i nie można go przywrócić.

Uwaga! Jeśli jest ważna informacja, przepisz w osobnym dokumencie lub zapisz jako zrzuty ekranu.

Musisz wykonać kilka prostych kroków:



Następnie tworzysz nowy, możesz nawet o tej samej nazwie.

Metoda druga: usuń każdą wiadomość osobno

Najdłuższe sprzątanie w historii. Ze względu na czasochłonność nadaje się tylko do usunięcia niewielkiej ilości. Instrukcja użycia:



Usunięte wiadomości zostaną utracone dla wszystkich użytkowników kanału. Jeśli został dodany do zakładek, zniknie.

Metoda trzecia: czyszczenie ostatnich 7 dni

Ta metoda dotyczy tylko postów użytkownika, którego chcesz zablokować. Przed wysłaniem na czarną listę będziesz mieć możliwość wyboru, na jaki okres usunąć historię listów od użytkownika:

  • Przez dwadzieścia cztery godziny.
  • Albo ostatnie siedem dni (i nocy).


Jak umieścić osobę na czarnej liście?:


Podaj powód, jeśli chcesz, możesz pozostawić to pole puste.

Jak często należy czyścić czat?

Porządkowanie czatu zależy wyłącznie od motywu społeczności. Jeśli wymieniasz humor, to nie ma sensu go usuwać, lepiej zostawić wszystko tak, jak jest, aby móc wrócić do wpisu, który Ci się podoba.

Jeśli masz zbiorową mieszankę, warunkowo, pełną swobodę dyskusji na różne tematy, lepiej posprzątać ją przynajmniej raz na kilka dni. Najlepiej oczywiście - raz dziennie. Nie ma w tej kwestii konkretnych wymagań, więc każdy Administrator wyznacza sobie poprzeczkę w tej sprawie.

Na świecie nowoczesne technologie komunikacja przez Internet jest prawie na pierwszym miejscu. Jest to bardzo wygodne, więc ludzie coraz częściej instalują różne komunikatory internetowe (ten sam lub Telegram) na swoich gadżetach i uruchamiają zarówno prywatne, jak i korespondencja biznesowa. Discord w takich przypadkach jest pożądany. Ale z biegiem czasu gromadzi się wiele niepotrzebnych liter, które zapychają urządzenie, a także istnieje ryzyko, że prywatne wiadomości, które nie są przeznaczone dla osób trzecich, mogą zostać przez kogoś przeczytane, a wtedy pojawia się pytanie: „Jak wyczyścić czat na Discordzie?

Jak usunąć wiadomości czatu na Discord

Metoda 1. Usuwanie korespondencji jedną wiadomością

Ta opcja jest odpowiednia, jeśli chcesz usunąć tylko niektóre litery, własne lub innych użytkowników, ponieważ całkowite wyczyszczenie czatu zajmie dużo czasu. Sam proces wygląda tak:

  • otwórz program;
  • wprowadź rozmowę, w której będziesz pracować;
  • najedź kursorem myszy na wiadomość, którą chcesz usunąć i kliknij na nią (możesz również kliknąć na pionowe trzy kropki po prawej stronie wybranej wiadomości);
  • w wyskakującym oknie wybierz „Usuń wiadomość”;
  • potwierdzić operację.

Metoda 2. Usunięcie całego czatu

Jak usunąć wszystkie wiadomości w Discord, jeśli nie zawierają cennych informacji? Aby wykonać tę operację, musisz wykonać szereg czynności:

  • pobierz aplikację;
  • wybierz kanał do zniszczenia;
  • przesuń wskaźnik myszy nad nią i kliknij ikonę koła zębatego, która pojawi się po prawej stronie;
  • w menu, które się otworzy, wybierz czerwony element „Usuń kanał”;
  • Odpowiedz „Tak” na pojawiające się pytanie.

Metoda 3: Uruchom skrypty

Ta metoda może być niebezpieczna dla osób słabo obeznanych ze skryptami. Przed uruchomieniem należy je sprawdzić, aby upewnić się, że nie zawierają żadnych informacji umożliwiających dostęp do Twoich danych osobowych. Jeśli masz pewność, że skrypt został wysłany od uczciwego nadawcy, to:

  • skopiuj to;
  • wklej w polu wprowadzania tekstu SMS;
  • biegać.

W ten sposób możesz pozbyć się dużej liczby wiadomości. Ale warto powtórzyć, jest odpowiedni tylko dla doświadczonych użytkowników.

Metoda 4: Usuń rozmowy z ostatnich siedmiu dni

Taki system jest odpowiedni, jeśli usuniesz wiadomości od konkretnej osoby. Instrukcja krok po kroku wygląda tak:

  • kliknij prawym przyciskiem myszy użytkownika, od którego usuniesz litery;
  • w wyświetlonym menu wybierz „Zablokuj”;
  • zaznacz żądany przedział czasu, dla którego będzie przeprowadzane czyszczenie (24 godziny lub 7 dni) i kliknij „Zablokuj”.

Ten uczestnik nie będzie już mógł brać udziału w rozmowie, dopóki nie zostanie odbanowany przez administratora lub twórcę czatu.

Co to są polecenia czatu Discord?

Nie ma możliwości jednoczesnego usunięcia wszystkich wiadomości w Discord, ale jest jedna metoda, która pozwala usunąć do 100 wiadomości naraz. Aby to zrobić, instalowany jest bot Mee6, który ma polecenia do czatowania w Discord, za pomocą którego usuwana jest korespondencja. Procedura wygląda następująco:

  • przejdź do strony z dostępnymi;
  • klikając przycisk „Dodaj do niezgody”;
  • jeśli jesteś administratorem, połącz go z serwerem, wybierając element „Autoryzuj”.

  • otwarta korespondencja z Mee6;
  • w wiadomości powitalnej pojawi się link, który należy kliknąć, aby uzyskać dostęp do pulpitu nawigacyjnego;
  • podłącz „Wtyczka Moderatora”, tutaj znajduje się polecenie wyczyszczenia „!clear” (odbywa się to poprzez kliknięcie elementu „Wyłączone” na żółto w oknie, które się otworzy, po czym zmienia się na „Włączone” i zmienia się niebieski, co oznacza udane połączenie).

Uważnie przeczytaj zasady korzystania z poleceń. Następnie możesz przejść do kanału tekstowego lub osobistej korespondencji i wykonać czyszczenie, wybierając polecenie " [e-mail chroniony] Nazwa użytkownika". W rezultacie 100 ostatnie posty będzie usunięty.

Jeśli chcesz skasować tylko kilka wiadomości, użyj polecenia „!clear xx”, gdzie zamiast xx podaj liczbę wiadomości od 1 do 99.

Czy rozmówca widzi usunięte wiadomości?

Czasami zdarzają się przypadki, gdy piszesz coś zbędnego lub nie na temat, a zauważając przeoczenie, natychmiast usuwasz list, a następnie zastanawiasz się, czy rozmówca widzi usunięte wiadomości w Discord. Jeśli zostanie to zrobione przed odczytaniem listu przez innego uczestnika, usunięta wiadomość pozostanie tajna.

Na podstawie powyższego materiału można zauważyć, że istnieje kilka opcji czyszczenia czatu w Discord. Wybrana metoda zależy od liczby wiadomości, które planujesz usunąć.

Po utworzeniu własnego serwera Discord wielu początkujących może mieć różne pytania dotyczące administrowania serwerem. Jednym z tych pytań może być „Jak usunąć wszystkie wiadomości z Discorda?”. To pytanie można zadać z wielu powodów: od usunięcia jednej niepotrzebnej wiadomości po wyczyszczenie całej bazy danych z wścibskich oczu.

Usuń rozmowę w Discord

Niestety twórcy nie przewidzieli możliwości jednoczesnego usunięcia wszystkich wiadomości w Discordzie. Ale nie denerwuj się! Istnieje wiele metod częściowego obejścia tego zakazu.

Metoda 1: Usuń rozmowę za pomocą jednej wiadomości

Ta metoda jest odpowiednia tylko wtedy, gdy chcesz usunąć korespondencję tylko częściowo. Jako opcja czyszczenia na dużą skalę ta metoda jest najgorsza, ponieważ wymaga nakładów na wielokrotne powtarzanie czynności.


Metoda 2: Usuń wszystkie wiadomości w Discord, usuwając czat

Usuń korespondencję z Ta metoda można to zrobić dość szybko. Jedynym minusem jest to, że będziesz musiał ponownie utworzyć kanał i wprowadzić jego ustawienia. Główna zaleta - pozwala usunąć wszystkie wiadomości w Discordzie zapisane na wybranym kanale.


Przypomnijmy, że oficjalnie Discord nie uznaje takich pojęć jak grupa czy czat. Najczęściej rozumiane są jako miejsce, w którym można prowadzić komunikację grupową. Tylko w Discordzie takie miejsca nazywane są nieco inaczej - kanałami. W takim przypadku kanały mogą być dwojakiego rodzaju: tekstowe i głosowe. Wiele osób woli Discord, ponieważ pozwala uczestnikom komunikować się w kilku kanałach tekstowych jednocześnie bez opuszczania kanału głosowego.

Metoda 3: Usuń rozmowę Discord za pomocą reakcji

Nie da się usunąć wszystkich wiadomości w Discordzie za pomocą reakcji, one same pomagają w administrowaniu niektórymi procesami.

Na przykład istnieje przydatny bot, który pozwala dodawać ankiety do serwera Discord, składające się z maksymalnie dziewięciu odpowiedzi. Za pomocą reakcji możesz zobaczyć, które opcje odpowiedzi zostały wybrane określony przez użytkownika a także je usunąć. Początkowo reakcje były przeznaczone na emotikony emoji.


Metoda 4: Usuń wiadomości z ostatniego tygodnia

Jest też miejsce, w którym można trochę pobyć radykalny sposób do kasowania wiadomości. Pozwala jednak usunąć wszystkie wiadomości z Discorda z ostatnich 7 dni.

Warto zauważyć, że ta metoda jest odpowiednia tylko wtedy, gdy musisz usunąć wiadomości pojedynczego użytkownika, a nie cały czat.


Na koniec zbanowany użytkownik zostanie zablokowany na serwerze, co oznacza, że ​​nie będzie mógł skorzystać z łącza zaproszenia do zasobu, dopóki nie zostanie odblokowany przez twórcę lub członka z uprawnieniami administratora. Jak odblokować osobę, opisano poniżej.

Metoda 5: Mee6 Bot

Chociaż Discord nie pozwala na usunięcie wszystkich wiadomości, istnieje sposób na usunięcie do 100 wiadomości naraz. Aby to zrobić, wystarczy zainstalować dodatkowego bota Mee6. Trzeba przyznać, że jest to najprostsze i szybka metoda, który umożliwia usunięcie rozmowy.

Zasadniczo Mee6 jest botem muzycznym, ale ma kilka przydatnych funkcji.

  1. Pierwszym krokiem jest dodanie bota do swojego serwera. Śledź ten link .
  2. Uruchom polecenie " Dodaj do niezgody».
  3. Autoryzuj bota Mee6.
  4. Następnie musisz wybrać serwer, na którym Mee6 będzie dominować.
  5. W kolejnym oknie możesz ustawić uprawnienia, które będą dostępne dla dodanego bota.
  6. Po kliknięciu „Autoryzuj” potwierdź, że nie jesteś robotem.
  7. Po dodaniu bota do serwera otworzy się okno, w którym należy ustawić konfigurację i parametry bota. Na przykład dołączono kilka wtyczek. Jednym z nich jest pomoc.
  8. Aby zmiany zaczęły obowiązywać, zaznacz pole i kliknij „ aktualizacja", tj. aktualizacja.
  9. Aby sprawdzić działanie polecenia, wyślij wiadomość!help na serwerze w dowolnym z czatów.
  10. Następnie opis różnych punktów wtyczek powinien pojawić się w osobistej wiadomości od bota.
  11. Z postu wspierającego Mee6 jasno wynika, że ​​zestaw poleceń do usuwania postów może zawierać wtyczkę „Moderator”. W oknie edycji konfiguracji bota kliknij pomarańczowy owal z napisem „Wyłączone” obok sekcji „Moderator”.
  12. Potwierdź dodanie wtyczki.
  13. Zwróć uwagę na włączenie polecenia!Clear i zapisz zmiany za pomocą operacji „Aktualizuj”. Polecenie !clear xx pozwala na jednoczesne usunięcie do 100 wiadomości, przy czym należy dodać liczbę wiadomości do usunięcia zamiast xx.
  14. Wyślij wiadomość z poleceniem !clear 50.
  15. Oznacza to, że ostatnie 50 wiadomości zostanie usuniętych z czatu. Odliczanie usuniętych wiadomości następuje od końca korespondencji, czyli najpierw usuwane są nowe wiadomości, a dopiero potem stare.

Algorytm działań pozwalający na usuwanie korespondencji przez interfejs telefon komórkowy, jest całkowicie podobny do wykonywanych operacji. Dlatego nie będziemy ich ilustrować.

  • Tłumaczenie

Discord nadal rośnie szybciej, niż się spodziewaliśmy, podobnie jak treści generowane przez użytkowników. Im więcej użytkowników - tym więcej wiadomości na czacie. W lipcu ogłosiliśmy 40 mln wiadomości dziennie, w grudniu ogłosiliśmy 100 mln wiadomości, a w połowie stycznia przekroczyliśmy 120 mln. Od razu zdecydowaliśmy się przechowywać historię czatów na zawsze, aby użytkownicy mogli wrócić w dowolnym momencie i uzyskać dostęp do swoich danych z dowolnego urządzenia. To bardzo dużo danych, których przepływ i objętość rośnie, a wszystkie muszą być dostępne. Jak to robimy? Kasandro!

Co zrobiliśmy

Oryginalna wersja Discorda została napisana w niespełna dwa miesiące na początku 2015 roku. Być może jeden z najlepszy DBMS dla szybkiej iteracji jest MongoDB. Wszystko w Discordzie było specjalnie przechowywane w jednym zestawie replik MongoDB, ale przygotowywaliśmy też wszystko do prostej migracji do nowego DBMS (wiedzieliśmy, że nie będziemy używać shardingu MongoDB ze względu na jego złożoność i nieznaną stabilność). Właściwie jest to część naszego Kultura korporacyjna: projekt szybko do doświadczenia Nowa cecha produkt, ale zawsze dążąc do bardziej niezawodnego rozwiązania.

Komunikaty były przechowywane w kolekcji MongoDB z pojedynczym indeksem złożonym na channel_id i created_at . Około listopada 2015 r. osiągnęliśmy kamień milowy 100 milionów wiadomości w bazie danych i wtedy zaczęliśmy rozumieć problemy, które nas czekają: dane i indeks nie mieszczą się już w pamięci RAM, a opóźnienia stają się nieprzewidywalne. Czas na migrację do bardziej odpowiedniego DBMS.

Wybór odpowiedniego DBMS

Przed wyborem nowego DBMS, musieliśmy zrozumieć dostępne wzorce odczytu/zapisu i dlaczego były problemy z obecnym rozwiązaniem.
  • Szybko stało się jasne, że odczyty były wyjątkowo losowe, a współczynniki odczytu/zapisu wynosiły około 50/50.
  • Ciężkie serwery czatu głosowego Discord prawie nie wysyłał wiadomości. Oznacza to, że co kilka dni wysyłali jedną lub dwie wiadomości. W ciągu roku serwer tego typu prawdopodobnie nie osiągnie kamienia milowego 1000 wiadomości. Problem w tym, że nawet przy tak małej liczbie wiadomości dane te są trudniejsze do dostarczenia użytkownikom. Proste zwrócenie użytkownikowi 50 wiadomości może spowodować wiele losowych wyszukiwań dysku, co spowoduje opróżnienie pamięci podręcznej dysku.
  • Ciężkie prywatne serwery czatu tekstowego Discord wysyłają przyzwoitą liczbę wiadomości, łatwo mieszczących się w zakresie od 100 000 do 1 miliona wiadomości rocznie. Zwykle proszą tylko o najnowsze dane. Problem polega na tym, że te serwery mają zwykle mniej niż 100 członków, więc szybkość żądań danych jest niska i jest mało prawdopodobne, aby znajdowała się w pamięci podręcznej dysku.
  • Duże publiczne serwery Discord wysyłają dużo wiadomości. Tysiące członków wysyła tysiące wiadomości dziennie. Z łatwością wpisuje się miliony wiadomości rocznie. Prawie zawsze proszą o wiadomości wysłane w ciągu ostatniej godziny i zdarza się to często. Dlatego dane zwykle znajdują się w pamięci podręcznej dysku.
  • Wiedzieliśmy, że w nadchodzącym roku użytkownicy będą mieli jeszcze więcej sposobów na generowanie losowych odczytów: możliwość przeglądania swoich wzmianek z ostatnich 30 dni, a następnie przeskakiwania do tego momentu w historii, przeglądania i przechodzenia do przyklejonych postów oraz pełnego tekstu Szukaj. Wszystko to oznacza jeszcze więcej losowych odczytów!
Następnie określiliśmy nasze wymagania:
  • Skalowalność liniowa- Nie chcemy zmieniać decyzji później ani ręcznie przenosić danych do innego fragmentu.
  • Automatyczne przełączanie awaryjne- Lubimy spać w nocy i sprawić, by Discord był jak najbardziej samouzdrawiający.
  • Małe wsparcie- Powinien działać, gdy tylko go zainstalujemy. Musimy tylko dodawać więcej węzłów w miarę wzrostu danych.
  • Sprawdzony w pracy Uwielbiamy próbować nowych technologii, ale nie za nowych.
  • Przewidywalna wydajność- Wiadomości są do nas wysyłane, jeśli czas odpowiedzi API przekracza 80ms w 95% przypadków. Nie chcemy też stawiać czoła konieczności buforowania wiadomości w Redis lub Memcached.
  • Nie do przechowywania obiektów blob- Pisanie tysięcy wiadomości na sekundę nie zadziała dobrze, jeśli będziemy musieli ciągle deserializować obiekty blob i dołączać do nich dane.
  • otwarte źródło- Wierzymy, że kontrolujemy własne przeznaczenie i nie chcemy zależeć od firmy zewnętrznej.
Cassandra okazała się jedynym DBMS, który spełnił wszystkie nasze wymagania. Możemy po prostu dodawać węzły podczas skalowania i radzimy sobie z utratą węzłów bez żadnego wpływu na aplikację. Duże firmy, takie jak Netflix i Apple, mają tysiące węzłów Cassandra. Powiązane dane są przechowywane obok siebie na dysku, co zapewnia minimalną liczbę wyszukiwań i łatwą dystrybucję w klastrze. Jest utrzymywany przez DataStax, ale rozpowszechniany w sposób otwarty. kod źródłowy i siły społeczne.

Po dokonaniu wyboru trzeba było udowodnić, że był naprawdę usprawiedliwiony.

Modelowanie danych

Najlepszym sposobem na opisanie Cassandry początkującemu jest akronim KKV. Dwie litery „K” zawierają klucz podstawowy. Pierwsze „K” to klucz partycji. Pomaga określić, w którym węźle znajdują się dane i gdzie je znaleźć na dysku. Wewnątrz sekcji znajduje się wiele wierszy, a konkretny wiersz w sekcji jest określany przez drugie „K” — klucz grupowania. Działa jako klucz podstawowy w partycji i definiuje sposób sortowania wierszy. Możesz myśleć o sekcji jak o uporządkowanym słowniku. Wszystkie te cechy połączone pozwalają na bardzo wydajne modelowanie danych.

Pamiętasz, że wiadomości w MongoDB były indeksowane za pomocą channel_id i created_at ? channel_id stał się kluczem partycji, ponieważ wszystkie komunikaty działają w kanale, ale created_at nie zapewnia dobrego klucza klastrowania, ponieważ w tym samym czasie można utworzyć dwa komunikaty. Na szczęście każdy identyfikator na Discordzie jest faktycznie tworzony w Snowflake, co oznacza, że ​​jest posortowany chronologicznie. Więc mogą być użyte. Kluczem podstawowym stało się (ID_kanału, id_wiadomości), gdzie identyfikator_wiadomości to płatek śniegu. Oznacza to, że po załadowaniu kanału możemy wskazać Cassandrze dokładny zakres, w którym ma szukać wiadomości.

Oto uproszczony schemat naszej tabeli komunikatów (pomija około 10 kolumn).

CREATE TABLE wiadomości (channel_id bigint, message_id bigint, author_id bigint, content text, PRIMARY KEY (channel_id, message_id)) WITH CLUSTERING ORDER BY (message_id DESC);
Chociaż schematy Cassandry są podobne do schematów relacyjnych baz danych, można je łatwo zmienić bez tymczasowego wpływu na wydajność. Wykorzystaliśmy to, co najlepsze z magazynu obiektów blob i magazynu relacyjnego.

Gdy tylko rozpoczęło się importowanie istniejących wiadomości do Cassandry, natychmiast zobaczyliśmy ostrzeżenia w dziennikach, że znaleziono partycje większe niż 100 MB. Tak?! W końcu Cassandra twierdzi, że obsługuje partycje 2 GB! Najwyraźniej sama możliwość nie oznacza, że ​​należy to zrobić. Duże partycje mocno obciążają odśmiecacz w Cassandrze podczas kompaktowania, rozszerzania klastra itp. Posiadanie dużej partycji oznacza również, że zawarte w niej dane nie mogą być dystrybuowane w klastrze. Stało się jasne, że będziemy musieli jakoś ograniczyć rozmiar partycji, ponieważ niektóre kanały Discorda mogą istnieć latami i stale rosnąć.

Postanowiliśmy rozłożyć nasze wiadomości w blokach (wiaderkach) według czasu. Przyjrzeliśmy się największym kanałom w Discordzie i ustaliliśmy, że jeśli przechowujemy wiadomości w blokach po około 10 dni, bez problemu zmieścimy się w limicie 100 MB. Bloki należy uzyskać z identyfikatora wiadomości lub znacznika czasu.

DISCORD_EPOCH = 142007040000 BUCKET_SIZE = 1000 * 60 * 60 * 24 * 10 def make_bucket(snowflake): jeśli płatek śniegu to None: timestamp = int(time.time() * 1000) - DISCORD_EPOCH else: # Kiedy tworzony jest płatek śniegu, zawiera on liczba # sekund od DISCORD_EPOCH. timestamp = snowflake_id >> 22 return int(timestamp / BUCKET_SIZE) def make_buckets(start_id, end_id=None): return range(make_bucket(start_id), make_bucket(end_id) + 1)
Klucze partycji Cassandra mogą być złożone, więc nasz nowy klucz podstawowy to ((id_kanału, zasobnik), identyfikator_wiadomości) .

CREATE TABLE wiadomości (identyfikator_kanału bigint, zasobnik int, identyfikator_wiadomości bigint, identyfikator_autora bigint, tekst treści, KLUCZ PODSTAWOWY ((id_kanału, zasobnik), identyfikator_wiadomości)) WITH CLUSTERING ORDER BY (message_id DESC);
Aby wyszukać najnowsze wiadomości na kanale, wygenerowaliśmy zakres bloków od bieżącego czasu do identyfikatora kanału (jest to również posortowane chronologicznie jak Płatek śniegu i musi być starsze niż pierwsza wiadomość). Następnie odpytujemy partycje sekwencyjnie, aż zbierzemy wystarczającą liczbę wiadomości. Minusem tej metody jest to, że czasami aktywne instancje Discord będą musiały odpytywać wiele różnych bloków, aby z czasem zebrać wystarczającą ilość wiadomości. W praktyce okazało się, że wszystko jest w porządku, ponieważ dla aktywnej instancji Discorda wiadomości jest zazwyczaj wystarczająca ilość w pierwszej sekcji, a większość z nich jest.

Import wiadomości do Cassandry przebiegł sprawnie i byliśmy gotowi do wypróbowania go w produkcji.

Ciężki start

wyjście nowy system produkcja jest zawsze przerażająca, dlatego warto ją przetestować bez wpływu na użytkowników. Skonfigurowaliśmy system tak, aby powielał operacje odczytu/zapisu w MongoDB i Cassandra.

Natychmiast po uruchomieniu, bug tracker pokazał błędy, że author_id było zero. Jak to może być zerowe? To pole jest wymagane!

Konsekwencja na końcu

Cassandra to system typów, to znaczy gwarantowana integralność poświęcona jest tutaj na rzecz dostępności, której generalnie chcieliśmy. Cassandra odradza czytanie przed zapisaniem (operacje odczytu są droższe), więc wszystko, co robi Cassandra, to aktualizacja i upsert, nawet jeśli dostępne są tylko niektóre kolumny. Możesz także pisać do dowolnego węzła, a on automatycznie rozwiąże konflikty za pomocą „ ostatni rekord wygrywa” dla każdej kolumny. Więc jak to na nas wpływa?


Przykład edycji/usuwania warunków wyścigu

W przypadku, gdy użytkownik edytował post, podczas gdy inny użytkownik usuwał ten sam post, otrzymalibyśmy wiersz z całkowicie brakującymi danymi, z wyjątkiem klucza podstawowego i tekstu, ponieważ Cassandra rejestruje tylko aktualizacje i wstawki. Istnieją dwa możliwe rozwiązania tego problemu:

  1. Odpisz całą wiadomość podczas edytowania wiadomości. Wtedy istnieje możliwość zmartwychwstania usunięte wiadomości i dodaje szanse na konflikty dla równoczesnych wpisów w innych kolumnach.
  2. Zidentyfikuj uszkodzoną wiadomość i usuń ją z bazy danych.
Wybraliśmy drugą opcję, definiując wymaganą kolumnę (w tym przypadku author_id) i usuwając post, jeśli jest pusty.

Podczas rozwiązywania tego problemu zauważyliśmy, że byliśmy dość nieefektywni przy operacjach zapisu. Ponieważ Cassandra jest ostatecznie spójna, nie może po prostu natychmiast usunąć danych. Musi replikować usunięcia do innych węzłów i należy to zrobić, nawet jeśli węzły są tymczasowo niedostępne. Cassandra radzi sobie z tym, utożsamiając usunięcie z osobliwą formą zapisu zwaną „nagrobkiem”. Podczas operacji odczytu po prostu pomija „nagrobki”, które napotyka po drodze. Żywotność „nagrobków” jest konfigurowalna (domyślnie 10 dni) i są one trwale usuwane podczas zagęszczania podłoża, jeśli termin upłynął.

Usunięcie kolumny i zapisanie zera w kolumnie to dokładnie to samo. W obu przypadkach tworzony jest „nagrobek”. Ponieważ wszystkie zapisy w Cassandrze są aktualizacjami i wstawkami, tworzysz nagrobek, nawet jeśli początkowo piszesz zero. W praktyce nasz pełny układ wiadomości składał się z 16 kolumn, ale średnia wiadomość miała ustawione tylko 4 wartości. Nagraliśmy 12 nagrobków w Cassandrze, zwykle bez powodu. Rozwiązanie problemu było proste: zapisz do bazy tylko wartości niezerowe.

Wydajność

Wiadomo, że Cassandra szybciej zapisuje niż odczytuje, i dokładnie to zaobserwowaliśmy. Operacje zapisu wystąpiły w przedziale krótszym niż milisekunda, a operacje odczytu — mniej niż 5 milisekund. Wskaźniki te były obserwowane niezależnie od rodzaju pozyskanych danych. Wydajność pozostała niezmieniona przez cały tydzień testów. Nic dziwnego, dostaliśmy dokładnie to, czego się spodziewaliśmy.


Opóźnienie odczytu/zapisu, zgodnie z danymi z dziennika

Zgodnie z szybką i niezawodną wydajnością odczytu, oto przykład przeskoku do wiadomości sprzed roku w kanale z milionami wiadomości:

Wielka niespodzianka

Wszystko poszło gładko, więc wprowadziliśmy Cassandrę jako naszą główną bazę danych i wycofaliśmy MongoDB z użytku w ciągu tygodnia. Kontynuowała pracę bezbłędnie… przez około 6 miesięcy, aż pewnego dnia przestała odpowiadać.

Zauważyliśmy, że Cassandra zatrzymywała się bez przerwy na 10 sekund podczas zbierania śmieci, ale nie mogliśmy zrozumieć, dlaczego. Zaczęliśmy kopać i znaleźliśmy kanał Discord, którego załadowanie zajęło 20 sekund. Winowajcą był publiczny serwer Discord na subreddicie Puzzles & Dragons. Ponieważ jest publiczny, dołączyliśmy do oglądania. Ku naszemu zaskoczeniu na kanale pojawiła się tylko jedna wiadomość. W tym momencie okazało się, że usunęli miliony wiadomości za pośrednictwem naszych interfejsów API, pozostawiając tylko jedną wiadomość na kanał.

Jeśli czytałeś uważnie, pamiętaj, jak Cassandra radzi sobie z usuwaniem za pomocą „nagrobków” (wspomnianych w rozdziale „Ostateczna spójność”). Kiedy użytkownik ładuje ten kanał, mimo że jest tylko jedna wiadomość, Cassandra musi sprawnie przeskanować miliony nagrobków wiadomości. Następnie generuje śmieci szybciej niż JVM może je zebrać.

Rozwiązaliśmy ten problem w następujący sposób:

  • Skrócono żywotność nagrobków z 10 dni do 2 dni, ponieważ każdego wieczoru przeprowadzamy naprawę Cassandry (proces anty-entropii) w naszym klastrze wiadomości.
  • Zmieniono kod żądania, aby śledzić puste bloki w kanale i unikać ich w przyszłości. Oznacza to, że jeśli użytkownik ponownie zainicjuje to żądanie, w najgorszym przypadku Cassandra zeskanuje tylko ostatni blok.

Przyszły

W ten moment mamy klaster z 12 węzłami działający ze współczynnikiem powtórzeń równym 3 i w razie potrzeby będziemy dodawać kolejne węzły Cassandra. Wierzymy, że to podejście działa na dłuższą metę, ale wraz z rozwojem Discord wygląda na odległą przyszłość, w której musimy zapisywać miliardy wiadomości dziennie. Netflix i Apple prowadzą klastry z setkami węzłów, więc na razie nie mamy się czym martwić. Chciałbym jednak mieć kilka pomysłów w rezerwie.

Bliska przyszłość

  • Uaktualnij nasz klaster wiadomości z Cassandra 2 do Cassandra 3. Nowy format przechowywania w Cassandra 3 może zmniejszyć ilość miejsca na dane o ponad 50%.
  • Nowsze wersje Cassandry lepiej obsługują więcej danych w każdym węźle. W każdym z nich przechowujemy obecnie około 1 TB skompresowanych danych. Uważamy, że zmniejszenie liczby węzłów w klastrze przez zwiększenie tego limitu do 2 TB jest bezpieczne.

daleka przyszłość

  • Learn Scylla to DBMS kompatybilny z Cassandra napisany w C++. Podczas normalnej pracy nasze węzły Cassandra faktycznie zużywają trochę zasobów procesora, jednak poza godzinami szczytu podczas naprawy Cassandra (proces kontrentropii) są one dość zależne od procesora, a czas naprawy wzrasta w zależności od ilości zapisanych danych od ostatniej naprawy. Scylla obiecuje znacznie zwiększyć szybkość napraw.
  • Utwórz system do archiwizowania nieużywanych plików danych w Google Cloud Storage i przesyłania ich z powrotem na żądanie. Chcemy tego uniknąć i uważamy, że nie musimy tego robić.

Wniosek

Od przejścia do Cassandry minął ponad rok, a mimo to "Wielka niespodzianka" to była spokojna kąpiel. Przeszliśmy od ponad 100 milionów wiadomości łącznie do ponad 120 milionów wiadomości dziennie, zachowując przy tym wydajność i stabilność.

Ze względu na sukces tego projektu od tego czasu przenieśliśmy wszystkie nasze inne dane z produkcji do Cassandry, również z sukcesem.

W dalszej części tego artykułu dowiemy się, jak przeprowadzamy wyszukiwanie pełnotekstowe w miliardach wiadomości.

Nadal nie mamy dedykowanych inżynierów DevOps (tylko czterech inżynierów zaplecza), więc naprawdę fajnie jest mieć system, o który nie musisz się martwić. Zatrudniamy, więc skontaktuj się, jeśli te łamigłówki połaskoczą Twoją wyobraźnię.

Tagi: Dodaj tagi