2010-02-04 36 views
6

Tôi có hai máy tính ở các vị trí phân tán theo địa lý, cả hai đều được kết nối với internet. Trên mỗi máy tính tôi đang chạy một chương trình Python, và tôi muốn gửi và nhận dữ liệu từ một đến khác. Tôi muốn sử dụng cách tiếp cận đơn giản nhất có thể, trong khi vẫn còn phần nào an toàn.Cách nhẹ nhất để truyền dữ liệu qua internet bằng Python là gì?

Tôi đã xem xét các giải pháp sau, nhưng tôi không chắc chắn đó là đơn giản nhất:

  • máy chủ HTTP và khách hàng, sử dụng protobuf *;
  • Dịch vụ web SOAP và ứng dụng khách (pywebsvcs có thể?);
  • Một số loại IPC qua đường hầm SSH - một lần nữa, protobuf có thể?

Như tôi đã nói, tôi muốn giải pháp được phần nào an toàn, nhưng sự đơn giản là yêu cầu quan trọng nhất. Dữ liệu rất đơn giản; đối tượng của loại A, chứa danh sách các đối tượng thuộc loại B và một số trường khác.

* Tôi đã sử dụng protobuf trong quá khứ, do đó, khó khăn duy nhất sẽ được thiết lập máy chủ HTTP, mà tôi đoán sẽ là cherrypy.

+0

@Bạn đặc biệt không thích gì về protobuf? Nó không nhẹ như XML-RPC như thế nào? –

+0

Tôi đã cập nhật câu trả lời của mình. –

+0

JSON qua https? Chắc chắn có một thư viện Python để xử lý JSON. –

Trả lời

3

Cách rẻ nhất và đơn giản nhất để truyền tải có thể là XML-RPC. Nó chạy trên HTTP (vì vậy bạn có thể bảo mật theo cách đó), trong thư viện chuẩn, và không giống như protobuf, bạn không phải lo lắng về việc tạo và biên dịch các tệp kiểu dữ liệu của bạn (vì cả hai đầu đều chạy Python, gõ động không phải là một vấn đề). Thông báo trước duy nhất là bất kỳ loại nào không được trình bày trong XML-RPC phải được chọn hoặc được tuần tự hóa.

+0

Vâng, đó là những gì được đặt ra nhiều nhất về protobuf; nó không có vẻ nhẹ. Tôi sẽ kiểm tra XML-RPC. –

+2

Tại sao không đơn giản là dưa? 'cPickle' rất nhanh. –

+0

@Antoine P. Ah, tôi đã triển khai xml-rpc, nhưng tôi sẽ thử lần sau! –

0

Bạn có thể xem xét Pyro, hãy chắc chắn để đọc các Security chapter.

Cập nhật: Có vẻ như đơn giản hơn để thiết lập hơn Nghị định thư Buffers và có thể yêu cầu làm việc ít hơn nếu yêu cầu của bạn phát triển phức tạp hơn trong tương lai (họ có một cách để làm điều đó ... :-)

+0

Trông đẹp, nhưng có vẻ như có vẻ hơi quá mạnh đối với những gì tôi muốn làm, bạn có nghĩ vậy không? –

9

Nghị định thư bộ đệm là "nhẹ" theo nghĩa là chúng tạo ra sự đại diện dây rất nhỏ gọn, do đó tiết kiệm băng thông, bộ nhớ, lưu trữ, vv - trong khi vẫn giữ mục đích chung và đa ngôn ngữ. Chúng tôi sử dụng chúng tại Google, tất nhiên, nhưng không rõ liệu bạn có quan tâm đến các đặc điểm hiệu suất này hay không - bạn dường như sử dụng "nhẹ" theo nghĩa rất khác với điều này, được kết nối chặt chẽ với tải (tinh thần) về bạn, lập trình viên, và không phải tất cả với tải (tính toán) trên máy tính và mạng ;-).

