Tôi nên sử dụng ổ cắm web của Mosquitto hoặc kết nối khách hàng trực tiếp?


11

Theo blog này , Mosquitto (nhà môi giới MQTT) hiện hỗ trợ kết nối với khách hàng qua các ổ cắm web. Bài viết trên blog dường như gợi ý rằng các socket web hữu ích hơn cho các ứng dụng trình duyệt, vì các trình duyệt web không hỗ trợ socket TCP thích hợp (mặc dù), mặc dù giao thức socket web được hỗ trợ bởi phần lớn các trình duyệt hiện đại.

Nếu tôi chỉ có nhiều máy khách khác nhau trong một mạng (ví dụ: cảm biến và bộ truyền động dựa trên bộ vi điều khiển như Raspberry Pis), liệu có bất kỳ lợi thế nào khi sử dụng ổ cắm web qua kết nối TCP trực tiếp không? Là chi phí chung của giao thức ổ cắm web chỉ có giá trị khi bạn giao tiếp với trình duyệt?


1
Bạn có thể vui lòng cho chúng tôi biết nếu bạn đang mã hóa tất cả các mạng? Tức là tất cả các nút hoặc cả máy khách và máy chủ? Hoặc nếu bạn phải tương tác với phần mềm của người khác? Nghe có vẻ như bạn chỉ có thể mã hóa các khách hàng, nhưng tôi không thể chắc chắn
Mawg nói rằng phục hồi Monica

1
@Mawg máy chủ sẽ là nhà môi giới Mosquitto MQTT, nhưng tôi có thể chọn giao thức nào tôi sử dụng cho tất cả các máy khách (và Mosquitto cung cấp cả ổ cắm web và kết nối TCP trực tiếp, đó là lý do tôi hỏi).
Aurora0001

1
Tôi nghĩ rằng có một số nhầm lẫn ở đây. Tôi đoán @ Auroa0001 có nghĩa là gì bởi "TCP trực tiếp" đang sử dụng MQTT qua TCP chứ không phải MQTT qua Websockets (... qua TCP). Trong cả hai trường hợp đều có thư viện nên không cần viết bất kỳ mã nào cho socket.
đánh giá

@ralight vâng, đó là ý định của tôi thực sự khi đặt câu hỏi. Các câu trả lời đã đi một chút lạc lối, có vẻ như.
Aurora0001

Câu trả lời:


7

Câu hỏi ở đây dường như là "tôi nên sử dụng MQTT trên TCP hay sử dụng MQTT trên websockets (cũng đi qua TCP)?" Nói cách khác, "đóng gói MQTT trong giao thức websockets là một ý tưởng tốt?"

Điều này (hầu như) hoàn toàn phụ thuộc vào ứng dụng của bạn và cho dù bạn cần hỗ trợ websockets - có thể để tiêu thụ thư trong trình duyệt hoặc vì lý do tường lửa. Nếu bạn không thể truy cập máy chủ của mình trên cổng 1883 hoặc 8883 tốt hơn cho MQTT thuần túy, thì websockets có thể là lựa chọn tốt nhất của bạn.

Websockets không yêu cầu thêm băng thông, nhưng liệu điều đó có quan trọng với bạn hay không là điều mà chỉ bạn mới có thể trả lời.

Cũng đáng lưu ý rằng trong các phiên bản hiện tại của Mosquitto, websockets không hoạt động tốt như chúng có thể có độ trễ thêm khi gửi / nhận tin nhắn websockets. Đó là điều không phải là một vấn đề trong các phiên bản trong tương lai.


7

Khi bạn chỉ liên lạc trong mạng của mình ( mạng nội bộ ), sử dụng TCP thuần sẽ ổn. Nhưng nếu bạn phải kết nối với máy chủ khác, vấn đề sẽ phát sinh.

Bởi vì hầu hết các máy chủ hiện đại không cho phép khách hàng kết nối thông qua các cổng ngẫu nhiên. Họ chỉ cho phép một số cổng chuyên dụng để kết nối. Đó là tất cả. Do đó, nếu bạn phải kết nối với máy chủ khác, tốt hơn là sử dụng websocket thay vì kết nối TCP thuần túy.

