Gần đây tôi đã bắt đầu tìm hiểu các sắc thái của kiến trúc máy tính doanh nghiệp và có thể mở rộng và một trong những thành phần trung tâm là hàng đợi nhắn tin. Để học được nhiều nhất có thể từ bất kỳ mô hình lập trình nào, tôi đang cố gắng thực hiện phiên bản dịch vụ xếp hàng nhắn tin của riêng mình.
Cho đến nay, thiết kế ban đầu của tôi chạy trên một trình nghe ổ cắm có luồng, nhưng để ngăn chặn cùng một thông điệp được tải xuống hai lần bởi hai nút xử lý riêng biệt, thanh ghi chỉ mục hàng đợi tin nhắn bị khóa khi bắt đầu đọc và mở khóa sau khi đăng ký được mở cập nhật. Như vậy, điều này phủ nhận sự cần thiết phải được xâu chuỗi, và có nghĩa là có một mức trần cho kích thước của một hệ thống có thể mở rộng dựa trên tốc độ xử lý của máy chủ mà dịch vụ hàng đợi nhắn tin đang chạy.
Cách khắc phục điều này sẽ là chạy dịch vụ xếp hàng tin nhắn trên nhiều máy chủ, nhưng điều này sẽ làm tăng khả năng cùng một tin nhắn được tải xuống hai lần. Cách duy nhất để ngăn chặn các sự cố như vậy xảy ra là bao gồm một cuộc gọi lại thu hồi mà (sau các máy chủ, hoặc thậm chí các luồng trên một máy chủ, đã đồng bộ hóa thông tin của chúng và phát hiện việc phát hành lại như vậy) sẽ ra lệnh cho nút xử lý dừng nút xử lý của nó công việc hiện tại và truy vấn lại hàng đợi tin nhắn cho tin nhắn tiếp theo, nhưng một lần nữa, sẽ có một mức trần mà hầu hết lưu lượng được gửi sẽ được đồng bộ hóa và hủy bỏ các cuộc gọi lại, gây ra tắc nghẽn và làm chậm quá trình xử lý thông tin để nhiều nút xử lý sẽ thực hiện các thao tác null và lãng phí thời gian.
Cách cuối cùng tôi có thể nghĩ ra để giải quyết vấn đề này là để mỗi máy chủ hàng đợi tin nhắn (và mỗi luồng trên mỗi máy chủ) sẽ có một phần bù cụ thể về vị trí của hàng đợi, nhưng điều đó có thể có vấn đề dựa trên loại ứng dụng, đặc biệt nếu việc xử lý được yêu cầu phải được thực hiện theo một thứ tự cụ thể.
Vì vậy, tất cả những gì đang được nói, có bất kỳ thiết kế nào của kiến trúc hàng đợi tin nhắn có thể cho tôi thấy làm thế nào các dịch vụ xếp hàng tin nhắn cấp doanh nghiệp hiện tại tránh được những vấn đề này không?