Saya membuat semacam sistem antrian pekerjaan latar belakang dengan MongoDB sebagai penyimpan data. Bagaimana saya bisa "mendengarkan" untuk memasukkan koleksi MongoDB sebelum menelurkan pekerja untuk memproses pekerjaan? Apakah saya perlu melakukan polling setiap beberapa detik untuk melihat apakah ada perubahan dari terakhir kali, atau apakah ada cara agar skrip saya dapat menunggu sampai terjadi insert? Ini adalah proyek PHP yang sedang saya kerjakan, tetapi jangan ragu untuk menjawab dalam bahasa Ruby atau bahasa agnostik.
200
Jawaban:
Apa yang Anda pikirkan tentang pemicu suara sangat mirip. MongoDB tidak memiliki dukungan untuk pemicu, namun beberapa orang telah "menggulung sendiri" menggunakan beberapa trik. Kuncinya di sini adalah oplog.
Saat Anda menjalankan MongoDB dalam Kumpulan Replika, semua tindakan MongoDB dicatat ke log operasi (dikenal sebagai oplog). Oplog pada dasarnya hanyalah daftar modifikasi yang dibuat untuk data. Set Replika berfungsi dengan mendengarkan perubahan pada oplog ini dan kemudian menerapkan perubahan secara lokal.
Apakah ini terdengar familier?
Saya tidak dapat merinci seluruh proses di sini, ini beberapa halaman dokumentasi, tetapi alat yang Anda butuhkan tersedia.
Pertama beberapa artikel di oplog - Deskripsi singkat - Layout
local
koleksi (yang berisi oplog)Anda juga ingin memanfaatkan kursor yang tersedia . Ini akan memberi Anda cara untuk mendengarkan perubahan alih-alih memilihnya. Perhatikan bahwa replikasi menggunakan kursor yang tersedia, jadi ini adalah fitur yang didukung.
sumber
--replSet
opsi dan itu akan membuat / mengisioplog
. Bahkan tanpa yang sekunder. Ini jelas merupakan satu-satunya cara untuk "mendengarkan" perubahan dalam DB.MongoDB memiliki apa yang disebut
capped collections
dantailable cursors
yang memungkinkan MongoDB untuk mendorong data ke pendengar.A
capped collection
pada dasarnya adalah kumpulan yang merupakan ukuran tetap dan hanya memungkinkan penyisipan. Seperti apa tampilannya membuatnya:Kursor MongoDB Tailable ( pos asli oleh Jonathan H. Wage )
Rubi
PHP
Python (oleh Robert Stewart)
Perl (oleh Max )
Sumber daya tambahan:
Ruby / Node.js Tutorial yang menuntun Anda melalui membuat aplikasi yang mendengarkan sisipan dalam koleksi yang dibatasi MongoDB.
Artikel yang membahas tentang kursor yang tersedia lebih detail.
Contoh PHP, Ruby, Python, dan Perl menggunakan kursor yang tersedia.
sumber
Sejak MongoDB 3.6 akan ada API pemberitahuan baru yang disebut Ubah Aliran yang dapat Anda gunakan untuk ini. Lihat posting blog ini sebagai contoh . Contoh dari itu:
sumber
Lihat ini: Ubah Aliran
10 Januari 2018 - Rilis 3.6
* EDIT: Saya menulis artikel tentang bagaimana melakukan ini https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76
https://docs.mongodb.com/v3.6/changeStreams/
Ini baru di mongodb 3.6 https://docs.mongodb.com/manual/release-notes/3.6/ 2018/01/10
Untuk menggunakan changeStreams , basis data harus berupa Replication Set
Database Anda akan menjadi " Standalone " secara default.
Berikut contoh adalah aplikasi praktis untuk bagaimana Anda dapat menggunakan ini.
* Khusus untuk Node.
Tautan yang berguna:
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
sumber
MongoDB versi 3.6 sekarang termasuk aliran perubahan yang pada dasarnya adalah API di atas OpLog memungkinkan untuk kasus penggunaan yang memicu / pemberitahuan-seperti.
Berikut ini tautan ke contoh Java: http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
Contoh NodeJS mungkin terlihat seperti:
sumber
Atau, Anda bisa menggunakan metode Mongo FindAndUpdate standar, dan dalam panggilan balik, jalankan acara EventEmitter (dalam Node) saat panggilan balik dijalankan.
Setiap bagian lain dari aplikasi atau arsitektur yang mendengarkan acara ini akan diberitahu tentang pembaruan, dan semua data yang relevan dikirim juga. Ini adalah cara yang sangat sederhana untuk mendapatkan notifikasi dari Mongo.
sumber
Banyak dari jawaban ini hanya akan memberi Anda catatan baru dan bukan pembaruan dan / atau sangat tidak efisien
Satu-satunya cara yang andal dan performan untuk melakukan ini adalah dengan membuat kursor yang tersedia pada koleksi db: oplog.rs lokal untuk mendapatkan SEMUA perubahan pada MongoDB dan lakukan sesuai keinginan Anda. (MongoDB bahkan melakukan ini secara internal kurang lebih untuk mendukung replikasi!)
Penjelasan tentang isi oplog: https://www.compose.com/articles/the-mongodb-oplog-and-node-js/
Contoh perpustakaan Node.js yang menyediakan API tentang apa yang tersedia untuk dilakukan dengan oplog: https://github.com/cayasso/mongo-oplog
sumber
Ada satu set layanan luar biasa yang tersedia yang disebut Stitch MongoDB . Lihatlah ke fungsi / pemicu tusuk . Perhatikan ini adalah layanan berbayar berbasis cloud (AWS). Dalam kasus Anda, pada sebuah sisipan, Anda dapat memanggil fungsi khusus yang ditulis dalam javascript.
sumber
Ada contoh java yang berfungsi yang dapat ditemukan di sini .
Kuncinya adalah PILIHAN QUERY yang diberikan di sini.
Anda juga dapat mengubah kueri temukan, jika Anda tidak perlu memuat semua data setiap saat.
sumber
Sebenarnya, alih-alih menonton output, mengapa Anda tidak mendapatkan pemberitahuan ketika sesuatu yang baru dimasukkan dengan menggunakan perangkat tengah yang disediakan oleh skema luwak
Anda dapat menangkap acara memasukkan dokumen baru dan melakukan sesuatu setelah penyisipan ini selesai
sumber
Setelah 3,6 orang diperbolehkan menggunakan basis data, basis data berikut ini memicu jenis:
Masuk ke akun Atlas Anda dan pilih
Triggers
antarmuka dan tambahkan pemicu baru:Luaskan setiap bagian untuk lebih banyak pengaturan atau detail.
sumber