Nếu bạn đang xem xét chi phí, nó không lớn hơn nhiều . Bạn có thể tham khảo bài viết này , nếu bạn muốn biết thêm về chi phí của websocket.

Theo ý kiến ​​cá nhân của tôi, tốt hơn hết là sử dụng websocket luôn, ngoại trừ bạn có một số lo ngại nghiêm trọng.


2
Err, TCP và websockets là các giao thức: tools.ietf.org/html/rfc6455 , hơn nữa TCP IS là một socket ở mức thấp.
Goufalite

@ ThisaruGuruge cảm ơn câu trả lời của bạn - trong kịch bản của tôi trong câu hỏi tôi cho rằng bạn sẽ chọn TCP trên các ổ cắm web đánh giá bằng câu trả lời của bạn? Đặc biệt là các ổ cắm web dường như chủ yếu được hỗ trợ bởi các trình duyệt, do đó, cần có mã sử dụng các ổ cắm web trên các ổ cắm TCP.
Aurora0001

1
"hầu hết các máy chủ hiện đại không cho phép khách hàng kết nối thông qua các cổng ngẫu nhiên" - máy chủ có thể chọn cổng nào để liên kết với ( man7.org/linux/man-pages/man2/bind.2.html ), cộng với tường lửa có thể hạn chế hơn nữa TUY NHIÊN, tôi không đồng ý khi bạn nói "nếu bạn phải kết nối với máy chủ khác, vấn đề sẽ phát sinh". Viết lại rằng " có thể phát sinh". Ngay cả khi đó, vấn đề về cấu hình, websockets nào có thể sẽ dễ dàng hơn ổ cắm thô.
Mawg nói rằng phục hồi Monica

6

tl; dr - luôn thích các thư viện miễn phí tự mã hóa nó (trừ khi bạn có yêu cầu cao)


Tôi nên sử dụng ổ cắm web của Mosquitto hoặc kết nối khách hàng trực tiếp?

Bao lâu là một mảnh của chuỗi? (YMMV)

Tôi chỉ có thể nói chung, nhưng tôi luôn thích các thư viện trình bao bọc hơn các ổ cắm thô (hoặc, thực sự, để mã hóa bất cứ thứ gì tôi có thể nhận được miễn phí từ thư viện).

Họ làm cho mã hóa đơn giản hơn và ít bị lỗi hơn. Họ chăm sóc rất nhiều công việc giữ nhà và xử lý lỗi, đó là mã mà bạn sẽ phải tự viết và gỡ lỗi, trong đó một thư viện thường được xem xét và kiểm tra tốt và đang được sử dụng bởi hàng ngàn người khác, tất cả những người khác sẽ báo cáo / sửa lỗi cho bạn.

Thêm vào đó, bạn cần ít mã hơn để duy trì (và có thể là cổng), có nghĩa là có nhiều thời gian hơn để phát triển, kiểm tra & đánh bóng ứng dụng của bạn hoặc chuyển sang kế tiếp.

Chi phí duy nhất được cho là một chức năng gọi, nếu bạn chấp nhận rằng tất cả sự tốt đẹp của người thủ thư (xử lý lỗi, giữ ống và tương tự) là thứ mà bạn sẽ phải tự viết mã để có được phần mềm tốt, ổn định.

Nếu bạn quan tâm về hiệu suất, chỉ cần hồ sơ. Nhưng, trừ khi ổ cắm của bạn hoạt động hàng trăm lần một giây, tôi thậm chí sẽ không bận tâm.


Chà, có thư viện miễn phí cho các kết nối TCP và kết nối ổ cắm (web) và cả hai đều yêu cầu sự kiện "tin nhắn đã nhận".
Goufalite

2
OP muốn biết liệu sử dụng TCP hay websockets cho hiệu quả tốt hơn và bạn nói "sử dụng thư viện trừu tượng để bạn không làm phiền". Chắc chắn, nhưng cái nào? Trong C # Có thư viện TcpClient trong System.Net.Sockets (tốt, tốt ...) và thư viện websocket trong gói nuget (WebSocketSharp). Tôi đồng ý rằng có một thư viện MQTT chung cho tất cả các ngôn ngữ nhưng OP muốn có quyền kiểm soát nó để chọn giao thức nào nó phải sử dụng.
Goufalite
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.