Tôi có một máy chủ Redis và nhiều máy khách Redis. Mỗi máy khách Redis là một máy chủ WebSocket+HTTP, bao gồm cả việc quản lý các kết nối WebSocket. Các máy chủ WebSocket+HTTP này được ẩn đằng sau bộ cân bằng tải.
Máy chủ WebSocket+HTTP cung cấp một NHẬN/sức khỏe
Điểm cuối HTTP. Tôi muốn điểm cuối này cung cấp tổng số kết nối WebSocket hiện tại trên toàn cụm.
khi được nhấp vào NHẬN/sức khỏe
, bộ cân bằng tải rõ ràng sẽ gửi yêu cầu đến phiên bản máy chủ WebSocket+HTTP.
Làm cách nào để một phiên bản máy chủ WebSocket+HTTP hỏi tất cả các phiên bản khác về số lượng kết nối WebSocket mà chúng hiện đang quản lý?
Tôi đã nghĩ đến các bước sau:
- Cách sử dụng ví dụ
DANH SÁCH KHÁCH HÀNG
Tìm hiểu xem hiện tại có bao nhiêu khách hàng Redis (ví dụ: n
);
- Sau đó, instance sẽ
WEBSOCKET_CONNECTION_COUNT_REQUEST
Xuất bản lên Redis (giả sử tất cả khách hàng Redis đã đăng ký sự kiện này);
- instance cuối cùng sẽ đợi
n
WEBSOCKET_CONNECTION_COUNT_RESPONSE
, tổng số và được trả về qua HTTP.
Bạn nghĩ gì về cách tiếp cận trên? Có phải nó hơi phức tạp quá không? Tôi cảm thấy như tôi có thể đã thiết kế nó quá mức một chút ...
Ban đầu tôi nghĩ ví dụ này sẽ làm được INCR
/tháng mười hai
Số lượng có trong cửa hàng Redis, nhưng tôi không chắc chắn cách xử lý các trường hợp bị giết (vì số lượng sau đó sẽ được giảm đi tương ứng). Tôi nghĩ giải pháp tạm thời là thích hợp hơn. Tuy nhiên, hãy luôn cởi mở với các ý tưởng.
Tôi sẽ sử dụng một tập hợp được sắp xếp trong đó các thành viên là ID máy chủ WS và điểm số là dấu thời gian của lần "ping" cuối cùng của họ.
Để mỗi WS "ping" định kỳ (ví dụ: 10 giây một lần) bằng cách cập nhật tập hợp đã sắp xếp với id của nó. Bạn có thể sử dụng tập lệnh Lua để lấy thời gian từ máy chủ và đặt điểm cho thành viên để khiến mọi thứ trở nên tốt đẹp và nguyên bản:
redis.replica_commands()
địa phương t = redis.call('TIME')
return redis.call('ZADD', KEYS[1], tonumber(t[0]), ARGV[1])
Vì vậy, nếu tập hợp được sắp xếp của bạn được gọi là "wsservers" và id của WS là foo, bạn có thể sử dụng EVALSHA 1 wsservers foo
Gọi tập lệnh sau khi nó được tải. .
Để trả về số đếm, tất cả những gì bạn cần làm là lấy một phạm vi trên tập hợp đã sắp xếp của khoảng thời gian cuối cùng (tức là 11 giây) và tính kết quả. Bạn cũng có thể tận dụng cơ hội này để loại bỏ các máy chủ cũ đã chết. Tất nhiên, viết kịch bản lệnh Lua là phương pháp ưa thích của tôi, cả hai tác vụ đều không thực sự yêu cầu gửi các thành viên WS thô đến ứng dụng khách đang gọi:
địa phương t = redis.call('TIME')
trực tiếp cục bộ = redis.call('ZRANGE', KEYS[1], tonumber(t[0])-11, '+inf')
redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', tonumber(t[0])-11)
trở lại #live
Tôi là một lập trình viên xuất sắc, rất giỏi!