Có OK không nếu một số thư bị trùng lặp hoặc bị mất? Khi máy khách JMS kết nối với nhà môi giới JMS qua mạng, có ba giai đoạn cho bất kỳ cuộc gọi API nào.
- Cuộc gọi API, bao gồm mọi dữ liệu tin nhắn, được truyền qua dây cho người môi giới.
- Cuộc gọi API được thực hiện bởi người môi giới.
- Mã kết quả và mọi dữ liệu tin nhắn được truyền lại cho khách hàng.
Hãy xem xét các nhà sản xuất trong một phút. Nếu kết nối bị hỏng trong bước đầu tiên thì nhà môi giới không bao giờ nhận được tin nhắn và ứng dụng sẽ cần phải gửi lại. Nếu kết nối bị hỏng ở bước thứ ba thì tin nhắn đã được gửi thành công và gửi lại sẽ tạo ra một thông báo trùng lặp. Các ứng dụng không thể nói sự khác biệt giữa những điều này và do đó, sự lựa chọn an toàn duy nhất là gửi lại tin nhắn về lỗi. Nếu phiên giao dịch được thông báo có thể được gửi lại một cách an toàn trong mọi trường hợp bởi vì nếu bản gốc đã được gửi cho người môi giới, nó sẽ được khôi phục.
Cân nhắc người tiêu dùng. Nếu kết nối bị mất ở bước thứ ba thì thông báo sẽ bị xóa khỏi hàng đợi nhưng không bao giờ được gửi lại cho máy khách. Nhưng nếu phiên giao dịch được thông báo thì sẽ được gửi lại khi ứng dụng kết nối lại.
Bên ngoài giao dịch có khả năng thư bị mất hoặc trùng lặp. Bên trong của một giao dịch cùng một cửa sổ của sự mơ hồ tồn tại nhưng nó là trên các cuộc gọi COMMIT chứ không phải là PUT hoặc GET. Với phiên giao dịch, bạn có thể gửi hoặc nhận tin nhắn hai lần nhưng không thể mất một lần.
Các JMS đặc tả công nhận cửa sổ này mơ hồ và cung cấp các hướng dẫn sau đây:
Nếu một thất bại xảy ra giữa lần một khách hàng cam kết công việc của mình trên một phiên và phương pháp cam kết lợi nhuận, khách hàng không thể xác định nếu giao dịch được thực hiện hoặc được khôi phục. Sự mơ hồ tương tự tồn tại khi xảy ra sự cố giữa số gửi không giao dịch của thông báo NGƯỜI DÙNG và trả lại từ phương thức gửi .
Nó tùy thuộc vào ứng dụng JMS để xử lý với sự mơ hồ này. Trong một số trường hợp, điều này có thể khiến khách hàng tạo ra các thông báo trùng lặp chức năng .
Thư được gửi lại do khôi phục phiên không được coi là một thông báo trùng lặp .
Các phiên JMS phải luôn được giao dịch ngoại trừ trường hợp thật sự mất thông báo. Nếu các phiên được giao dịch thì bạn cần phiên và kết nối cho mỗi luồng do mô hình chuỗi JMS.
Bất kỳ lời khuyên nào về tác động hiệu suất sẽ là nhà cung cấp cụ thể nhưng trong các thông báo liên tục nói chung bên ngoài điểm đồng bộ hóa được cứng vào đĩa trước khi trả về cuộc gọi API. Nhưng cuộc gọi được giao dịch có thể trở lại trước khi thông báo liên tục được ghi vào đĩa miễn là thông báo được duy trì trước khi COMMIT trả về. Nếu nhà cung cấp tối ưu hóa dựa trên điều này, sau đó nó là nhiều hơn nữa performant để viết một số tin nhắn vào đĩa và sau đó cam kết chúng theo lô. Điều này cho phép các nhà môi giới để tối ưu hóa ghi và đĩa tuôn ra bởi khối đĩa chứ không phải là cho mỗi tin nhắn. Số lượng tin nhắn được đặt trong giao dịch giảm theo kích thước của tin nhắn và vượt quá một kích thước tin nhắn nào đó sẽ giảm xuống một.
Nếu thư 20k của bạn tương đối nhỏ (được đo bằng k và không phải mb) thì bạn có thể muốn sử dụng phiên giao dịch cho mỗi chuỗi và điều chỉnh khoảng thời gian cam kết.