Hàng đợi tin nhắn so với dịch vụ web? [đóng cửa]


258

Trong những điều kiện nào người ta sẽ ưu tiên các ứng dụng nói chuyện qua hàng đợi tin nhắn thay vì qua các dịch vụ web (tôi chỉ có nghĩa là XML hoặc JSON hoặc YAML hoặc bất cứ điều gì qua HTTP ở đây, không phải bất kỳ loại cụ thể nào)?

Tôi phải nói chuyện giữa hai ứng dụng trên mạng cục bộ. Một sẽ là một ứng dụng web và phải yêu cầu các lệnh trên một ứng dụng khác (chạy trên phần cứng khác nhau). Các yêu cầu là những thứ như tạo người dùng, di chuyển tệp và tạo thư mục. Trong những điều kiện nào tôi sẽ thích Dịch vụ web XML (hoặc TCP thẳng hoặc một cái gì đó) để sử dụng hàng đợi Tin nhắn?

Ứng dụng web là Ruby on Rails, nhưng tôi nghĩ câu hỏi còn rộng hơn thế.

Câu trả lời:


315

Khi bạn sử dụng dịch vụ web, bạn có máy khách và máy chủ:

  1. Nếu máy chủ bị lỗi, máy khách phải chịu trách nhiệm xử lý lỗi.
  2. Khi máy chủ hoạt động trở lại, máy khách có trách nhiệm gửi lại nó.
  3. Nếu máy chủ đưa ra phản hồi cho cuộc gọi và máy khách bị lỗi thì thao tác sẽ bị mất.
  4. Bạn không có sự tranh chấp, đó là: nếu hàng triệu khách hàng gọi một dịch vụ web trên một máy chủ trong một giây, rất có thể máy chủ của bạn sẽ ngừng hoạt động.
  5. Bạn có thể mong đợi phản hồi ngay lập tức từ máy chủ, nhưng bạn cũng có thể xử lý các cuộc gọi không đồng bộ.

Khi bạn sử dụng hàng đợi tin nhắn như RabbitMQ, Beanstalkd, ActiveMQ, IBM MQ Series, tuxedo bạn mong đợi các kết quả khác nhau và có khả năng chịu lỗi hơn:

  1. Nếu máy chủ bị lỗi, hàng đợi vẫn duy trì thông báo (tùy chọn, ngay cả khi máy tắt).
  2. Khi máy chủ hoạt động trở lại, nó sẽ nhận được thông báo đang chờ xử lý.
  3. Nếu máy chủ đưa ra phản hồi cho cuộc gọi và máy khách không thành công, nếu máy khách không xác nhận phản hồi thì tin nhắn vẫn tồn tại.
  4. Bạn có sự tranh chấp, bạn có thể quyết định có bao nhiêu yêu cầu được xử lý bởi máy chủ (thay vào đó gọi nó là worker).
  5. Bạn không mong đợi một phản hồi đồng bộ ngay lập tức, nhưng bạn có thể thực hiện / mô phỏng các cuộc gọi đồng bộ.

Hàng đợi tin nhắn có nhiều tính năng hơn nhưng đây là một số quy tắc để quyết định xem bạn muốn tự xử lý các điều kiện lỗi hay để chúng vào hàng đợi tin nhắn.


1
Nếu liên kết SOAP / JMS được sử dụng, người ta cũng có được sự ghép lỏng lẻo tại các dịch vụ web.
koppor

Đối với nhiều dịch vụ vi mô ở phía máy chủ nên được ưu tiên sử dụng dịch vụ Web hoặc Xếp hàng?
shivendra pratap singh

Kính gửi @sw. , tôi có thể biết nếu điều đó có nghĩa là chúng ta có thể đặt MQ trước các trang web bình thường không? Giả sử tôi có Trang web Wordpress (LAMP stack). Tôi có thể sử dụng MQ trước Apache để các yêu cầu đến 1 sau 1 không, thay vì tất cả đến cùng một lúc. Trong trường hợp này, Khách hàng (Trình duyệt) được kết nối với MQ thay vì Apache, phải không? Nhưng sau đó, các Trình duyệt có giữ kết nối HTTP mở và tiếp tục chờ đợi Apache phản hồi không? Xin hãy giúp tôi hiểu một chút về điều này. Đánh giá cao lòng tốt của bạn.
夏 期

