protobuf so với gRPC


101

Tôi cố gắng hiểu protobuf và gRPC và cách sử dụng cả hai. Bạn có thể giúp tôi hiểu những điều sau:

  • Xem xét mô hình OSI ở đâu, ví dụ như Protobuf ở lớp 4?
  • Suy nghĩ thông qua việc truyền thông điệp như thế nào là "luồng", gRPC đang làm gì mà protobuf bỏ lỡ?
  • Nếu người gửi sử dụng protobuf thì máy chủ có thể sử dụng gRPC hay gRPC có thêm thứ gì đó mà chỉ máy khách gRPC mới có thể phân phối không?
  • Nếu gRPC có thể thực hiện giao tiếp đồng bộ và không đồng bộ, thì Protobuf chỉ dành cho việc sắp xếp và do đó không liên quan gì đến trạng thái - đúng hay sai?
  • Tôi có thể sử dụng gRPC trong giao tiếp ứng dụng giao diện người dùng thay vì REST hoặc GraphQL không?

Tôi đã biết - hoặc giả sử tôi biết - rằng:

Protobuf

  • Giao thức nhị phân để trao đổi dữ liệu
  • Được thiết kế bởi Google
  • Sử dụng "Cấu trúc" được tạo giống như mô tả tại máy khách và máy chủ để hủy - / - thông báo marshall

gRPC

  • Sử dụng protobuf (v3)
  • Một lần nữa từ Google
  • Khung cho các cuộc gọi RPC
  • Sử dụng cả HTTP / 2
  • Có thể giao tiếp đồng bộ và không đồng bộ

Tôi lại cho rằng đây là một câu hỏi dễ đối với một người đã sử dụng công nghệ này. Tôi vẫn muốn cảm ơn bạn đã kiên nhẫn với tôi và giúp đỡ tôi. Tôi cũng sẽ thực sự biết ơn vì đã tìm hiểu sâu về các công nghệ này.

Câu trả lời:


85

Bộ đệm giao thức là (là?) Một ngôn ngữ Định nghĩa Giao diện và thư viện tuần tự hóa:

  • Bạn xác định cấu trúc dữ liệu của mình trong IDL của nó, tức là mô tả các đối tượng dữ liệu bạn muốn sử dụng
  • Nó cung cấp các quy trình để dịch các đối tượng dữ liệu của bạn sang và từ hệ nhị phân, ví dụ như để ghi / đọc dữ liệu từ đĩa

gRPC sử dụng cùng một IDL nhưng thêm cú pháp "rpc" cho phép bạn xác định chữ ký phương thức Gọi Thủ tục Từ xa bằng cách sử dụng cấu trúc dữ liệu Protobuf làm kiểu dữ liệu:

  • Bạn xác định cấu trúc dữ liệu của mình
  • Bạn thêm các định nghĩa phương thức rpc của bạn
  • Nó cung cấp mã để phân phát và gọi các chữ ký phương thức qua mạng
  • Bạn vẫn có thể tuần tự hóa các đối tượng dữ liệu theo cách thủ công với Protobuf nếu bạn cần

Để trả lời các câu hỏi:

  1. gRPC hoạt động ở lớp 5, 6 và 7. Protobuf hoạt động ở lớp 6.
  2. Khi bạn nói "chuyển tin nhắn", Protobuf không quan tâm đến việc chuyển tin nhắn. Nó chỉ hoạt động ở một trong hai đầu của bất kỳ quá trình truyền dữ liệu nào, biến các byte thành các đối tượng
  3. Sử dụng gRPC theo mặc định có nghĩa là bạn đang sử dụng Protobuf . Bạn có thể viết ứng dụng khách của riêng mình sử dụng Protobuf nhưng không phải gRPC để tương tác với gRPC hoặc plugin các trình tuần tự hóa khác vào gRPC - nhưng sử dụng gRPC sẽ dễ dàng hơn
  4. Thật
  5. Có bạn có thể

Bạn có thể vui lòng cho tôi biết mọi người đang nói về "Lớp" nào không? Vui lòng cung cấp cho tôi liên kết để hiểu khái niệm này một cách chi tiết. Cảm ơn.
Millie Hudson

Đó là mô hình OSI - đã thêm một liên kết trong câu hỏi. Nó gây tranh cãi về việc liệu gRPC có thuộc lớp 5 & 6 hay không vì nó sử dụng giao thức lớp 7 ( HTTP/2), nhưng nó chắc chắn thực hiện các công việc của các lớp đó.
Peter Wishart

67

Thực ra gRPC và Protobuf là 2 thứ hoàn toàn khác nhau. Hãy để tôi đơn giản hóa:

  • gRPC quản lý cách máy khách và máy chủ có thể tương tác (giống như máy khách / máy chủ web với API REST)
  • protobuf chỉ là một công cụ tuần tự hóa / giải mã hóa (giống như JSON)

gRPC có 2 mặt: phía máy chủ và phía máy khách, có thể quay số máy chủ. Máy chủ hiển thị các RPC (tức là các chức năng mà bạn có thể gọi từ xa). Và bạn có rất nhiều tùy chọn ở đó: bạn có thể bảo mật thông tin liên lạc (sử dụng TLS), thêm lớp xác thực (sử dụng bộ chặn), ...

