Salut à tous, il y a quelque temps j’ai commencé à faire un petit système de chat avec gRPC.
L’idée actuel était d’avoir un service qui ne possède qu’une route rpc au travers de laquelle le client et le serveur s’échangent des événements. Cet événement contient un champ qui défini quel type d’événement il est. Il est en suite traité de manière différente par le serveur.
Voici le fichier proto qui à été fait pour cette solution:
syntax = "proto3";
service Chaton {
// Join to talk with each others
rpc Join (stream Event) returns (stream Event) {}
}
message Msg {
string content = 1;
string author = 2; // Ignored by the server when recieving from clients
}
message Event {
MsgType type = 1;
Msg msg = 2;
}
enum MsgType {
// Open the connection with the server (subscribe to recieve message from him)
// The message content should be the nick name of the client (can be optional)
CONNECT = 0;
// Set the client nickname
// The message content should be the nick name of the client
SET_NICKNAME = 1;
// Send a message, the message content is what is send to other clients
MESSAGE = 2;
// Leave the server
// The message content is what the user say before leaving (can be optional)
QUIT = 3;
}
Aujourd’hui en revenant sur le projet je me pose la question de faire autrement.
Plutot que d’avoir des enums et de faire un switch dessus coté serveur est ce que je ne devrai pas mieux avoir une route rpc pour chaque evenement ?
On aurait un fichier proto comme suit:
syntax = "proto3";
service Chaton {
// Join to be part of the chat and receive messages
rpc Join () returns (stream Msg) {}
// Say something on the server
rpc Say (Msg) return ()
// Rename your self to change your pseudo
rpc Rename (Msg) return ()
// Quit the server
rpc Quit (Msg) return ()
}
[...]
Que pensez vous des deux solutions proposé ?
Y en a t-il une qui est plus idiomatique que l’autre quand on fait du gRPC ?
Est ce qu’une solution est plus facilement maintenable qu’une autre au long terme ? Notamment si on ajoute des actions plus tard.