Haruskah saya menggunakan soket web Mosquitto atau menghubungkan klien secara langsung?

11

Menurut blog ini , Mosquitto (broker MQTT) sekarang mendukung koneksi ke klien melalui soket web. Artikel blog tampaknya mengisyaratkan bahwa soket web lebih berguna untuk aplikasi peramban, sejak web browser tidak mendukung soket TCP yang tepat (belum), meskipun protokol web socket yang didukung oleh mayoritas browser modern.

Jika saya hanya memiliki berbagai klien dalam jaringan (mis. Sensor dan aktuator berbasis mikrokontroler seperti Raspberry Pis), akankah ada keuntungan menggunakan soket web melalui koneksi TCP langsung? Apakah overhead protokol protokol web hanya layak ketika Anda berkomunikasi dengan browser?

Aurora0001
sumber
1
Bisakah Anda memberi tahu kami jika Anda mengode semua jaringan? Yaitu semua node atau klien dan server? Atau jika Anda harus berinteraksi dengan perangkat lunak orang lain? Sepertinya Anda mungkin hanya mengkode klien, tapi saya tidak yakin
Mawg mengatakan mengembalikan Monica
1
@Mawg server akan menjadi broker Mosquitto MQTT, tetapi saya dapat memilih protokol mana yang saya gunakan untuk semua klien (dan Mosquitto menawarkan soket web dan koneksi TCP langsung, itulah sebabnya saya bertanya).
Aurora0001
1
Saya pikir ada beberapa kebingungan di sini. Saya kira apa yang dimaksud @ Auroa0001 dengan "TCP langsung" menggunakan MQTT melalui TCP daripada MQTT melalui Websockets (... lebih TCP). Dalam kedua kasus ada perpustakaan yang tersedia sehingga tidak perlu menulis kode apa pun untuk soket.
tepat
@ralight ya, itu memang maksud saya ketika mengajukan pertanyaan. Jawabannya agak tersesat, tampaknya.
Aurora0001

Jawaban:

7

Pertanyaan di sini tampaknya adalah "haruskah saya menggunakan MQTT melalui TCP, atau menggunakan MQTT di soket web (yang juga berlaku untuk TCP)?" Dengan kata lain, apakah "merangkum MQTT dalam protokol websockets adalah ide yang bagus?"

Ini (hampir) sepenuhnya tergantung pada aplikasi Anda dan apakah Anda memerlukan dukungan soket web - mungkin untuk menggunakan pesan di browser atau untuk alasan firewall. Jika Anda tidak dapat membuat server Anda dapat diakses pada port 1883 atau lebih baik 8883 untuk MQTT murni, maka soket web mungkin merupakan pilihan terbaik Anda.

Websockets memang membutuhkan bandwidth ekstra, tetapi apakah itu penting bagi Anda adalah sesuatu yang hanya bisa Anda jawab.

Perlu juga dicatat bahwa dalam versi Mosquitto saat ini, websockets tidak berfungsi sebaik yang mereka bisa sehingga ada latensi tambahan saat mengirim / menerima pesan websockets. Itu adalah sesuatu yang tidak akan menjadi masalah di versi masa depan.

ralight
sumber
7

Ketika Anda berkomunikasi hanya di dalam jaringan Anda ( intranet ), menggunakan TCP murni akan baik-baik saja. Tetapi jika Anda harus terhubung ke server lain, masalah akan muncul.

Karena sebagian besar server modern tidak memungkinkan klien untuk terhubung melalui port acak. Mereka hanya mengizinkan beberapa port khusus untuk terhubung. Itu saja. Karenanya jika Anda harus terhubung ke server lain, lebih baik menggunakan websocket daripada koneksi TCP murni.

Jika Anda mempertimbangkan overhead, itu tidak jauh lebih besar. Anda dapat merujuk artikel ini , jika Anda ingin tahu lebih banyak tentang overhead websocket.

Menurut pendapat pribadi saya, lebih baik menggunakan websocket selalu, kecuali Anda memiliki beberapa masalah serius.

IniG
sumber
2
Kesalahan, TCP, dan soket web adalah protokol: tools.ietf.org/html/rfc6455 , selanjutnya TCP IS merupakan soket pada level rendah.
Goufalite
@ ThisaruGuruge terima kasih atas jawaban Anda - dalam skenario saya dalam pertanyaan saya kira Anda akan memilih TCP dari soket web berdasarkan jawaban Anda? Terutama karena soket web tampaknya terutama didukung oleh browser, jadi ada kode overhead yang perlu menggunakan soket web di soket TCP.
Aurora0001
1
"sebagian besar server modern tidak mengizinkan klien untuk terhubung melalui port acak" - server dapat memilih port mana yang akan diikat ( man7.org/linux/man-pages/man2/bind.2.html ), ditambah firewall selanjutnya batasi itu. NAMUN, saya tidak setuju ketika Anda mengatakan "jika Anda harus terhubung ke server lain, masalah akan muncul". Ubah kata itu menjadi " mungkin timbul". Bahkan kemudian, itu masalah konfigurasi, yang mungkin membuat websockets lebih mudah daripada soket mentah.
Mawg mengatakan mengembalikan Monica
6

tl; dr - selalu lebih suka perpustakaan gratis untuk mengkodekannya sendiri (kecuali jika Anda memiliki persyaratan ekstrim)


Haruskah saya menggunakan soket web Mosquitto atau menghubungkan klien secara langsung?

Berapa lama seutas tali? (YMMV)

Saya hanya bisa berbicara secara umum, tapi saya selalu lebih suka perpustakaan pembungkus untuk soket mentah (atau, memang, untuk pengkodean apa pun yang bisa saya dapatkan secara gratis dari perpustakaan).

Mereka membuat pengkodean lebih sederhana dan lebih sedikit kesalahan. Mereka menangani banyak pemeliharaan rumah dan penanganan kesalahan, yang merupakan kode yang harus Anda tulis dan debug sendiri, di mana sebagai perpustakaan secara umum telah ditinjau dan diuji dengan baik dan sedang digunakan oleh ribuan orang lain, yang semuanya akan melaporkan / memperbaiki bug untuk Anda.

Selain itu, kode ini lebih sedikit untuk Anda pertahankan (dan, mungkin, port), yang berarti lebih banyak waktu untuk mengembangkan, menguji & memoles aplikasi Anda, atau beralih ke yang berikutnya.

Satu-satunya overhead adalah panggilan fungsi, jika Anda menerima bahwa semua kebaikan pustakawan (penanganan kesalahan, pemeliharaan selang & sejenisnya) adalah sesuatu yang harus Anda kode sendiri untuk mendapatkan perangkat lunak yang baik dan stabil.

Jika Anda khawatir tentang kinerja, cukup profil. Tapi, kecuali soket Anda aktif ratusan kali per detik, saya bahkan tidak mau repot.

Mawg berkata mengembalikan Monica
sumber
Ya, ada perpustakaan gratis untuk koneksi TCP dan koneksi socket (web), dan keduanya membutuhkan event "pesan yang diterima".
Goufalite
2
OP ingin tahu apakah lebih baik menggunakan TCP atau websockets untuk efisiensi , dan Anda mengatakan "gunakan perpustakaan abstraksi sehingga Anda tidak akan repot". Tentu, tapi yang mana? Dalam C # Ada perpustakaan TcpClient di System.Net.Sockets (well, well ...) dan perpustakaan websocket dalam paket nuget (WebSocketSharp). Saya setuju bahwa ada perpustakaan MQTT generik untuk semua bahasa tetapi OP ingin memiliki kontrol untuk memilih protokol mana yang harus digunakan.
Goufalite