5

Bất kỳ ai biết về việc triển khai bus thông báo cung cấp sự kiểm soát chi tiết về đảm bảo tính nhất quán? ACID đầy đủ quá chậm và không có ACID quá sai.Tìm kiếm triển khai bus tin nhắn cung cấp một cái gì đó giữa ACID đầy đủ và không có gì

Chúng tôi hiện đang sử dụng gói Rhino ESB MSMQ cho thông điệp của chúng tôi. Khi sử dụng tin nhắn giao dịch bền, giao dịch với các giao dịch phân tán, MSMQ có thể chặn cam kết trong thời gian đáng kể trong khi chờ đợi khi hoàn thành I/O.

Thư của chúng tôi rơi vào hai danh mục chung: logic nghiệp vụ và biến đổi hóa đơn. Tài khoản thứ hai chiếm tỷ lệ đáng kể lưu lượng truy cập của tin nhắn.

Thông điệp logic nghiệp vụ yêu cầu đảm bảo đầy đủ ACID và MSMQ đã chứng minh khá đầy đủ cho điều này.

điệp denormalisation:

  1. PHẢI được bền.
  2. PHẢI KHÔNG được xử lý cho đến sau khi giao dịch gốc bắt đầu hoàn tất.
  3. CÓ THỂ được xử lý nhiều lần.
  4. CÓ THỂ được xử lý ngay cả khi giao dịch gốc có quay lại, miễn là 2) được tuân thủ.

(Trong một số trường hợp cụ thể các yêu cầu độ bền có thể có thể được nới lỏng, nhưng việc xác định và xử lý những trường hợp như trường hợp ngoại lệ cho quy tắc thêm phức tạp.)

Tất cả bài viết denormalisation được xử lý trong quá trình như vậy không có cần cho IPC.

Nếu quá trình được khởi động lại, tất cả các giao dịch có thể được giả định là đã hoàn thành (cam kết hoặc cuộn lại) và tất cả các thông báo chuẩn hóa chưa được xử lý phải được khôi phục. Có thể chấp nhận các thông điệp khử nhiễu đã được xử lý. Theo như tôi có thể nói, các hệ thống nhắn tin đối phó với các giao dịch có xu hướng cung cấp sự lựa chọn giữa ACID đầy đủ hoặc không có gì, và ACID mang một hình phạt hiệu suất. Chúng tôi đang thấy các cuộc gọi đến TransactionScope # Commit(), miễn là vài trăm mili giây trong một số trường hợp tùy thuộc vào số lượng tin nhắn được gửi.

Sử dụng hàng đợi tin nhắn không giao dịch khiến thư được xử lý trước khi giao dịch gốc của họ hoàn tất, dẫn đến sự cố nhất quán.

Một phần khác của hệ thống có yêu cầu nhất quán tương tự nhưng độ phức tạp thấp hơn đã sử dụng triển khai tùy chỉnh giống như nhật ký giao dịch và tổng quát rằng trường hợp sử dụng này chắc chắn là một tùy chọn, nhưng tôi không muốn triển khai hệ thống nhắn tin giao dịch có độ trễ thấp, đồng thời, bền vững, nếu tôi không phải: P

Trong trường hợp bất kỳ ai thắc mắc, lý do yêu cầu độ bền của thông điệp khử nhiễu là phát hiện desyncs và cố định desyncs có thể cực kỳ khó và cực kỳ tốn kém tương ứng. Mọi người làm thông báo khi có điều gì đó hơi sai và làm mới trang không khắc phục được sự cố, vì vậy, bỏ qua desyncs không phải là một tùy chọn.

Trả lời

0

Nó chỉ ra rằng MSMQ + SQL + DTC thậm chí không cung cấp sự đảm bảo nhất quán chúng tôi cần. Trước đây, chúng tôi đã gặp phải sự cố khi thư được xử lý trước khi giao dịch phân phối xếp hàng chúng đã được cam kết với cơ sở dữ liệu, dẫn đến lần đọc lỗi thời. Đây là một tác dụng phụ của việc sử dụng ReadCommitted cách ly để tiêu thụ hàng đợi, vì:

  1. giao dịch Bắt đầu A.
  2. Cập nhật bảng cơ sở dữ liệu trong A.
  3. nhắn Queue trong A.
  4. Yêu cầu cam kết của A.
  5. nhắn xếp hàng cam kết Một
  6. Bắt đầu giao dịch B.
  7. đọc tin nhắn trong B.
  8. Đọc bảng cơ sở dữ liệu trong B, sử dụng ReadCommitted < - nhận dữ liệu trước A.
  9. Cơ sở dữ liệu cam A.

yêu cầu của chúng tôi là đọc của khối bảng trên A của B cam kết, đòi hỏi các giao dịch Serializable, có thể mang theo một hình phạt hiệu suất.

Có vẻ như điều bình thường cần làm là thực sự thực hiện các ràng buộc cần thiết và tự bảo đảm, mặc dù nó giống như phát minh lại bánh xe.

Bất kỳ ai có nhận xét về điều này?

+0

Quyết định tách các giao dịch bus thông báo khỏi các giao dịch cơ sở dữ liệu bằng cách thực hiện một hàng đợi trong quá trình xử lý lâu bền. Các thông điệp logic nghiệp vụ vẫn sẽ không có giá trị nhưng giao dịch mà chúng được gửi sẽ chỉ liên quan đến hàng đợi thông báo và được đảm bảo hoàn thành chỉ sau khi giao dịch cơ sở dữ liệu kích hoạt, do đó đảm bảo tính nhất quán khi được sử dụng với cách ly ReadCommitted. Hàng đợi có độ bền cao cũng sẽ được sử dụng để kích hoạt các hoạt động khử nhiễu thay vì gửi chúng qua MSMQ. –

1

Nó không phải chính xác câu trả lời bạn đang tìm kiếm, nhưng Jonathan Oliver đã viết nhiều về làm thế nào để tránh sử dụng các giao dịch phân phối trong nhắn tin và chưa duy trì tính toàn vẹn giao dịch:

http://blog.jonathanoliver.com/2011/04/how-i-avoid-two-phase-commit/ http://blog.jonathanoliver.com/2011/03/removing-2pc-two-phase-commit/ http://blog.jonathanoliver.com/2010/04/idempotency-patterns/

Không chắc chắn nếu điều này giúp bạn nhưng, hey.

+0

Cảm ơn các liên kết. Tôi quen thuộc với nhiều cách khác nhau để tránh sự cần thiết cho 2PC, nhưng chúng tôi đang duy trì một codebase cũ không được xây dựng với khả năng mở rộng trong tâm trí. Kiến trúc vẫn là một lai của cũ và mới (và sẽ được cho tương lai gần). Cho đến khi chúng ta có thể loại bỏ các dấu tích cuối cùng của mã cũ, chúng ta cần các giao dịch phân tán để giữ cho mọi thứ nhất quán. –

+0

Hệ thống chuẩn hóa của chúng tôi thực tế xử lý các thư trùng lặp như được đề xuất trong các liên kết đó, nhưng chúng tôi cần phải trì hoãn xử lý chúng cho đến khi giao dịch gốc hoàn tất. Tôi biết cách tự mình thực hiện tất cả điều này, nhưng tôi đang tìm cách sử dụng một thư viện hiện có để xử lý nó cho tôi nếu có thể. –