Nếu bạn không quan tâm đến chi tiêu băng thông/bộ nhớ/etc nhiều hơn bạn có thể, và bạn cũng không quan tâm đến khả năng mã hóa các hệ thống con tham gia bằng các ngôn ngữ khác nhau, thì bộ đệm giao thức có thể không tối ưu cho bạn.

Không phải là pickling, nếu tôi đọc yêu cầu "phần nào an toàn" của bạn một cách chính xác: bỏ ghim chuỗi chuỗi độc hại được xây dựng phù hợp có thể thực thi mã tùy ý trên máy tháo ghim.Trên thực tế, HTTP không "an toàn" theo một cách khác: không có gì trong giao thức đó để ngăn chặn kẻ xâm nhập truy cập lưu lượng truy cập của bạn (vì vậy bạn không bao giờ nên sử dụng HTTP để gửi các tải trọng bí mật, trừ khi có thể bạn sử dụng mã hóa mạnh tải trọng trước khi gửi và hoàn tác sau khi nhận được). Để bảo mật (một lần nữa phụ thuộc vào ý nghĩa của từ) bạn cần HTTPS hoặc (đơn giản hơn để thiết lập, không yêu cầu bạn phải mua chứng chỉ! -) Đường hầm SSH.

Khi bạn có một đường hầm SSH được thiết lập giữa hai máy (đối với Python, paramiko có thể giúp, nhưng thậm chí thực hiện nó thông qua shell script hoặc bằng cách khác trực tiếp kiểm soát máy khách dòng lệnh ssh không quá xấu ;-) bạn có thể chạy bất kỳ giao thức nào trên nó (ví dụ như HTTP là tốt), vì các điểm cuối của đường hầm được tạo sẵn như các cổng được đánh số mà bạn có thể mở socket. Cá nhân tôi khuyên bạn nên sử dụng JSON thay vì XML để mã hóa các tải trọng - xem here cho máy chủ và máy khách RPC dựa trên JSONRPC như ví dụ - nhưng tôi đoán rằng việc sử dụng máy chủ và máy khách XMLRPC đi kèm với thư viện chuẩn của Python là thậm chí đơn giản hơn, do đó có thể gần hơn với những gì bạn đang tìm kiếm. Tại sao bạn muốn anh đào ngoài? Hiệu suất bây giờ có đột nhiên vượt qua sự đơn giản, cho khía cạnh này của toàn bộ kiến ​​trúc chỉ, trong khi trong mọi trường hợp đơn giản khác được chọn trên hiệu suất? Điều đó dường như là một sự lựa chọn kiến ​​trúc đặc biệt mâu thuẫn! -)

+0

Trọng lượng nhẹ trong ngữ cảnh này có nghĩa là "đại diện nhỏ gọn" với tôi. Hãy nhớ rằng SSH cũng có thể thực hiện quá trình nén bay. –

+0

@Alex Martelli Haha, vâng, tôi đã có nghĩa là nhẹ như trong "ít nỗ lực để thực hiện", chứ không phải là "ít nỗ lực cho máy tính". FYI, tôi đã giải quyết trên thư viện xml-rpc của Python, vì nó dường như là giải pháp đơn giản nhất. –

0

Alex đúng, dĩ nhiên. Nhưng, tôi sẽ kêu vang rằng tôi đã rất hạnh phúc trong quá khứ với dữ liệu tẩy và đẩy nó qua SSH đến một quá trình khác để giải quyết. Nó thật dễ dàng.

Nhưng, nó không phù hợp với nhiều thứ. Bạn thực sự cần phải tin tưởng dữ liệu đến, trong trường hợp máy chủ blog của tôi nhận được một bài đăng trên blog (khách hàng của tôi phân tích các thẻ hoặc tương tự), tôi chắc chắn tin tưởng dữ liệu - nó đã được xác thực như tôi.

Google, nơi Alex hoạt động, là một vấn đề hoàn toàn khác. :-)

Các vấn đề liên quan