2015-08-17 13 views
8

Tôi định sử dụng cú pháp ConnectionMultiplexer.Connect("server1:6379,server2:6379") , với các địa chỉ: kết hợp số cổng của mỗi nút trong nhóm sao chép ElastiCache (trong điều khoản AWS).sử dụng StackExchange.Redis với ElastiCache

Thư viện có xử lý các nút chết/không hồi đáp, tự động chuyển lệnh đến các nút đang hoạt động không?
Thư viện có tự động phát hiện một nút không thành công hiện có sẵn/các nút mới được thêm vào nhóm sao chép không?

+0

Bạn đang đề cập đến thư viện 'StackExchange.Redis'? – thepirat000

+0

Có - [this] (https://github.com/StackExchange/StackExchange.Redis) – nirw

Trả lời

2

Tôi không quen thuộc với Elasticache, nhưng StackExchange.Redis ConnectionMultiplexer sẽ tự động thử lại dưới nền nếu kết nối bị ngắt và nó sẽ phát hiện các nút đã phục hồi.

Tất nhiên, khi thất bại, bạn sẽ nhận được ngoại lệ khi truy cập cơ sở dữ liệu, nhưng nếu bạn xử lý lỗi chính xác, bạn sẽ không cần phải tạo lại ConnectionMultiplexer.

tôi đã sử dụng đoạn mã sau để kiểm tra điều này trong cluster-mode và độc lập-mode:

var mul = ConnectionMultiplexer.Connect("192.168.15.15:7000,192.168.15.15:7001,...,connectRetry=10,syncTimeout=5000,abortConnect=false,keepAlive=10,allowAdmin=true"); 
RETRY: 
    Thread.Sleep(1000); 
    var k = Guid.NewGuid().ToString(); 
    var v = Guid.NewGuid().ToString(); 
    try 
    { 
     var db = mul.GetDatabase(); 
     db.StringSet(k, v); 
     if (db.StringGet(k).ToString() != v) 
     { 
      throw new OperationCanceledException("ABORT"); 
     } 
    } 
    catch(RedisServerException ex) 
    { 
     Console.WriteLine("Redis Server Exception {0}", ex.Message); 
     goto RETRY; 
    } 
    catch(RedisConnectionException ex) 
    { 
     Console.WriteLine("Redis Connection Exception {0}", ex.Message); 
     goto RETRY; 
    } 
    catch(TimeoutException ex) 
    { 
     Console.WriteLine("Timeout Exception {0}", ex.Message); 
     goto RETRY; 
    } 
    Console.WriteLine("OK"); 
    goto RETRY; 

tôi đã nhận được ba loại ngoại lệ khi tắt máy tính/đâm các máy chủ khác nhau: RedisServerException, RedisConnectionExceptionTimeoutException . Và ngừng nhận ngoại lệ khi máy chủ/cụm máy chủ hoạt động trở lại.

+0

Trong trường hợp yêu cầu thử một nút bị hỏng, nó sẽ thử gửi yêu cầu đến các nút đã biết khác hay chỉ ném một ngoại lệ ? – nirw

+0

Tôi nghĩ rằng nó sẽ phụ thuộc vào thời điểm máy chủ bị hỏng. Bạn có thể sẽ nhận được một MOVED RedisServerException nếu cụm đang phục hồi, hoặc CLUSTERDOWN là cụm không thể phục hồi. Trong cả hai trường hợp, bạn cần phải tạo lại bộ ghép kênh. – thepirat000

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