2012-10-24 32 views
20

Ngoài việc đọc mã trong github, có loại tài liệu giấy trắng nào về cách gói SignalR.Redis hoạt động không? Cụ thể, tôi tự hỏi những gì nó thêm vào Redis, cập nhật/xóa chiến lược, vv Khi tìm kiếm bên trong Redis tất cả những gì tôi từng thấy là một khóa được chỉ định trong cuộc gọi sau (ví dụ: "SignalR.Redis.Sample"):SignalR.Redis hoạt động như thế nào dưới mui xe?

GlobalHost.DependencyResolver.UseRedis(server, Int32.Parse(port), password, "SignalR.Redis.Sample"); 

Phím này có vẻ như là bộ đếm trong Redis. Tôi cho rằng các khóa khác đang được tạo và xóa nhanh để tạo điều kiện thuận lợi cho các thông điệp giữa mỗi máy chủ ứng dụng được kết nối với Redis.

Trả lời

48

Không có sách trắng nào và nó giống như 200 dòng mã, không quá nhiều để nuốt.

Trong SignalR, mỗi thông báo đi qua một thứ gọi là bus thông báo. Khi bạn muốn mở rộng trên các nút (hoặc các quy trình hoặc các miền ứng dụng), việc thực hiện bus này cần phải có khả năng nói chuyện với từng cá thể của ứng dụng của bạn. Để làm điều này bạn có thể sử dụng RedisMessageBus. Redis có một cơ chế pub sub cũng như khả năng lưu trữ các cặp khóa giá trị và chúng tôi chỉ sử dụng các giá trị cũ cho SignalR.

OffTopic: Điều này rất quan trọng! SignalR KHÔNG tin nhắn đáng tin cậy, nó là một trừu tượng kết nối. Chúng tôi có thể đệm các tin nhắn cho longpolling nhưng bạn ** không thể * dựa vào các tin nhắn đang có cho bao giờ hết. Nếu bạn có những thông điệp quan trọng bạn cần phải tồn tại, thì hãy giữ chúng.

Mỗi máy chủ web kết nối với một (hoặc nhiều hơn trong triển khai mới) thực hiện lại các sự kiện để gửi thư giữa chúng. Khi một tin nhắn đến cho một hoặc nhiều máy khách, nó được gửi tới bảng nối đa năng (redis) và nó đến trên tất cả các máy chủ web. Mỗi máy chủ web nhận được thư từ redis và lưu trữ nó trong bộ nhớ cache cục bộ. Bộ nhớ cache cục bộ này là nơi các máy khách SignalR (trình duyệt, vv), được phục vụ.

Một phần quan trọng trong quy mô thiết kế là con trỏ. Một con trỏ biểu thị vị trí của một máy khách cụ thể trong một luồng thông điệp vô hạn. Khi khách hàng kết nối lại sau khi ngắt kết nối hoặc kết nối dài hạn trở lại sau khi nhận được thông báo, nó sẽ yêu cầu xe buýt đưa tôi mọi thứ kể từ khi giá trị con trỏ. Các con trỏ được xác định bởi việc thực hiện bus thông báo và chúng ta đã chuẩn hóa nó trong các nguồn mới nhất (chưa được phát hành tại thời điểm viết nhưng tôi sẽ không đi vào chi tiết ở đây). Con trỏ trong việc thực hiện hiện tại của redis chỉ là một con số được tăng lên, không có gì quá phức tạp.

Hy vọng rằng sẽ cung cấp cho một số ý tưởng về cách hoạt động của nó.

+2

Cảm ơn bạn rất nhiều. Lời giải thích tuyệt vời. – user1574808

+1

Cảm ơn lời giải thích tuyệt vời. Vui lòng xem xét trường hợp sau: Tôi có một trang web ** cân bằng tải ** trong đó mỗi máy chủ lưu trữ một trung tâm. Giả sử rằng tất cả các khách hàng đang quay trở lại để bỏ phiếu dài. _Client X_ kết nối thông qua bộ cân bằng tải và yêu cầu của nó được gửi tới _server 1_. Tuy nhiên, đối với bình chọn tiếp theo, trình cân bằng tải sẽ chuyển yêu cầu của bạn tới _server 2_. Câu hỏi của tôi là, bảng nối đa năng có đảm bảo rằng tất cả các hub đều nhận thức được tất cả các máy khách được kết nối, bất kể hub nào được kết nối ban đầu? – demius

+1

Bảng nối đa năng nhận thức được tất cả các máy chủ nên mọi thứ sẽ hoạt động. Nó không cần phải biết những gì máy chủ nó ban đầu kết nối với. – davidfowl

Các vấn đề liên quan