Viết một hệ thống xếp hàng cơ bản khá đơn giản, nhưng như bạn đã lưu ý ở trên với tất cả các thách thức, thực hiện đúng là một vấn đề khác. Tôi đã sử dụng các hệ thống được trồng tại nhà mà tôi đã viết mã nguồn, hệ thống bên thứ 3 và các nhà cung cấp JMS khác nhau. JMS (Dịch vụ nhắn tin Java) cho đến nay là giải pháp hoàn chỉnh nhất mà tôi gặp phải cho đến nay. Phần lớn những gì bạn yêu cầu có sẵn trong JMS. Nhà cung cấp JMS yêu thích của tôi là ActiveMQ. Miễn phí, hiệu suất, dễ cài đặt và quan trọng hơn là dễ dàng nhúng vào ứng dụng của tôi với Spring. Các nhà cung cấp JMS không cung cấp mọi thứ bạn yêu cầu, nhưng họ cung cấp một bộ công cụ để xử lý phần lớn những gì bạn đã hỏi nếu ứng dụng của bạn cần. Tôi chưa tìm thấy nhiều ứng dụng cần mọi thứ bạn liệt kê. Đặt hàng có thể không quan trọng (tốt nhất là không),
http://activemq.apache.org/what-open-source-integration-solution-works-best-with-activemq-.html
Nó có mạnh hay mất đơn đặt hàng? Vâng. Nó có cả hai tùy thuộc vào nhu cầu chương trình của bạn. Dưới đây là chi tiết: http://activemq.apache.org/total-ordering.html .
Liệu nó có đặt idempotent? Không, nhưng điều này là không quan trọng để thực hiện trong lớp ứng dụng của bạn nếu bạn cần điều đó.
Chúng ta có thể có nhiều hàng đợi hơn những gì có thể vừa trên một máy không? Vâng. Bạn có thể có các máy chủ phân cụm và nếu bạn muốn thiết lập nhiều máy với các hàng đợi khác nhau bạn có thể và kéo từ một trong hai.
Chúng ta có thể có nhiều dữ liệu trong một hàng đợi hơn những gì có thể vừa trên một máy không? Có, hầu hết các nhà cung cấp JMS phải sử dụng một số loại lưu trữ DB / lưu trữ liên tục để đảm bảo các tin nhắn không bị mất hoặc bị mất nếu nhà cung cấp JMS ngừng hoạt động.
Có bao nhiêu máy có thể sập trước khi chúng ta có khả năng mất dữ liệu? Điều này hơi khó trả lời vì nó liên quan đến thời gian. Tuy nhiên, bạn có thể đánh sập một nhà cung cấp JMS và với điều kiện đĩa không bị hỏng, nó sẽ quay trở lại và bắt đầu nơi nó nhận được cam kết cuối cùng. Điều này có nghĩa là tin nhắn có thể được gửi hai lần, nhưng nếu bạn viết mã cho ứng dụng của mình để xử lý thì đây không phải là vấn đề. Miễn là bạn có ít nhất một trong mỗi loại (nhà sản xuất, người tiêu dùng hoặc máy chủ JMS), nó sẽ hoàn thành. Bạn cũng có thể có tải / cân bằng / chuyển đổi dự phòng để dự phòng nếu một đĩa đi ra ngoài bạn.
Nó có thể đẩy mạnh chia tách mạng? Tôi nghĩ tôi hiểu ý của bạn khi nói "chia mạng", nhưng tôi không hoàn toàn chắc chắn. Tôi đoán bạn có nghĩa là nếu các máy chủ JMS được phân cụm và chúng tôi mất kết nối với một trong các máy chủ thì nó sẽ nhảy sang một máy chủ khác và lấy ra nơi nó rời đi. Có, nhưng một lần nữa các loại tình huống này có thể dẫn đến các tin nhắn trùng lặp tùy thuộc vào thời điểm máy khách bị mất kết nối.
Nó có thể tự động điều hòa dữ liệu khi chia tách mạng không? Nếu bạn đang sử dụng các phiên giao dịch, nó sẽ chỉ phân phối lại bất kỳ thư nào đã có một cam kết được gọi trên đó cho các khách hàng hiện có.
Nó có thể đảm bảo giao hàng khi khách hàng có thể sụp đổ? Vâng, đây là một trong những mục tiêu chính của JMS. Chuyển phát được đảm bảo có nghĩa là nếu một tin nhắn được xếp hàng thì nó được đảm bảo sẽ được xử lý bởi khách hàng.
Nó có thể đảm bảo rằng cùng một thông điệp không được gửi nhiều hơn một lần không? Có nếu các phiên giao dịch đang được sử dụng. Điều đó có nghĩa là một khách hàng đã chấp nhận tin nhắn và được gọi là commit / rollback. Khi cam kết được gọi, nó sẽ không gửi lại tin nhắn.
Một nút có thể sụp đổ tại bất kỳ điểm nào, quay lại và không gửi rác? Trong trường hợp bạn có hàng đợi cụm bền. Có, nó sẽ không phun "rác" nếu nút khác trong cụm đã gửi tin nhắn. Nó vẫn có thể giao lại bất cứ thứ gì chưa được thừa nhận.
Bạn có thể thêm các nút vào hoặc xóa các nút khỏi cụm đang chạy mà không mất thời gian không? Vâng.
Bạn có thể nâng cấp các nút trong một cụm đang chạy mà không có thời gian không? Đây là một mẹo nhỏ hơn để tôi trả lời, nhưng tôi tin rằng có bạn có thể làm điều này.
Nó có thể chạy mà không gặp vấn đề trên các máy chủ không đồng nhất? Điều này có nghĩa là chính xác? Tôi đã tìm thấy hầu hết các nhà cung cấp JMS rất dễ chạy trong các môi trường sử dụng phần cứng, HĐH khác nhau, v.v. Mặc dù, nếu bạn muốn nói là hiệu suất, đó là một điều hoàn toàn khác. Bất kỳ hệ thống xử lý phân tán nào cũng có thể bị tác động tiêu cực bởi một nút chậm. Tôi đã có 2 máy chủ Intel 8 lõi chạy hàng đợi và người tiêu dùng. Đó là 16 lõi với nhau và tôi có hiệu suất tốt hơn khi chỉ sử dụng hai hộp đó, so với khi tôi thêm một máy lõi đơn với tư cách là người tiêu dùng. Cái máy lõi đơn đó chậm đến mức nó làm chậm toàn bộ lưới điện với hệ số gấp đôi. Điều này không có gì để làm với JMS mỗi se.
Bạn có thể xếp hàng que que vào một nhóm máy chủ không? Câu trả lời ngắn có. Tôi có thể nghĩ ra một cách mà bạn có thể chạy một cụm chỉ trong trung tâm dữ liệu châu Âu và định cấu hình hàng đợi ở đó. Sau đó, trong cấu hình mùa xuân của bạn, thiết lập khách hàng của bạn để tiêu thụ hàng đợi đó cũng như các hàng đợi khác trên các cụm khác. Bạn có thể muốn tham khảo tài liệu:
http://activemq.apache.org/clustering.html
Nó có thể đảm bảo đặt các bản sao dữ liệu vào ít nhất hai trung tâm dữ liệu, nếu có sẵn không? Một lần nữa tôi tin như vậy, nhưng tốt nhất là tham khảo các tài liệu phân cụm.
Một lần nữa JMS có rất nhiều tùy chọn bạn có thể điều chỉnh khi nhu cầu của bạn ra lệnh. Sử dụng các phiên giao dịch và hàng đợi bền đi kèm với chi phí hiệu suất. Tôi đã thấy bật tất cả các chuông và còi hiệu suất tác động lên đến 10 lần. Khi tôi sử dụng JBossMQ nếu chúng tôi tắt một số tính năng này, chúng tôi có thể nhận được khoảng 10.000 tin nhắn / giây, nhưng việc bật chúng đã đưa chúng tôi xuống 1000 tin nhắn / giây. Giọt lớn.