@ 夏 期 case trường hợp sử dụng của bạn là gì? Bạn đang cố gắng đạt được điều gì có lợi cho người dùng cuối bằng trình duyệt?
sw.

Những mối quan tâm này với các thiết lập máy khách / máy chủ có còn là mối quan tâm giữa hàng đợi và máy chủ và giữa máy khách và hàng đợi không? Có vẻ như mô hình máy khách / máy chủ vẫn tồn tại và hiện ở hai nơi.
fantasyerTháng

75

Đã có một số lượng lớn các nghiên cứu gần đây trong việc xem xét cách các cuộc gọi REST HTTP có thể thay thế khái niệm hàng đợi tin nhắn.

Nếu bạn giới thiệu khái niệm về một quy trình và một nhiệm vụ như một tài nguyên, thì nhu cầu về lớp nhắn tin giữa sẽ bắt đầu bay hơi.

Ví dụ:

POST /task/name
    - Returns a 202 accepted status immediately
    - Returns a resource url for the created task: /task/name/X
    - Returns a resource url for the started process: /process/Y

GET /process/Y
    - Returns status of ongoing process

Một tác vụ có thể có nhiều bước để khởi tạo và một quy trình có thể trả về trạng thái khi được thăm dò hoặc POST vào URL gọi lại khi hoàn tất.

Điều này thật đơn giản và trở nên khá mạnh mẽ khi bạn nhận ra rằng bây giờ bạn có thể đăng ký một nguồn cấp dữ liệu rss / nguyên tử của tất cả các quy trình và tác vụ đang chạy mà không cần bất kỳ lớp giữa nào. Bất kỳ hệ thống xếp hàng nào cũng sẽ yêu cầu một số loại giao diện web, và khái niệm này được tích hợp sẵn mà không cần một lớp mã tùy chỉnh khác.

Tài nguyên của bạn tồn tại cho đến khi bạn xóa chúng, điều đó có nghĩa là bạn có thể xem thông tin lịch sử lâu sau khi quá trình và nhiệm vụ hoàn thành.

Bạn đã xây dựng trong khám phá dịch vụ, ngay cả đối với một tác vụ có nhiều bước, không có bất kỳ giao thức phức tạp nào.

GET /task/name
    - returns form with required fields

