2009-12-01 41 views
71

như trái ngược với việc viết thư viện của riêng bạn.Tại sao sử dụng AMQP/ZeroMQ/RabbitMQ

Chúng tôi đang làm việc trên một dự án ở đây sẽ là một nhóm máy chủ tự phân chia, nếu một phần phát triển quá nặng, người quản lý sẽ chia nó và đặt nó trên một máy khác như một quá trình riêng biệt. Nó cũng sẽ cảnh báo tất cả các máy khách kết nối này ảnh hưởng đến kết nối đến máy chủ mới.

Tôi tò mò về việc sử dụng ZeroMQ cho liên lạc giữa các máy chủ và liên ngành. Đối tác của tôi muốn cuộn của riêng mình. Tôi đang tìm đến cộng đồng để trả lời câu hỏi này.

Tôi là một lập trình viên khá mới mẻ và đã học về hàng đợi tin nhắn. Như tôi đã googled và đọc, có vẻ như tất cả mọi người đang sử dụng hàng đợi tin nhắn cho tất cả các loại của sự vật, nhưng tại sao? Điều gì làm cho chúng tốt hơn là viết thư viện của riêng bạn? Tại sao chúng quá phổ biến và tại sao lại có quá nhiều?

+2

Lý do bạn không nên viết thư viện của riêng mình là bởi vì, theo cách của bạn, bạn là "một lập trình viên khá mới làm quen". Tại sao bạn muốn sử dụng một thư viện MQ được viết bởi một lập trình viên mới? – Jeff

Trả lời

75

điều gì làm cho chúng tốt hơn là viết thư viện của riêng bạn?

Khi tung ra phiên bản đầu tiên của ứng dụng của bạn, có lẽ không có gì: nhu cầu của bạn được xác định rõ ràng và bạn sẽ phát triển một hệ thống tin nhắn đó sẽ phù hợp với nhu cầu của bạn: danh sách tính năng nhỏ, mã nguồn nhỏ vv

Các công cụ này là rất hữu ích sau bản phát hành đầu tiên, khi bạn thực sự phải mở rộng ứng dụng của mình và thêm nhiều tính năng khác cho ứng dụng đó. Hãy để tôi cung cấp cho bạn một vài trường hợp sử dụng:

  • ứng dụng của bạn sẽ phải nói chuyện với một máy big endian (sparc/powerpc) từ một máy little endian (x86, Intel/AMD). Hệ thống nhắn tin của bạn có một số giả định đặt hàng cuối cùng: đi và sửa nó
  • bạn đã thiết kế ứng dụng của mình sao cho nó không phải là hệ thống giao thức/nhắn tin nhị phân và bây giờ nó rất chậm vì bạn dành phần lớn thời gian của mình để phân tích cú pháp. tăng và phân tích cú pháp trở thành nút cổ chai): thích ứng với nó để nó có thể chuyển mã nhị phân/cố định
  • lúc đầu bạn có 3 máy bên trong lan, không có sự chậm trễ đáng kể.client/boss/pointy-haired-devil-boss của bạn xuất hiện và cho bạn biết rằng bạn sẽ cài đặt ứng dụng trên WAN mà bạn không quản lý - và sau đó bạn bắt đầu gặp lỗi kết nối, độ trễ xấu, v.v. bạn cần lưu trữ tin nhắn và thử gửi lại sau này: quay lại mã và cắm công cụ này vào (và tận hưởng)

  • thư được gửi cần phải có câu trả lời, nhưng không phải tất cả chúng: bạn gửi một số tham số và mong đợi bảng tính thay vì chỉ cần gửi và thừa nhận, quay lại mã và cắm công cụ này vào (và tận hưởng.)

  • một số thư quan trọng và việc tiếp nhận/gửi cần sao lưu/kiên trì thích hợp /. Lý do tại sao bạn hỏi ? mục đích kiểm tra

Và nhiều trường hợp sử dụng khác mà tôi quên ...

Bạn có thể thực hiện nó cho mình, nhưng không dành nhiều thời gian làm như vậy: có thể bạn sẽ thay thế nó sau này anyway.

+0

ahh, cảm ơn bạn rất nhiều. Điều này chắc chắn mang lại cho tôi một số thức ăn cho sự suy nghĩ. –

+0

Theo hướng dẫn zeromq chính thức, zeromq không cung cấp tính bền bỉ. Hướng dẫn này cho bạn thấy cách thực hiện điều này, nhưng tôi muốn có một cái gì đó có tính bền bỉ trong khung công tác, không sử dụng một số mã hướng dẫn được thử nghiệm kém! –

+3

Không đồng ý về "khi triển khai phiên bản đầu tiên của ứng dụng, có thể không có gì" Bạn hoàn thành bằng cách nói phiên bản đầu tiên sẽ được viết lại với thư viện, cũng có thể bắt đầu bằng thứ gì đó mà bạn không kết thúc. Nếu không, tôi đồng ý. –

6

điều gì làm cho chúng tốt hơn là viết thư viện của riêng bạn?

