Tworzę rodzaj systemu kolejek zadań w tle z MongoDB jako magazynem danych. Jak „nasłuchiwać” wstawek do kolekcji MongoDB przed spawnowaniem pracowników w celu przetworzenia zadania? Czy muszę sondować co kilka sekund, aby zobaczyć, czy są jakieś zmiany od ostatniego razu, czy też jest jakiś sposób, w jaki mój skrypt może czekać na wstawienie? To projekt PHP, nad którym pracuję, ale nie wahaj się odpowiedzieć w Ruby lub agnostyce językowej.
200
Odpowiedzi:
To, o czym myślisz, przypomina dźwięki wyzwalające. MongoDB nie obsługuje żadnych wyzwalaczy, jednak niektóre osoby „rzuciły własne” za pomocą niektórych sztuczek. Kluczem tutaj jest oplog.
Po uruchomieniu MongoDB w zestawie repliki wszystkie akcje MongoDB są rejestrowane w dzienniku operacji (znanym jako oplog). Oplog to w zasadzie tylko bieżąca lista modyfikacji wprowadzonych do danych. Repliki Ustawia funkcję, nasłuchując zmian w tym oplogu, a następnie stosując zmiany lokalnie.
Czy to brzmi znajomo?
Nie mogę tutaj szczegółowo opisać całego procesu, jest to kilka stron dokumentacji, ale potrzebne narzędzia są dostępne.
Najpierw kilka wpisów na oplogu - Krótki opis - Układ
local
kolekcji (która zawiera oplog)Będziesz także chciał wykorzystać kursory, które można dostosowywać . Umożliwi to słuchanie zmian zamiast odpytywania ich. Pamiętaj, że replikacja korzysta z kursorów dostosowanych do potrzeb, więc jest to obsługiwana funkcja.
źródło
--replSet
opcją, która utworzy / wypełnioplog
. Nawet bez wtórnego. Jest to zdecydowanie jedyny sposób na „słuchanie” zmian w bazie danych.MongoDB ma co nazywa
capped collections
itailable cursors
że pozwala MongoDB danych Prześlij na słuchaczy.A
capped collection
to w zasadzie kolekcja o ustalonym rozmiarze i umożliwiająca tylko wstawianie. Oto jak wyglądałoby utworzenie takiego:MongoDB Tailable cursors ( oryginalny post Jonathan H. Wage )
Rubin
PHP
Python (autor: Robert Stewart)
Perl (przez Max )
Dodatkowe zasoby:
Samouczek Ruby / Node.js, który przeprowadzi cię przez proces tworzenia aplikacji, która nasłuchuje wstawień w kolekcji z ograniczeniem MongoDB.
Artykuł mówi bardziej szczegółowo o kursorach dostosowanych do potrzeb.
Przykłady użycia kursorów dostosowywanych przez PHP, Ruby, Python i Perl.
źródło
Od wersji MongoDB 3.6 pojawi się nowy interfejs API powiadomień o nazwie Zmień strumienie, którego można użyć do tego celu. Zobacz ten post na blogu jako przykład . Przykład z tego:
źródło
Sprawdź to: Zmień strumienie
10 stycznia 2018 r. - wersja 3.6
* EDYCJA: Napisałem artykuł o tym, jak to zrobić https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76
https://docs.mongodb.com/v3.6/changeStreams/
Jest nowy w Mongodb 3.6 https://docs.mongodb.com/manual/release-notes/3.6/ 2018/01/10
Aby użyć changeStreams, baza danych musi być zestawem replikacji
Twoja baza danych będzie domyślnie „ samodzielna ”.
Poniższy przykład jest praktyczną aplikacją, w jaki sposób możesz tego użyć.
* Specjalnie dla węzła.
Przydatne linki:
https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set
https://docs.mongodb.com/manual/tutorial/change-streams-example
https://docs.mongodb.com/v3.6/tutorial/change-streams-example
http://plusnconsulting.com/post/MongoDB-Change-Streams
źródło
Wersja 3.6 MongoDB zawiera teraz strumienie zmian, które są zasadniczo interfejsem API nad OpLog, umożliwiając przypadki użycia podobne do wyzwalaczy / powiadomień.
Oto link do przykładu Java: http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
Przykład NodeJS może wyglądać mniej więcej tak:
źródło
Alternatywnie można użyć standardowej metody Mongo FindAndUpdate, aw ramach wywołania zwrotnego wywołać zdarzenie EventEmitter (w węźle), gdy wywołanie zwrotne jest uruchomione.
Wszelkie inne części aplikacji lub architektury nasłuchujące tego wydarzenia zostaną powiadomione o aktualizacji, a także wszelkie odpowiednie dane tam przesłane. To naprawdę prosty sposób na otrzymywanie powiadomień z Mongo.
źródło
Wiele z tych odpowiedzi da tylko nowe rekordy, a nie aktualizacje i / lub są wyjątkowo nieefektywne
Jedynym niezawodnym i wydajnym sposobem na to jest utworzenie dostosowanego kursora w lokalnej kolekcji db: oplog.rs, aby uzyskać WSZYSTKIE zmiany w MongoDB i zrobić to, co chcesz. (MongoDB robi to wewnętrznie mniej więcej w celu obsługi replikacji!)
Wyjaśnienie, co zawiera oplog: https://www.compose.com/articles/the-mongodb-oplog-and-node-js/
Przykład biblioteki Node.js, która udostępnia API wokół tego, co można zrobić z oplogiem: https://github.com/cayasso/mongo-oplog
źródło
Dostępny jest niesamowity zestaw usług o nazwie MongoDB Stitch . Sprawdź funkcje / wyzwalacze ściegów . Uwaga: jest to usługa płatna w chmurze (AWS). W twoim przypadku na wstawce możesz wywołać niestandardową funkcję napisaną w javascript.
źródło
Istnieje działający przykład Java, który można znaleźć tutaj .
Kluczem są OPCJE QUERY podane tutaj .
Możesz także zmienić zapytanie, jeśli nie musisz ładować wszystkich danych za każdym razem.
źródło
W rzeczywistości, zamiast oglądać dane wyjściowe, dlaczego nie otrzymujesz powiadomienia, gdy wstawiane jest coś nowego za pomocą oprogramowania pośredniego dostarczonego przez schemat mangusty
Możesz złapać zdarzenie wstawienia nowego dokumentu i zrobić coś po tym wstawieniu
źródło
Po wersji 3.6 można korzystać z bazy danych następujące typy wyzwalaczy:
Zaloguj się do swojego konta Atlas, wybierz
Triggers
interfejs i dodaj nowy wyzwalacz:Rozwiń każdą sekcję, aby uzyskać więcej ustawień lub szczegółów.
źródło