Trước đây mình đã từng làm một dự án liên quan đến dữ liệu Realtime là một chat app bằng Laravel, nhưng hồi đó cũng chưa hiểu lắm, chỉ cần chạy được là được.
Sau này mình cũng lại có cơ hội làm một chat app khác bằng firebase realtime database và cũng hoàn thành nó khá tốt, nhưng vẫn chưa hiểu cách hoạt động của phần realtime này lắm.
Đến gần đây khi có thời gian nhiều hơn cũng như kiến thức hơn thì lại có 1 task liên quan đến phần này và mình bắt đầu thực sự tìm hiểu sâu hơn một chút để đủ hiểu nó là gì.
Khái niệm
Socket
Socket là một khái niệm trong lập trình mạng đề cập đến một giao diện phần cứng hoặc phần mềm được sử dụng để kết nối hai máy tính với nhau qua mạng. Trong ngữ cảnh của lập trình, socket thường được sử dụng để tạo ra các kết nối mạng TCP/IP hoặc UDP.
Một socket TCP/IP cho phép hai máy tính truyền dữ liệu cho nhau qua mạng thông qua một kết nối ổn định. Một socket UDP thì thường được sử dụng cho các ứng dụng yêu cầu tốc độ cao, nhưng không cần độ tin cậy cao. Socket trong lập trình thường được sử dụng để thiết lập kết nối mạng giữa các ứng dụng trên các máy tính khác nhau, cho phép truyền dữ liệu qua lại giữa chúng.
Đại khái là là một IP + Port nữa, luôn luôn live, tức là sống và mình truy cập được.
Nó sống để các máy tính (client) kết nối vào điển hình là 2 máy, server và cliet.
Thay vì giao tiếp trực tiếp với nhau thì nó sẽ giao tiếp qua thằng này.
(hai đứa viết thư yêu đương nhờ qua ông đưa thư ở giữa ấy)(nhưng mà nhanh, realtime)Websocket
WebSocket là một giao thức giúp truyền dữ liệu hai chiều giữa server-client qua một kết nối TCP duy nhất. Hơn nữa, webSocket là một giao thức được thiết kế để truyền dữ liệu bằng cách sử dụng cổng 80 và cổng 443 và nó là một phần của HTML5. Vì vậy, webSockets có thể hoạt động trên các cổng web tiêu chuẩn, nên không có rắc rối về việc mở cổng cho các ứng dụng, lo lắng về việc bị chặn bởi các tường lửa hay proxy server
Không giống với giao thức HTTP là cần client chủ động gửi yêu cầu cho server, client sẽ chời đợi để nhận được dữ liệu từ máy chủ. Hay nói cách khác với giao thức Websocket thì server có thể chủ động gửi thông tin đến client mà không cần phải có yêu cầu từ client.
Tất cả dữ liệu giao tiếp giữa client-server sẽ được gửi trực tiếp qua một kết nối cố định làm cho thông tin được gửi đi nhanh chóng và liên tục khi cần thiết. WebSocket làm giảm độ trễ bởi vì một khi kết nối WebSocket được thành lập, server không cần phải chờ đợi cho một yêu cầu từ client.
Tương tự như vậy, client có thể gửi tin nhắn đến server bất cứ lúc nào. Yêu cầu duy nhất này giúp làm giảm đáng kể độ trễ, mà sẽ gửi một yêu cầu trong khoảng thời gian, cho dù thông điệp có sẵn.
Để có thể sử dụng được Websocket thì không phải chỉ cần trình duyệt hỗ trợ mà còn phải có server Socket, server Socket có thể được tạo ra bằng bất kỳ ngôn ngữ server-side nào.
Pusher
Pusher là một dịch vụ cloud, tạo ra một server trung gian giúp chúng ta có thể xử lý các tác vụ thời gian thực. Dữ liệu được gửi tới pusher, và pusher lại gửi nó đi tới các client đã subscribe (đăng ký) và các channel. Trong đó Pusher Channel cung cấp giao tiếp thời gian thực giữa các máy chủ, ứng dụng và thiết bị. Các kênh được sử dụng cho các biểu đồ thời gian thực, danh sách người dùng thời gian thực, bản đồ thời gian thực, chơi trò chơi nhiều người chơi và nhiều loại cập nhật giao diện người dùng khác. Nó có một thư viện hỗ trợ mọi thứ như trình duyệt web, ứng dụng iOS và Android, khung PHP, chức năng đám mây, tập lệnh bash, thiết bị IoT. Pusher Channel hoạt động ở mọi nơi vì nó sử dụng WebSockets và HTTP và cung cấp dự phòng cho các thiết bị không hỗ trợ WebSockets.
=> Nó chính là 1 thằng Socket trung gian đó cả nhà.
Socket.IO
Là một thư viện để dựng lên Socket Server, Socketio không phải là một ngôn ngữ, mà chỉ là 1 công cụ giúp thực hiện những ứng dụng realtime. Vì thế, không thể sử dụng socketio để thay thế hoàn toàn cho một ngôn ngữ, mà phải sử dụng kết hợp với một ngôn ngữ khác. Ngôn ngữ đó có thể là php, C#, Go, nodejs,... và thường dùng trong Javascript là phổ biến nhất