Hệ thống xếp hàng thư là giao dịch, dễ sử dụng về mặt khái niệm với tư cách khách hàng, nhưng khó có được quyền làm người triển khai, đặc biệt là xem xét hàng đợi liên tục. Bạn có thể nghĩ rằng bạn có thể lấy đi bằng cách viết một thư viện nhắn tin nhanh, nhưng không có giao dịch và sự kiên trì, bạn sẽ không có đầy đủ lợi ích của một hệ thống nhắn tin.

Tính bền vững trong ngữ cảnh này có nghĩa là phần mềm trung gian nhắn tin giữ các thư không được lưu trữ trong bộ nhớ vĩnh viễn (trên đĩa) trong trường hợp máy chủ bị hỏng; sau khi khởi động lại, các tin nhắn có thể được xử lý và không cần truyền lại (người gửi thậm chí không biết có vấn đề gì). Giao dịch có nghĩa là bạn có thể đọc tin nhắn từ các hàng đợi khác nhau và viết tin nhắn đến các hàng đợi khác nhau theo cách giao dịch, có nghĩa là tất cả các lần đọc và viết thành công hoặc (nếu một hoặc nhiều lỗi) không thành công. Điều này không thực sự khác nhiều so với giao dịch được biết đến từ giao tiếp với cơ sở dữ liệu và có cùng lợi ích (nó đơn giản hóa việc xử lý lỗi; không có giao dịch, bạn phải đảm bảo rằng mỗi thành viên đọc/ghi thành công và nếu một hoặc nhiều thất bại, bạn có để khôi phục những thay đổi đó đã thành công).

+1

Tôi đã suy nghĩ về điều này trong một thời gian ngắn. Chính xác bạn ngụ ý gì bởi Giao dịch và Sự kiên trì? Tôi hiểu những từ ngữ chứ không phải ngữ cảnh ở đây. Đơn giản chỉ cần nói, nó đổ chuông của những từ buzz. –

+2

Tôi sẽ không gọi những buzzwords này; kiên trì và giao dịch đã được biết đến dưới những cái tên này trong nhiều thập kỷ. Tôi đã chỉnh sửa câu trả lời của mình để xây dựng những điểm này trong ngữ cảnh nhắn tin. – pmf

+0

Thú vị, nhưng điều gì khiến cho những thứ này khó có được đúng không? Từ quan điểm của tôi có vẻ như, nếu tôi đang viết một máy chủ và máy khách, bạn gửi tin nhắn, đảm bảo rằng tin nhắn được nhận đầy đủ, và giữ một bản sao của tin nhắn được lưu trữ vào đĩa. Đó là kết thúc của nó. tại sao có rất nhiều phiên bản của một hệ thống đơn giản như vậy? Tôi có nghĩa là rất nhiều trong số họ là khá nhỏ mã khôn ngoan, một khi bạn có một hiểu về cách họ làm việc nó không có vẻ đòi hỏi nhiều để thực hiện. Vì vậy, nó trở lại lý do tại sao sử dụng hàng đợi tin nhắn được viết sẵn. –

38

Điều đó rất giống với yêu cầu: tại sao lại sử dụng cơ sở dữ liệu khi bạn có thể tự viết?

Câu trả lời là sử dụng công cụ đã được sử dụng trong một thời gian và được hiểu rõ trong nhiều trường hợp sử dụng khác nhau, trả tiền nhiều hơn và nhiều hơn theo thời gian và yêu cầu của bạn phát triển. Điều này đặc biệt đúng nếu có nhiều hơn một nhà phát triển tham gia vào một dự án. Bạn có muốn trở thành nhân viên hỗ trợ cho một hệ thống xếp hàng nếu bạn thay đổi một dự án mới? Sử dụng một công cụ ngăn chặn điều đó xảy ra. Nó trở thành vấn đề của người khác.

Trường hợp tại điểm: kiên trì. Viết một công cụ để lưu trữ một tin nhắn trên đĩa rất dễ dàng. Viết một persistor có tỷ lệ và hoạt động tốt ổn định, trong nhiều trường hợp sử dụng khác nhau, và có thể quản lý và giá rẻ để hỗ trợ, rất khó. Nếu bạn muốn xem ai đó phàn nàn về việc khó khăn như thế nào thì hãy xem xét điều này: http://www.lshift.net/blog/2009/12/07/rabbitmq-at-the-skills-matter-functional-programming-exchange

Dù sao, tôi hy vọng điều này sẽ hữu ích. Bằng mọi cách, hãy viết công cụ của riêng bạn. Nhiều người đã làm như vậy. Bất cứ điều gì giải quyết vấn đề của bạn, là tốt.

+1

Hoặc trình biên dịch. Tại sao bận tâm sử dụng một ngôn ngữ biên dịch khi người ta có thể viết ngôn ngữ lắp ráp tinh khiết, unadulterated tất cả các thời gian? :-) – Jeff

17

Tôi đang xem xét sử dụng ZeroMQ bản thân mình - do đó tôi tình cờ gặp phải câu hỏi này.

