2013-07-16 48 views
5

Làm thế nào để bạn biết trình điều khiển Datastax Java Cassandra hết thời gian khi nó cố gắng kết nối với cụm của bạn?Thông báo cho trình điều khiển Datastax Java Cassandra về kết nối cụm thời gian chờ

Tôi đặc biệt quan tâm đến trường hợp máy chủ có thể truy cập được, nhưng các cổng Cassandra bị chặn hoặc các daemon Cassandra không hoạt động. Tôi đang viết một máy khách dòng lệnh mà nên thoát ra và báo cáo một thông báo lỗi phù hợp nếu nó không thể kết nối trong một thời gian hợp lý. Hiện nay có vẻ như người lái xe sẽ chờ đợi mãi mãi cho một điểm tiếp xúc để phản ứng, nếu điểm tiếp xúc có thể truy cập.

Tức là, tôi muốn để ném NoHostAvailableException nếu trình điều khiển không thể giao tiếp với trình nền Cassandra của bất kỳ điểm tiếp xúc nào trong một thời gian tối đa nhất định.

  • Tạo riêng tôi RetryPolicy sẽ không hoạt động: đó là cho các truy vấn thử lại, và tôi muốn thời gian chờ để áp dụng trước chúng tôi đã sẵn sàng để chạy các truy vấn.
  • Tạo của riêng tôi ReconnectinoPolicy ban đầu trông đầy hứa hẹn, nhưng hợp đồng cho giao diện mang đến cho không có nghĩa là để chỉ ra "xem xét nút này để được chết mãi mãi nhiều hơn"

Trả lời

7

Đó là, tôi muốn Cluster.build() để ném một NoHostAvailableException nếu người lái xe không thể giao tiếp với Cassandra daemon của bất kỳ điểm tiếp xúc trong một thời gian tối đa nhất định.

Điều này được cho là đúng. Người lái xe sẽ cố gắng kết nối với từng điểm tiếp xúc và ném một ngoại lệ nếu nó không kết nối được với bất kỳ điểm nào. Bạn có thể kiểm soát thời gian tối đa mà người lái sẽ thử kết nối (với mỗi nút) thông qua SocketOptions.setConnectTimeoutMillis() (mặc định là 5 giây). Kinh nghiệm của tôi là Cluster.build() trả về một ngoại lệ nếu không có nút nào có thể được kết nối, nhưng nếu trải nghiệm của bạn khác, bạn có thể báo cáo nó như một lỗi (nhưng chi tiết hơn một chút về cách bạn tạo lại điều này sẽ giúp ích).

đó đang được nói:

  • Thời gian chờ trên mỗi máy chủ. Vì vậy, nếu bạn vượt qua một danh sách 100 điểm liên lạc, bạn có thể trong lý thuyết phải chờ đợi 500 giây (theo mặc định) trước khi nhận được NoHostAvailableException. Nhưng không có điểm thực trong việc cung cấp nhiều điểm tiếp xúc, và trong thực tế, nếu Cassandra không chạy trên nút đã thử, nỗ lực kết nối thường sẽ thất bại ngay lập tức (bạn sẽ không đợi thời gian chờ).
  • Hiện tại không có thời gian chờ truy vấn thực sự nào ở phía trình điều khiển. Điều đó có nghĩa là nếu người lái xe kết nối với một nút (có nghĩa là một số quá trình đang lắng nghe trên cổng đó và chấp nhận kết nối), nhưng không nhận được câu trả lời cho tin nhắn ban đầu của mình, thì nó thực sự có thể giữ mãi mãi. Điều đó có lẽ nên được khắc phục và tôi khuyến khích bạn mở một vé cho điều đó trên https://datastax-oss.atlassian.net/browse/JAVA. Tuy nhiên, điều này dường như không phải là trường hợp bạn mô tả, vì nếu "cổng Cassandra bị chặn hoặc các trình tiện ích Cassandra không chạy" thì trình điều khiển không thể kết nối ngay từ đầu.
+0

Có thể tôi thực sự thấy trường hợp thứ hai. Tôi phải bỏ lỡ tùy chọn ổ cắm đó. Như bạn ngụ ý, điều đó phải đủ tốt cho hầu hết các trường hợp. – Raedwald

+0

@Raedwald, bạn đã gửi một lỗi cho vấn đề này hay đã có giải pháp dễ dàng hơn chưa? –

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