2011-07-20 29 views
5

Giả sử rằng một người quan tâm để viết một ứng dụng python nơi cần có sự giao tiếp giữa các quy trình khác nhau. Thông tin liên lạc sẽ được thực hiện bằng cách gửi các mảng strings và/hoặc numpy.Python: OpenMPI Vs. RabbitMQ

Các cân nhắc để thích OpenMPI so với công cụ như RabbitMQ là gì?

Trả lời

12

Không có câu trả lời đúng cho câu hỏi như vậy. Tất cả phụ thuộc vào một số lượng lớn các yếu tố khác nhau. Ví dụ:

  1. Bạn có loại truyền thông nào? Bạn đang gửi các gói lớn hoặc các gói nhỏ, bạn có cần băng thông tốt hay độ trễ thấp không?
  2. Bạn cần loại bảo lãnh giao hàng nào?
  3. OpenMPI ngay lập tức có thể gửi tin nhắn đến một quy trình đang chạy, trong khi các giải pháp MQ khác nhau có thể xếp hàng các thông điệp và cho phép các cấu hình người tiêu dùng sản xuất ưa thích.
  4. Bạn có loại mạng nào? Nếu bạn đang chạy trên localhost, một cái gì đó như ZeroMQ có lẽ sẽ là nhanh nhất. Nếu bạn đang chạy trên bộ máy chủ, phụ thuộc vào các kết nối có sẵn. Ví dụ. OpenMPI có thể sử dụng các liên kết infiniband/mirynet.
  5. Bạn đang xử lý loại xử lý nào? Với MPI tất cả các quá trình thường được bắt đầu cùng một lúc, thực hiện việc xử lý và chấm dứt tất cả cùng một lúc.
+0

abbot, cảm ơn bạn đã trả lời. Có, tôi đang gửi 'các gói lớn' (vài MB mỗi gói) trên mạng 100 máy; Tôi có một mạng 1G đơn giản. Không có gì lạ mắt; có thể có độ trễ nhỏ - không phải là nhanh nhất. – user3262424

+0

+1. Nói chung, MPI là tốt cho chạy một nhiệm vụ lớn duy nhất trên nhiều nút đáng tin cậy (ví dụ, các nút trong một cụm, hoặc một loạt các máy tính trong một phòng thí nghiệm).Như đã đề cập ở trên, nó cũng tuyệt vời khi bạn không biết loại mạng nào có, hoặc bạn muốn tận dụng bộ nhớ chia sẻ giữa các lõi trên một nút. Bạn càng lạc khỏi trường hợp sử dụng này, MPI kém phù hợp hơn. Tôi sẽ chỉ thêm rằng OpenMPI chỉ là một thực hiện của MPI; MPICH2, khác, chỉ là tốt. Và nếu bạn định sử dụng MPI + Python, tôi khuyên bạn nên dùng mpi4py. (http://mpi4py.scipy.org/) –

+0

Jonathan, cảm ơn. Có bất kỳ điểm cộng nào khi sử dụng 'OpenMPI' so với' RabbitMQ' không? – user3262424

4

Đây chính là kịch bản tôi đã làm cách đây vài tháng và tôi quyết định sử dụng AMQP với RabbitMQ bằng cách sử dụng trao đổi chủ đề, ngoài memcache cho các đối tượng lớn.

Tin nhắn AMQP là tất cả các chuỗi, trong định dạng đối tượng JSON để dễ dàng thêm thuộc tính vào thư (như số lần thử lại) và xuất bản lại. Các đối tượng JSON là một tập hợp con của JSON tương ứng với các Python dicts. Ví dụ {"recordid": "272727"} là một đối tượng JSON với một thuộc tính. Tôi có thể chỉ cần ngâm một dict Python nhưng điều đó có thể đã khóa chúng tôi vào chỉ bằng cách sử dụng Python với hàng đợi tin nhắn.

Các đối tượng lớn không được định tuyến bởi AMQP, thay vào đó chúng đi vào memcache, nơi chúng có sẵn cho quá trình khác để truy xuất chúng. Bạn cũng có thể sử dụng Redis hoặc Tokyo Tyrant cho công việc này. Ý tưởng là chúng tôi không muốn các tin nhắn ngắn được xếp hàng phía sau các đối tượng lớn.

Cuối cùng, các quy trình Python của tôi đã kết thúc bằng cách sử dụng cả AMQP và ZeroMQ cho hai khía cạnh khác nhau của kiến ​​trúc. Bạn có thể thấy rằng việc sử dụng cả OpenMPI và AMQP đều hợp lý nhưng đối với các loại công việc khác nhau.

Trong trường hợp của tôi, quy trình giám sát chạy vĩnh viễn, bắt đầu một toàn bộ công nhân cũng chạy mãi mãi trừ khi họ chết hoặc treo, trong trường hợp người giám sát khởi động lại. Công việc liên tục chảy vào dưới dạng tin nhắn qua AMQP và mỗi quá trình xử lý chỉ một bước của công việc, để khi chúng tôi xác định một nút cổ chai, chúng tôi có thể có nhiều lần xử lý, có thể trên các máy riêng biệt, để loại bỏ nút cổ chai. Trong trường hợp của tôi, tôi có 15 trường hợp của một quá trình, 4 trong số hai trường hợp khác và khoảng 8 trường hợp đơn lẻ khác.

+0

Michael, đây là một thiết kế thú vị. Cảm ơn bạn đã chia sẻ điều này. – user3262424

+0

bạn cũng nên xem xét _ [msgpack] (http://msgpack.org/) _ để tuần tự hóa, nó hoạt động rất tốt với _zeromq_. – errordeveloper