2012-08-29 31 views
6

Tôi có một dịch vụ web CRUD và đã được giao nhiệm vụ cố gắng tìm ra cách để đảm bảo rằng chúng tôi không bị mất dữ liệu khi cơ sở dữ liệu bị hỏng. Mọi người đều biết rằng nếu cơ sở dữ liệu bị hỏng, chúng tôi sẽ không thể nhận được "lần đọc" nhưng đối với một tập con cụ thể của các hoạt động chúng tôi muốn đảm bảo rằng chúng tôi không bị mất dữ liệu.Có phải RabbitMQ, ZeroMQ, Nhà môi giới dịch vụ hay một cái gì đó tương tự như một giải pháp thích hợp để tạo một webservice cơ sở dữ liệu sẵn sàng cao?

Tôi đã có ấn tượng rằng đây là thứ được bao phủ bởi các dịch vụ như 0MQ, RabbitMQ hoặc một trong các dịch vụ Microsoft MQ. Mặc dù sau một vài ngày đọc và nghiên cứu, tôi thậm chí không chắc chắn rằng các thông điệp mà chúng ta đang nói đến trong các dịch vụ MQ bao gồm các hoạt động cơ sở dữ liệu. Tuy nhiên, tôi chắc chắn 100% rằng tôi có thể xếp hàng như nhiều thế giới chào hỏi như tôi có thể hy vọng.

Nếu tôi có thể sử dụng hàng đợi tin nhắn để thêm lớp bảo vệ vào cơ sở dữ liệu, tôi sẽ nghiêng về phía Thỏ (vì nó xuất hiện để tồn tại qua các sự cố). các giải pháp của họ (như SQL Service Broker, hoặc MSMQ) là phù hợp hơn.

Câu hỏi cơ bản thực sự mà tôi chưa chắc chắn là liệu tôi có đang chơi với đúng cỗ bài hay không (để nói).

Với mong muốn cho một dịch vụ web có tính sẵn sàng cao, tiếp tục hoạt động nếu cơ sở dữ liệu bị hỏng, có nghĩa là đặt một cá thể Thỏ MQ "giữa" webservice và cơ sở dữ liệu? Có lẽ liên kết phù hợp trong chuỗi là để RabbitMQ gửi tin nhắn đến máy chủ web?

Hoặc có giải pháp nào khác để đạt được điều này không? Có một số ý tưởng bị mất tại thời điểm tìm kiếm một cách để cuộn lên các nhật ký web trong trường hợp mất dữ liệu hoặc một cái gì đó ... nhưng chúng tôi vẫn còn ở giai đoạn đủ sớm (ít nhất là tôi) không có ý tưởng gì tôi ' m sẽ làm.

Hàng đợi có phải là giải pháp đúng không?

Trả lời

3

Giới thiệu thông điệp xếp hàng giữa dịch vụ và cơ sở dữ liệu chắc chắn là một cách để cải thiện tính khả dụng của dịch vụ. Việc ghi vào hàng đợi cục bộ sẽ luôn rẻ hơn và có sẵn nhiều hơn viết vào cơ sở dữ liệu.

Ngoài ra bằng cách sử dụng xếp hàng bạn sẽ giành quyền kiểm soát khối lượng lưu lượng cơ sở dữ liệu mà cơ sở dữ liệu của bạn phải xử lý ở mức cao nhất.

Tuy nhiên, để thực hiện điều này, bạn cần lưu ý rằng khi ghi cơ sở dữ liệu được thực hiện, yêu cầu được xếp hàng đợi và sẽ được gửi và xử lý ngoại tuyến.

Ngay cả trong điều kiện điều này xảy ra gần như ngay lập tức, bạn đang mất lợi ích bản chất đồng bộ của dịch vụ hiện tại của bạn cho phép bạn. Và lợi ích đó là người tiêu dùng dịch vụ của bạn (hoặc khách hàng web) luôn có thể biết được liệu chiến dịch có thành công hay không.

Tôi đã viết về chủ đề này trước here. Người dùng đăng câu hỏi có mối quan tâm tương tự với bạn. Cho dù bạn làm điều này hay không là một quyết định bạn phải thực hiện.

Đối với ngăn xếp công nghệ bạn đang nghĩ đến, 0MQ không thực sự là hệ thống xếp hàng thông báo, nó giống như ổ cắm trên steroid.

Trong số các nền tảng MQ khác mà bạn đề cập, tất cả chúng đều hỗ trợ độ bền thông qua sự cố hệ thống. MSMQ là giải pháp nhẹ hơn nhiều so với rabbitMQ (thực hiện giao thức AMQP và do đó hỗ trợ các mẫu nhắn tin ra khỏi hộp).

Nhà môi giới dịch vụ là công nghệ cơ sở dữ liệu và không tích hợp tốt với mã ngoại trừ thông qua SqlDependency hoặc thông báo được gọi là Thông báo được bật trên nền tảng StreamInsight.

Tôi sẽ đi cho MSMQ (hỗ trợ nhắn tin bền qua hàng đợi giao dịch) vì nó nhẹ, một phần của Windows và có hỗ trợ thư viện lõi .net.

+0

Không phải là vấn đề - cũng xem xét việc sử dụng xếp hàng sẽ không ngăn chặn tất cả mất dữ liệu, ví dụ, yêu cầu trình duyệt của khách hàng có thể bị giảm nếu IIS quá bận để gửi chúng. –

+1

Dịch vụ môi giới có thể dễ dàng được sử dụng với EF hoặc ADO.Net. Thậm chí hoạt động tốt với async/await. –