Jangan berlangganan # - jadi bagaimana cara membuang semua pesan ke basis data dengan Mosquitto?

16

Daftar blog HiveMQ di bawah "praktik terbaik" untuk tidak berlangganan wildcard multi-level ketika mencoba untuk membuang semua pesan ke database. Mereka mengklaim bahwa klien yang berlangganan mungkin tidak dapat mengikuti banyak pesan dan mengusulkan untuk menggunakan plugin broker untuk langsung menghubungkan ke aliran pesan saja.

Kadang-kadang perlu untuk berlangganan semua pesan, yang ditransfer melalui broker, misalnya ketika mempertahankan semuanya ke dalam database. Ini tidak boleh dilakukan dengan menggunakan klien MQTT dan berlangganan wildcard multi level. Alasannya adalah bahwa seringkali klien yang berlangganan tidak dapat memproses pemuatan pesan yang datang padanya. Apalagi jika Anda memiliki throughput yang besar. Solusi yang kami sarankan adalah menerapkan ekstensi di broker MQTT, misalnya sistem plugin HiveMQ memungkinkan Anda untuk terhubung ke perilaku HiveMQ dan menambahkan rutin asinkron untuk memproses setiap pesan yang masuk dan meneruskannya ke database.

Apakah disana juga?

  • sistem serupa (ekstensi / plugin) untuk broker mosquitto,
  • metode lain yang disarankan yang berfungsi dengan mosquitto, atau
  • bukti yang masuk akal bahwa pendekatan ini sama sekali tidak perlu, yaitu bahwa klien yang berlangganan #dapat melakukannya dengan baik?

/programming//q/31584613/3984613 tidak membahas pertanyaan ini secara mendalam.

Ghanima
sumber

Jawaban:

12

sistem serupa (ekstensi / plugin) untuk broker mosquitto

Sejauh yang saya tahu tidak ada plugin / ekstensi untuk broker mosquitto (setidaknya tidak ada satu opensource)

metode lain yang direkomendasikan yang bekerja dengan mosquitto

Ya saya bisa katakan per pengalaman saya dengan Mosquitto broker dan AWS IoT, Anda bisa langsung berlangganan '#'

Bukti yang masuk akal

Setelah melihat pertanyaan ini, saya agak penasaran untuk mengetahui batas throughput dan untuk mengetahui apakah ada kebutuhan untuk sistem ekstensi. Jadi saya mengatur yang berikut:

  • 100 AWS Lambda berfungsi sebagai perangkat akhir virtual untuk mengirim beberapa data acak ke Gateway (misalnya EC2, t2.nano500MB RAM)
  • Setiap 60 detik fungsi dipicu untuk menerbitkan data ke gateway ke berbagai topik (lambdatoec2 / {VariableTopicNumberFrom1-100}
  • Contoh EC2 menjalankan Mosquitto 1.4.10

Sampai sekarang, saya melihat bahwa tidak ada masalah berlangganan # tanpa sistem ekstensi. Tetapi sekali lagi saya masih harus menguji beberapa skenario kasus tepi (saya akan memperbarui jawaban setelah saya akan menguji mereka).

bravokeyl
sumber
Jawaban "benar" adalah pengujian. Jika dapat diperlihatkan bahwa kinerja sistem Anda terkena dampak buruk dengan menambahkan pelanggan ke #, kemudian konfigurasikan kembali pialang untuk melarang # langganan. Saya membatalkan jawaban ini karena @bravokeyl melakukan hal itu.
John Deters
11

Diskusi pada milis openHAB ini tampaknya menyarankan tidak ada masalah dengan menggunakan #sebagai berlangganan untuk menerima semua pesan:

Sementara pemecahan masalah perangkat MQTT, saya sadar bahwa kadang-kadang saya berharap saya bisa melihat semua pesan MQTT yang dilihat broker Mosquitto, bukan pada topik tertentu. Apakah ada cara untuk melakukan ini?

Seseorang menjawab pertanyaan ini untuk Anda di daftar Mosquitto; gunakan wildcard. (#)

Pertanyaan Stack Overflow ini juga menyarankan metode yang sama:

Berlangganan ke # memberi Anda berlangganan semua kecuali untuk topik yang dimulai dengan $ (ini biasanya adalah topik kontrol).

Lebih baik untuk mengetahui apa yang Anda berlangganan terlebih dahulu, tentu saja, dan perhatikan bahwa beberapa konfigurasi broker mungkin melarang berlangganan # secara eksplisit.

Seperti yang ditunjukkan oleh Bence Kaulics , spesifikasi memang menyatakan yang #valid:

Komentar non normatif

  • "#" Valid dan akan menerima setiap Pesan Aplikasi

Jujur, saya membantah apakah klaim asli benar-benar masuk akal:

Alasannya adalah bahwa seringkali klien yang berlangganan tidak dapat memproses pemuatan pesan yang datang padanya.

Jika itu masalahnya, bagaimana cara broker menangani pesan? Selama klien Anda memiliki karakteristik kinerja yang mirip dengan broker, saya sangat meragukan kemungkinan untuk membanjiri klien, karena tingkat lalu lintas itu juga akan membanjiri broker dan menyebabkannya macet terlebih dahulu.

Singkatnya, klaim HiveMQ tampaknya tidak didukung oleh banyak bukti dari sumber lain dan, ketika Anda mempertimbangkan apa artinya sebenarnya, itu tampaknya tidak terlalu logis.

Aurora0001
sumber
10

Saya pikir penting untuk mempertimbangkan bahwa ada banyak kasus penggunaan yang berbeda untuk broker MQTT, seperti halnya perangkat lunak apa pun.

Menangani pesan obrolan untuk satu miliar pengguna (banyak pengguna, tingkat pesan yang relatif rendah per pengguna) berbeda dengan sistem dengan sedikit klien tetapi tingkat pesan tinggi, dan keduanya berbeda dengan sistem otomasi rumah (beberapa klien, laju pesan rendah) .

HiveMQ sedang memikirkan aplikasi tingkat pesan / klien yang sangat tinggi - dalam hal ini kemampuan broker hampir pasti jauh melebihi klien.

Jika Anda ingin berlangganan #di sistem otomasi rumah Anda maka itu benar-benar tidak menyebabkan masalah. Anda dapat memeriksa dan melihat apakah broker menggunakan CPU berlebih dalam hal apa pun.

Seperti pada jawaban lain, berlangganan #akan memberi Anda semua topik 'normal', yaitu apa pun yang tidak dimulai dengan a $. Saya menafsirkan spek tersebut dengan mengatakan bahwa setiap topik yang dimulai dengan $keseluruhan pohon itu sendiri terpisah, jadi Anda harus berlangganan $SYS/#, $whatever/#untuk mendapatkan semuanya . Anda kemungkinan besar tidak mau melakukan itu untuk aplikasi normal.

ralight
sumber