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.