2012-03-02 25 views
7

Những gì tôi sắp mô tả về cơ bản là một giai đoạn hai cam kết vấn đề giữa hai hệ thống khác nhau và tôi đang tìm kiếm lời khuyên về cách xử lý nó. Trong ứng dụng web của chúng tôi, chúng tôi dỡ bỏ một số hoạt động đắt tiền/bên thứ ba, chẳng hạn như gửi email, đến các quy trình công nhân nền ngoài băng tần (chúng tôi gọi đó là cơ sở hạ tầng công việc của mình.)Cam kết hai giai đoạn - Cách sử dụng hàng đợi hiệu quả?

Để gửi email, ví dụ: chúng tôi tạo cả một đối tượng email và công việc email trong cơ sở dữ liệu của chúng tôi. Sau đó chúng tôi phải chờ cho công việc giám sát của chúng tôi để đón công việc email và gửi nó. Giám sát công việc về cơ bản hoạt động bằng cách bỏ phiếu cho cơ sở dữ liệu cứ sau vài giây khi nó không hoạt động.

Điều này, tuy nhiên, thêm thời gian trễ gửi email và thêm những gì tôi xem dưới dạng tải không quá tải trên cơ sở dữ liệu với cuộc thăm dò ý kiến. Sẽ đẹp hơn nếu chúng ta có thể ngay lập tức đặt công việc email lên hàng đợi ngay khi email được tạo.

Tuy nhiên, điều này hiện không thành công vì hai lý do. Đầu tiên, hàng đợi thường nhanh hơn nhiều so với yêu cầu web. Email được chọn để xử lý trước khi yêu cầu web đã thực hiện giao dịch cơ sở dữ liệu của nó, vì vậy nó không thể tạo email đúng cách. Thứ hai, nếu yêu cầu web không thành công, nó sẽ quay trở lại giao dịch cơ sở dữ liệu của nó có nghĩa là email nên không phải được gửi. Tuy nhiên, nếu nó đã được đưa vào hàng đợi, thì nó không còn nằm trong sự kiểm soát của yêu cầu nữa.

Có chiến lược tốt để tạo cam kết hai pha giữa hàng đợi và cơ sở dữ liệu không? Để tham khảo, chúng tôi đang sử dụng RabbitMQ và MySQL với các bảng InnoDB. Một ý tưởng tôi đứng đầu là gắn bó các công việc email trên hàng đợi sau khi giao dịch cơ sở dữ liệu đã được cam kết, nhưng điều đó khiến cho khả năng email không bao giờ được xếp hàng đợi. Tôi vẫn sẽ phải tạo một quy trình bỏ phiếu để theo dõi các email cần được gửi và không được gửi đi.

Trả lời

0

Tôi nhận ra đây là một vài năm cuối :) nhưng tôi muốn thêm một số suy nghĩ về điều này cho những người khác chạy vào câu hỏi này.

Bạn có thể gửi thư bị trì hoãn để tăng cơ hội DB sẵn sàng khi công việc nhận được. Tôi chưa bao giờ sử dụng RabbitMQ nhưng tôi đã tìm thấy ví dụ này về việc sử dụng hàng đợi rabbitMQ làm hàng đợi bị trễ How to create a delayed queue in RabbitMQ?. Công việc email của bạn sẽ vẫn cần phải xử lý bất kỳ bản ghi chưa được xử lý nào kể từ khi trì hoãn không phải là một phương pháp xác định đối phó với xử lý được phân phối.

Điều đó nói rằng, cảm giác như có chỗ để cải thiện thiết kế của bạn. Nói chung với kiến ​​trúc dịch vụ, ý tưởng tồi của nó là chia sẻ các bảng db giữa các dịch vụ. Nó dẫn đến các vấn đề về giao dịch và chia tỷ lệ. Tôi sẽ cố gắng đảm bảo rằng thông báo RabbitMQ chứa tất cả dữ liệu cần thiết để xử lý email độc lập với bất kỳ dịch vụ nào khác. Hoặc nếu nó cần nhiều dữ liệu hơn, nó sẽ yêu cầu dữ liệu đó thông qua một yêu cầu ServiceBus thay vì truy vấn DB.

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