For us, the decision comes down to having existing protocol buffers or not. Often times, we'll have a message defined for other purposes, e.x.:
message Contact {
repeated Name name = 1;
// etc..
}
And since we want RPC to be orthogonal from the storage models, we'll create wrappers:
message GetContactRequest {
string id = 1;
}
message GetContactResponse {
Contact contact = 1;
// other metadata irrelevant to a "contact"
}
message PutContactRequest {
string id = 1;
Contact contact = 2;
}
// etc.
Since we use protocol buffer throughout our stack (storage, task queueing, etc.), composing them into Request/Response wrappers make sense for us. If you're just using protocol buffers to drive logic that doesn't otherwise care about protocol buffers, it seems like the former is nicer.
Michael