2012-03-17 34 views
6

Tôi đang sử dụng lắp ráp NHibernate.Search và đang tìm kiếm các phương pháp hay nhất xung quanh việc sử dụng tính năng này với nhiều máy chủ web.NHibernate Search - Nhiều Máy chủ Web

Chúng tôi có nhiều không gian trên máy chủ web để xử lý các chỉ mục mà chúng tôi đang tạo, vì vậy tôi nghĩ tuyến đường tốt nhất là có chỉ mục trên mỗi máy chủ web. Sau đó, các lớp mà tôi lập chỉ mục, thêm một cột phiên bản. Câu hỏi duy nhất của tôi là nếu tôi làm điều này, NHibernate.Search có đủ thông minh để kéo bản ghi mới nhất và lập chỉ mục nó nếu giả sử Web Server A cập nhật bản ghi và chỉ mục của Máy chủ Web B đã lỗi thời?

Tùy chọn khác là lưu trữ các chỉ mục trên vị trí tệp được chia sẻ và kéo từ tài nguyên mạng đó. Điều này có vẻ như một giải pháp ít hơn lý tưởng vì nó không cho phép dự phòng lớn.

Những người khác giải quyết vấn đề này với NHibernate.Search và/hoặc chỉ mục Lucene.NET như thế nào?

Trả lời

3

Ngay khi bạn quyết định đặt chỉ mục của mình vào các máy khác nhau mà bạn đã giới thiệu vấn đề "tìm kiếm phân tán". Những thứ như nhân rộng, dự phòng, quản lý, theo dõi, tổng hợp tìm kiếm trở thành các vấn đề quan trọng và thú vị mà bạn cần giải quyết.

Điều đó nói rằng, Solr là một trong những giải pháp được đề xuất cho sự cố. Hơn nữa, SolrNet có thể giúp bạn tích hợp nó với Nhibernate.

Tôi đã sử dụng cả hai dự án kết hợp với Nhibernate và có thể hơi khó hiểu ngay từ đầu nhưng nó sẽ trả tiền sau này.

Trong trường hợp của bạn, bạn có khả năng có thể chạy Solr trong máy chủ web của mình.

+0

Đẹp! Tôi chưa dành thời gian để nhìn vào Solr. Tôi đã suy nghĩ dọc theo dòng của "bạn cần phải đồng bộ hóa những thay đổi NHibernate từ nhiều máy chủ để các chỉ số Lucene trên nhiều máy chủ - vì vậy bạn có thể sẽ phải xây dựng một cái gì đó tùy chỉnh." Hình như "cái gì đó" đã được xây dựng trong Solr. –

+0

Tôi chạy qua [liên kết về Solr] (http://www.lucidimagination.com/content/scaling-lucene-and-solr). Trích: "Đối với hầu hết các ứng dụng, nếu bạn bắt đầu phát triển một giải pháp có thể mở rộng với Lucene, bạn bắt đầu xây dựng một công cụ tìm kiếm nhà brew. Đây là một số lượng công việc liên quan đến việc quy mô Lucene đúng cách nhiều máy. Solr đã thực hiện phần lớn điều này, cũng như rất nhiều công việc cấp cao khác, và nó là khôn ngoan để tận dụng lợi thế của nó. " Cảm ơn đã chỉ cho tôi theo hướng này! –

+0

Điều này rất hay. Sẽ đi theo con đường này từ nay trở đi. Cám ơn vì sự gợi ý. – Brandon

0

ý tưởng đầu tiên của bạn sẽ không hoạt động. các nút của trang trại không giao tiếp với nhau. chúng phụ thuộc vào tài nguyên được chia sẻ như bộ nhớ cache cấp hai. Bên cạnh đó, bạn không muốn các chỉ mục riêng biệt vì chúng sẽ không được đồng bộ hóa.

Vị trí tệp được chia sẻ là cách để đi. Theo như dự phòng có liên quan, tôi sẽ nghĩ rằng dự phòng lưu trữ là không đáng kể, bạn có thể bắt đầu với một mảng đột kích

1

Chúng tôi sử dụng phương pháp tiếp cận Chính/Thanh toán được hỗ trợ bởi NHibernate Search và Lucene.net.

Mỗi máy chủ web có bản sao chỉ mục phụ và không lập chỉ mục.

Mỗi lần máy chủ web cập nhật nội dung nào đó, nó sẽ gửi thư đến dịch vụ phụ trợ (chúng tôi sử dụng Rhino ServiceBus với msmq) để lập chỉ mục (Bằng cách tải đối tượng được cập nhật và lập chỉ mục lại).

Cứ 10 giây một lần (chúng tôi cần tìm kiếm cập nhật - thực tế phổ biến là có thời gian gia hạn 30 phút) máy chủ web sẽ kiểm tra phiên bản mới của chỉ mục và tìm nạp phiên bản đó nếu cần. Nó hoạt động khá tốt khi các thay đổi gia tăng, do đó, việc kéo chỉ mục đầy đủ chỉ cần thiết nếu chúng tôi thực hiện tối ưu hóa hoặc tổng chỉ mục lại.

Nếu bạn cần tốc độ tốt hơn - bạn có thể tối ưu hóa nó bằng cách sử dụng triển khai ram trên máy chủ web - nhưng với tìm kiếm ký tự khá phức tạp trên chỉ mục 32 mb, chúng tôi vẫn dưới 10 ms cho truy vấn.

Một tối ưu hóa khác là để máy chủ web thực hiện lập chỉ mục, nhưng chỉ gửi bản sao gia tăng cho phần phụ trợ để nối thêm vào chỉ mục chính.Điều này sẽ lưu DB một cuộc gọi từ dịch vụ phụ trợ mặc dù ở một số tiền nhất định phức tạp như bạn phải đi sâu trong ruột NHibernate Search/Lucene để làm điều đó.