Hãy giả sử cho thời điểm bạn có khả năng triển khai hệ thống xếp hàng thư đáp ứng tất cả các yêu cầu của bạn. Tại sao bạn sẽ áp dụng ZeroMQ (hoặc thư viện bên thứ ba khác) theo cách tiếp cận của chính bạn? Đơn giản - chi phí.

Giả sử trong một khoảnh khắc ZeroMQ đã đáp ứng tất cả các yêu cầu của bạn. Tất cả những gì cần phải được thực hiện là tích hợp nó vào xây dựng của bạn, đọc một số doco và sau đó bắt đầu sử dụng nó. Đó là nỗ lực ít hơn nhiều so với việc lăn của riêng bạn. Thêm vào đó, gánh nặng bảo trì đã được chuyển sang một công ty khác. Vì ZeroMQ là miễn phí, nó giống như bạn vừa phát triển đội ngũ phát triển của mình để bao gồm (một phần) nhóm ZeroMQ.

Nếu bạn điều hành một doanh nghiệp phát triển phần mềm, tôi nghĩ rằng bạn sẽ cân bằng chi phí/rủi ro khi sử dụng thư viện của bên thứ ba để tự mình triển khai và trong trường hợp này, sử dụng ZeroMQ sẽ thắng tay.

Có lẽ bạn (hoặc đúng hơn là đối tác của bạn) phải chịu đựng, như rất nhiều nhà phát triển thực hiện, từ hội chứng "Not Invented Here"? Nếu vậy, hãy điều chỉnh thái độ của bạn và đánh giá lại việc sử dụng ZeroMQ. Cá nhân, tôi rất thích những lợi ích của thái độ tự hào được tìm thấy ở nơi khác. Tôi hy vọng tôi có thể tự hào về việc tìm kiếm ZeroMQ ... thời gian sẽ nói.

EDIT: Tôi đã xem qua số này video từ các nhà phát triển ZeroMQ nói về lý do tại sao bạn nên sử dụng ZeroMQ.

+0

tôi có xu hướng đồng ý với bạn đến một điểm .. ive đã làm việc với một vài chương trình trong vài tháng qua trong C + + kể từ khi câu hỏi này được hỏi .. và ive chạy vào địa ngục đó là libs bên thứ 3. một số là tương đối không đau .. nhưng rất nhiều người trong số họ thêm rắc rối nhiều hơn họ có giá trị .. chỉ cần cố gắng để cài đặt chúng. Tôi vẫn không chắc chắn tại sao bất cứ ai có yêu cầu về zeroMQ .. một trong những điều đầu tiên tôi học viết là làm thế nào để gửi tin nhắn từ chương trình này sang chương trình khác thông qua TCP và ổ cắm cho một chương trình trò chuyện rất đơn giản, nó tương đối dễ dàng .. –

+1

Hoàn toàn đồng ý rằng nhiều (có thể nhất?) Libs của bên thứ ba gặp nhiều rắc rối hơn chúng đáng giá.Tôi đoán tôi đã tìm thấy một số đá quý thực sự trong những năm mà tôi đang hạnh phúc hơn để làm việc với. Tôi vừa biên dịch ZeroMQ và chạy thử nghiệm của họ. Nó trông khá tốt. Nó chưa có trạng thái "đá quý", nhưng chúng ta sẽ thấy ... –

+1

Chỉ cần theo dõi - Tôi đã tìm thấy ZeroMQ khá tốt. Nó chắc chắn là rất nhẹ và nhanh. Tôi không thích cách Socket của họ có ái lực chủ đề như tôi muốn sử dụng hai luồng để truy cập vào socket - một để đọc tin nhắn và một để viết tin nhắn. Nó nghĩ rằng cách "ZeroMQ" để làm điều này là sử dụng hàng đợi thông điệp trong quá trình để sắp xếp các thông điệp giữa các chủ đề ... cần nhiều suy nghĩ hơn. –

2

Nếu bạn có một chút thời gian để thử và triển khai quá trình thực hiện của riêng bạn! Các bài học của bài tập này sẽ thuyết phục bạn về sự khôn ngoan của việc sử dụng một thư viện đã được kiểm tra.

4

Trước khi viết thư viện riêng của bạn, đọc Hướng dẫn 0MQ đây: http://zguide.zeromq.org/page:all

Rất có thể rằng bạn sẽ hoặc quyết định cài đặt RabbitMQ, nếu không bạn sẽ làm cho thư viện của bạn trên đầu trang của ZeroMQ vì họ đã làm tất cả các phần cứng.

+2

Họ đã thực hiện một số "phần cứng" trong hướng dẫn thời trang trong hướng dẫn (ví dụ: kiên trì). Tôi thà sử dụng việc thực hiện thử nghiệm chiến đấu hơn là một số mã hướng dẫn được thử nghiệm kém. –

+1

Nếu bạn muốn thực hiện thử nghiệm chiến đấu, sau đó bạn sẽ chọn AMQP thay vì ZMQ và sử dụng một cái gì đó như RabbitMQ –