POST (URL provided form's "action" attribute)

Khám phá dịch vụ của bạn là một dạng HTML - một định dạng phổ quát và có thể đọc được.

Toàn bộ dòng chảy có thể được sử dụng theo chương trình hoặc bởi con người, sử dụng các công cụ được chấp nhận phổ biến. Đó là một khách hàng điều khiển, và do đó RESTful. Mỗi công cụ được tạo cho web có thể thúc đẩy các quy trình kinh doanh của bạn. Bạn vẫn có các kênh thông báo thay thế bằng cách POST không đồng bộ vào một mảng các máy chủ nhật ký riêng biệt.

Sau khi bạn xem xét nó một lúc, bạn ngồi lại và bắt đầu nhận ra rằng REST có thể loại bỏ nhu cầu về hàng đợi nhắn tin và ESB hoàn toàn.

http://www.infoq.com/presentations/BPM-with-REST


11
@tempire những gì về khả năng chịu lỗi và như vậy? REST rất tuyệt, nhưng nhà phát triển cuối cùng đã xây dựng phần mềm trung gian cho anh ấy / cô ấy
Dan Rosenstark 21/03

10
@Yar Hầu hết các câu hỏi về 'những gì về điều này' có thể được nêu lại, 'nó được xử lý như thế nào trên web?'. Dung sai lỗi có thể được xử lý thông qua các bộ cân bằng tải hoặc thậm chí thao tác với các bản ghi dns. Có một vài vấn đề khác cần giải quyết, như khả năng mở rộng theo chiều ngang - web vốn không xử lý tốt điều đó (ví dụ như các cuộc tấn công ddos).
tempire

8
@tempire, không có giao hàng đảm bảo trên Web, phải không? Tôi nhấn trình và cầu nguyện rằng thông điệp sẽ đến đích. Với một MQ, tôi biết rằng nếu tôi đến MQ thì tôi đã hoàn thành. Nó sẽ xử lý nhận được tin nhắn đến đích.
Dan Rosenstark

10
@Yar xem xét "giao hàng được đảm bảo" nghĩa là gì. Nó chỉ được 'đảm bảo' là thời gian hoạt động của hàng đợi tin nhắn. Thay thế hàng đợi tin nhắn bằng (các) máy chủ REST xử lý các tác vụ và quy trình dưới dạng tài nguyên và bạn có cùng một 'bảo đảm' như mọi thứ khác. Về cơ bản, bạn vẫn có một hàng đợi tin nhắn, nhưng ở định dạng web có thể truy cập được, có thể được theo dõi bằng bất kỳ công cụ web nào.
tempire

16
@Yar - Tôi không nghĩ nhiều người hiểu định nghĩa vấn đề MQ đang cố gắng giải quyết đủ để thậm chí xem xét những điều như vậy. Họ hiểu MQ, nhưng khác với hiểu không gian vấn đề. Tuy nhiên, đây là một vấn đề phổ biến, bởi vì tôi nghĩ rằng hầu hết các lập trình viên & quản lý trên thế giới đã được đào tạo để kết nối các phần thay vì các giải pháp kỹ sư.
tempire

32

Hàng đợi tin nhắn là lý tưởng cho các yêu cầu có thể mất nhiều thời gian để xử lý. Các yêu cầu được xếp hàng và có thể được xử lý ngoại tuyến mà không chặn ứng dụng khách. Nếu khách hàng cần được thông báo về việc hoàn thành, bạn có thể cung cấp một cách để khách hàng kiểm tra định kỳ trạng thái của yêu cầu.

Hàng đợi tin nhắn cũng cho phép bạn mở rộng quy mô tốt hơn theo thời gian. Nó cải thiện khả năng của bạn để xử lý các đợt hoạt động nặng, bởi vì quá trình xử lý thực tế có thể được phân phối theo thời gian.

Lưu ý rằng hàng đợi tin nhắn và dịch vụ web là các khái niệm trực giao, tức là chúng không loại trừ lẫn nhau. Ví dụ: bạn có thể có một dịch vụ web dựa trên XML hoạt động như một giao diện cho hàng đợi tin nhắn. Tôi nghĩ rằng sự khác biệt mà bạn đang tìm kiếm là Hàng đợi Tin nhắn so với Yêu cầu / Phản hồi, sau đó là khi yêu cầu được xử lý đồng bộ.


3
Vâng, tôi chỉ nghĩ vậy thôi: không phải là họ chặn hay không chặn. Đó là cho dù họ yêu cầu thời gian dài hơn và / hoặc không thể đoán trước để xử lý ... Về việc họ là trực giao, cũng đúng là các dịch vụ web có thể được sử dụng cho các yêu cầu dài (tất nhiên là bỏ và tách riêng). Tuy nhiên, nếu bạn có sự sang trọng của một hàng đợi tin nhắn, nó có thể là một ý tưởng tốt.
Dan Rosenstark

Câu hỏi mới của tôi là, điều gì sẽ xảy ra nếu muốn quá trình được đồng bộ hóa, nhưng không đồng bộ khi hết thời gian? Sau đó, có lẽ các dịch vụ web sẽ phù hợp hơn.
Dan Rosenstark

27

Hàng đợi tin nhắn không đồng bộ và có thể thử lại một số lần nếu việc gửi không thành công. Sử dụng hàng đợi tin nhắn nếu người yêu cầu không cần chờ phản hồi.

Cụm từ "dịch vụ web" khiến tôi nghĩ đến các cuộc gọi đồng bộ đến một thành phần phân tán qua HTTP. Sử dụng dịch vụ web nếu người yêu cầu cần phản hồi lại.


1
Cảm ơn vì điều đó, yeah "giao hàng được đảm bảo", tôi sẽ phải suy nghĩ xem điều đó có quan trọng không. Ý tôi là, đồng bộ hóa với async là một loại hương vị, theo một nghĩa nào đó. Mặc dù có những trường hợp rõ ràng là đen và trắng, nhưng cũng có một màu xám lớn ở giữa.
Dan Rosenstark

22

Tôi nghĩ nói chung, bạn muốn có một dịch vụ web cho một nhiệm vụ chặn (nhiệm vụ này cần phải được hoàn thành trước khi chúng tôi thực thi nhiều mã hơn) và một hàng đợi tin nhắn cho một nhiệm vụ không chặn (có thể mất nhiều thời gian, nhưng chúng tôi không Không cần phải đợi nó).


Các dịch vụ web cũng cung cấp các phương thức một chiều ( @Oneway ). Để nhận được câu trả lời, khách hàng phải cung cấp dịch vụ web.
koppor 15/05/2015
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.