lkbm:
Se facilita a implementação do banco e dos drivers não sei, mas de que maneira facilitaria a comunicação?
Se o cliente precisa dos dados ele só precisa esperar pela resposta do banco, o que tem de complicado nisso?
Qual seria a alternativa mais simples neste caso?
É um pouco compicado explicar aqui como isso funciona por baixo dos panos. É, inclusive, o tema de dois meses da minha aula de redes.
A complexidade está no fato de que as duas máquinas não estão, efetivamente, operando ao mesmo tempo. Então, há a necessidade de avisar que o comando foi recebido (ACK), que a outra máquina ainda está viva e processando (KEEP_ALIVE), e que o processamento acabou. Tudo isso para criar a ilusão de sincronia.
A razão por trás da sincronia é que, depois de pronta, fica muito mais fácil programar. É conceitualmente simples fazer um simples "executeQuery"e entender isso como uma chamada de função. Porém, essa ilusão de simplicidade vem com um custo.
Eu nunca vi nenhum trabalho sério que quantifica se esse custo é tão alto ao ponto disso, por si só, justificar toda a mudança de paradigma que o node propõe.
A razão pelo qual gosto do async é justamente o fato de tornar fácil criar threads assíncronas para calculos ou processamento batch e depois sincroniza-las em algum ponto. Do lado do servidor, a vantagem está justamente no fato de você poder disparar vários pequenos processamentos desses, e depois poder espera-los em ordem, ou coloca-los em condição de corrida. Quando há também formas de você declarar quais processamentos estão em contextos distintos (como se faz no C#) e quais dados são trocados em sua fronteira, fica muito fácil criar um escalonador que possa decidir sozinho se um determinado trecho de código pode ser disparado na mesma thread, numa thread separada, ou numa máquina remota, ou mesmo com redundância em várias máquinas (como o Azure faz). Assim é possível ter backends muito poderosos sem você ter um esforço muito grande de gerenciar threads e paralelismo na mão.