Các giải pháp cho vấn đề hàng đợi phân tán là gì?


23

Tôi đang cố gắng tìm hiểu thêm về các cách khác nhau mà vấn đề của Hàng đợi phân tán có thể được giải quyết. Vì vậy, tôi muốn biết những sản phẩm, dịch vụ, triển khai và tài liệu nghiên cứu đã được đưa ra ngoài đó.

Một triển khai sẽ đối mặt với nhiều thách thức và sẽ buộc phải đánh đổi:

  • Nó có thứ tự mạnh hay lỏng?
  • Liệu nó có đặt idempotent?
  • 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?
  • 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ó bao nhiêu máy có thể sập trước khi chúng ta có khả năng mất dữ liệu?
  • Nó có thể chịu đựng được sự chia tách mạng?
  • Nó có thể tự động điều hòa dữ liệu khi chia tách mạng không?
  • Nó có thể đảm bảo giao hàng khi khách hàng có thể sụp đổ?
  • 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?
  • 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?
  • 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?
  • 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?
  • Nó có thể chạy mà không gặp vấn đề trên các máy chủ không đồng nhất?
  • Bạn có thể xếp hàng que que vào một nhóm máy chủ không? (ví dụ: các hàng đợi này chỉ được phép trong trung tâm dữ liệu châu Âu
  • 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?

Tôi không có ảo tưởng rằng bất kỳ việc thực hiện nào cũng có thể nói là có đúng với tất cả những điều đó. Tôi chỉ muốn nghe về các triển khai khác nhau; cách họ làm việc, những gì họ đã thực hiện và có lẽ tại sao họ quyết định về sự đánh đổi cụ thể của họ.

Ngoài ra nếu có bất kỳ thử thách nào mà tôi có thể đã bỏ lỡ trong danh sách trên.

Câu trả lời:


13

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.


Cảm ơn bạn đã dành thời gian với câu trả lời này. Phân chia mạng là khi một số nút trong cụm không thể giao tiếp với phần còn lại. Theo các máy chủ không đồng nhất, tôi chủ yếu có nghĩa là các lượng RAM khác nhau - một số hệ thống phân tán thích nó khi các máy chủ trông giống nhau.
Chris Vest

Sau đó, chắc chắn có trên Netsplits. Nếu người tiêu dùng gặp sự cố hoặc không thể liên lạc, họ sẽ tiếp tục cố gắng kết nối. Các công việc được trao cho nó mà không nhận được cam kết sau đó sẽ được giao lại cho người tiêu dùng khác. Nếu nhà cung cấp JMS ngừng hoạt động và bạn có các thành viên khác của các thông báo cụm có thể được sao chép trên toàn cụm để tránh mất tin nhắn.
chubbsondub

Không có yêu cầu nào về việc máy móc phải giống hệt nhau cho dù là RAM, Phần cứng hay HĐH. Bạn có thể chạy một túi hỗn hợp của máy nếu bạn cần. Mối quan tâm duy nhất là điều tôi lưu ý là hiệu suất liên quan đến các máy không giống nhau sẽ xử lý tin nhắn ở các mức khác nhau có thể dẫn đến thông lượng thấp hơn. Tuy nhiên, mô hình JMS phần nào giảm thiểu điều này bằng thực tế là nó kéo thay vì mô hình đẩy. Mô hình đẩy nhạy cảm hơn nhiều với các loại vấn đề.
chubbsondub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.