Understanding Protobuf & GRPC

A gentle introduction to GRPC

Acme Design is a full service design agency.

Carmine Di Monaco
Senior Software Engineer @ SUSE

Hello!

Carmine Di Monaco

Senior Software Engineer @ SUSE

Twitter @CDimonaco

Github CDimonaco

carmine.dimonaco@computer.org

carmine.dimonaco@suse.com

Cosa sono i Protocol Buffers

Standard per serializzazione/deserializzazione di strutture dati

Language-neutral

Platform neutral

Definizione dichiarativa della struttura del messaggio

Scrivi la shape una volta,

generi automaticamente gli stubs nei vari linguaggi

Cosa sono i Protocol Buffers

Forward compatibility out of the box, i vecchi stubs possono leggere i nuovi messaggi

Formato compatto e veloce da parsare

Adatto per payload di dimensioni ridotte, da non considerare se il payload eccede diversi megabyte, dato che il protocollo assume che il messaggio possa essere letto interamente in memoria

Impossibile comparare due messaggi senza averli completamente serializzati

Messaggi non compressi

Cosa sono i Protocol Buffers

Necessita' di avere lo "schema" di un messaggio protobuf per poterlo serializzare/deserializzare correttamente

Un messaggio protobuf e' una struttura chiave valore, che segue lo schema Type-length-value

  • Field number
  • Wire type
  • Payload

Possiamo fare guessing del messaggio senza lo schema di partenza, cercando inferire il significato del messaggio.

Cosa sono i Protocol Buffers

message Todo {
  string id = 1;
  string title = 2;
  string description = 3;
  string created_at = 4;
  bool completed = 5;
}

Proto3 - Language

Tipizzato - Estensibile

Supporto ad array e mappe

Supporto enum

I field numbers non devono essere cambiati una volta in uso

per garantire la compatibilita' tra diverse versioni dello stesso messaggio

I campi da 1 a 15 e' bene riservarli per campi dei messaggi piu' importanti e frequenti, questo per massimizzare i benefici dell'encoding (da 1 - 15 1 byte per encoding, 16 - 2047 2 byte etc..)

Cosa sono i Protocol Buffers

Non riutilizzare i field numbers in caso di campi eliminati, rischio elevato di corruzione dei dati. Utilizzare la reserved list sia per i field number che per i nomi dei campi cancellati

Non cambiare il tipo di un campo, il rischio di corruzione dei dati e' pari al riutilizzo di field numbers, vi sono alcune eccezioni. Nel caso assicurarsi che il nuovo messaggio sia un SUPERSET del vecchio messaggio

Non usare la rappresentazione testuale di un messaggio per scopi diversi dal logging/debugging

https://protobuf.dev/programming-guides/dos-donts/

Cosa sono i Protocol Buffers

Cosa sono i Protocol Buffers

Cosa sono i Protocol Buffers

Usecase - Protobuf in trento-project

Messaggi protobuf scambiati usando Rabbitmq

Repository centralizzato per i .proto, generazione automatica degli stubs e delle varie librerie nei linguaggi di destinazione

https://github.com/trento-project/contracts

I messaggi sono versionati, cosi' come le librerie di destinazione

GRPC

Framework RPC universale

E' possibile utilizzare protobuf

Usa HTTP2

Streaming bidirezionale

Utilizzabile anche dal browser

Adatto per applicazioni dove vi sono requisiti di bassa latenza e alta scalabilita'

GRPC

Le definizioni dei service GRPC possono essere espresse in proto

service  TodoService {
  rpc AddTodo(AddTodoRequest) returns (AddTodoResponse);
  rpc GetTodo(GetTodoRequest) returns (GetTodoResponse);
  rpc ListTodos(ListTodoRequest) returns (ListTodosResponse);
}

Lo streaming e' bidirezionale, sia lato client che server

Language/Platform agnostic

GRPC

type TodoServiceServer interface {
	AddTodo(context.Context, *AddTodoRequest) (*AddTodoResponse, error)
	GetTodo(context.Context, *GetTodoRequest) (*GetTodoResponse, error)
	ListTodos(context.Context, *ListTodoRequest) (*ListTodosResponse, error)
	mustEmbedUnimplementedTodoServiceServer()
}

Il generato GO richiede l'implementazione di handler GRPC

Esperienza di sviluppo simile a servizi web tradizionali

Vasta scelta di librerie/middleware di terze parti

Supporto ad autenticazione

Demo - Todo GRPC

https://github.com/CDimonaco/todo-grpc-talk

Tooling necessario

  • golang
  • task
  • protoc
  • protoc-gen-go
  • protoc-gen-go-grpc

Demo - Todo GRPC

Andremo ad implementare una nuova rpc, per cancellare un todo gia' creato

Partiremo dalla business logic, fino alla generazione degli stub protobuf/grpc

Sara' tutto live coding, alla fine faremo un commit con le modifiche direttamente sul repository

Grazie

@CDimonaco

carmine.dimonaco@computer.org

carmine.dimonaco@suse.com

carmine.dimonaco@gmail.com

Made with Slides.com