Bạn có thể sử dụng protobuf bên trong bất kỳ chương trình nào mà không cần phải là máy khách / máy chủ. Nếu bạn cần trao đổi dữ liệu và muốn chúng được gõ mạnh, protobuf là một lựa chọn tốt (nhanh và đáng tin cậy).

Điều đó đang được nói, bạn có thể kết hợp cả hai để xây dựng một hệ thống máy khách / máy chủ đẹp: gRPC sẽ là mã máy khách / máy chủ của bạn và protobuf giao thức dữ liệu của bạn.

Tái bút: Tôi đã viết bài báo này để chỉ ra cách người ta có thể xây dựng một máy khách / máy chủ với gRPC và protobuf bằng Go, từng bước một.


3
Cảm ơn bạn, điều này giúp tôi thực hiện một mẫu.
lony

7

grpc là một framework do google xây dựng và nó được sử dụng trong các dự án sản xuất từ ​​chính google và #HyperledgerFainst được xây dựng bằng grpc, có rất nhiều ứng dụng mã nguồn mở được xây dựng bằng grpc

protobuff là một đại diện dữ liệu như json, đây cũng là bởi google trên thực tế, họ có hàng nghìn tệp proto được tạo trong các dự án sản xuất của họ

grpc

  • gRPC là một khung mã nguồn mở được phát triển bởi google
  • Nó cho phép chúng tôi tạo Yêu cầu & Phản hồi cho RPC và xử lý phần còn lại của khuôn khổ
  • REST là định hướng CRUD nhưng grpc là định hướng API (không có ràng buộc)
  • Xây dựng trên đầu trang của HTTP / 2
  • Cung cấp >>>>> Xác thực, Cân bằng tải, Giám sát, ghi nhật ký
  • [HTTP / 2]
    • HTTP1.1 đã phát hành vào năm 1997 cách đây khá lâu
    • HTTP1 mở một kết nối TCP mới tới một máy chủ theo từng yêu cầu
    • Nó không nén tiêu đề
    • KHÔNG có máy chủ push, nó chỉ hoạt động với Req, Res
    • HTTP2 được phát hành vào năm 2015 (SPDY)
    • Hỗ trợ ghép kênh
    • máy khách & máy chủ có thể đẩy thông báo song song trên cùng một kết nối TCP
    • Giảm đáng kể độ trễ
    • HTTP2 hỗ trợ nén tiêu đề
    • HTTP2 là nhị phân
      • proto buff là nhị phân vì vậy nó là một kết hợp tuyệt vời cho HTTP2
  • [CÁC LOẠI]
    • Một ngôi
    • phát trực tuyến khách hàng
    • phát trực tuyến máy chủ
    • Phát trực tuyến hai chiều
    • máy chủ grpc là không đồng bộ theo mặc định
    • ứng dụng khách grpc có thể được đồng bộ hóa hoặc không đồng bộ hóa

protobuff

  • Bộ đệm giao thức là ngôn ngữ bất khả tri
  • Bộ đệm giao thức phân tích cú pháp (định dạng nhị phân) ít tốn CPU hơn
  • [Đặt tên]
    • Sử dụng vỏ lạc đà cho tên tin nhắn
    • underscore_seperated cho các trường
    • Sử dụng camelcase cho Enums và CAPITAL_WITH_UNDERSCORE cho tên giá trị
  • [Bình luận]
    • Ủng hộ //
    • Ủng hộ /* */
  • [Ưu điểm]
    • Dữ liệu được nhập đầy đủ
    • Dữ liệu được nén hoàn toàn (sử dụng ít băng thông hơn)
    • Lược đồ (thông báo) là cần thiết để tạo mã và đọc mã
    • Tài liệu có thể được nhúng vào lược đồ
    • Dữ liệu có thể được đọc bằng bất kỳ ngôn ngữ nào
    • Lược đồ có thể phát triển bất kỳ lúc nào theo cách an toàn
    • nhanh hơn XML
    • mã được tạo tự động cho bạn
    • Google đã phát minh ra proto buff, họ sử dụng 48000 tin nhắn protobuf và 12000.proto tệp
    • Rất nhiều khuôn khổ RPC, bao gồm cả grpc sử dụng bộ đệm giao thức để trao đổi dữ liệu

3
Nén KHÔNG làm giảm mức sử dụng CPU. Bạn phải nén và giải nén nó để gửi hoặc sử dụng dữ liệu trong tuần tự hóa- điều này đốt CPU LÀM ĐIỀU đó .. Việc nén có ích cho bạn là giảm dung lượng lưu trữ tuần tự hóa, giảm áp suất bộ nhớ tiềm năng, sử dụng đĩa nếu được sử dụng để tuần tự hóa vào đĩa hoặc hơn dây tín hiệu.
Svartalf

@Svartalf đã chỉnh sửa để sửa lỗi này. Cảm ơn đã chỉ ra điều đó!
swrobel
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.