tarpc icon indicating copy to clipboard operation
tarpc copied to clipboard

How to implement router?

Open mzdk100 opened this issue 1 year ago • 4 comments

I need to define different services to handle different tasks, such as:

#[tarpc::service]
pub trait UserService {
    async fn login(name: String);
}

#[tarpc::service]
pub trait OrderService {
    async fn query(name: String);
}

The current problem is how to register these two services into the framework, and then create clients using 'UserServiceClient::new' and 'OrderServiceClient::new' and call them?

mzdk100 avatar Jul 16 '24 00:07 mzdk100

Thanks for the question! Tarpc doesn't natively support registering multiple services on a single server. I can suggest a few options:

  • Use a separate transport for each service
  • Use a multiplexing transport that can forward to different services. See the example at https://github.com/google/tarpc/issues/300#issuecomment-1048229777.

tikue avatar Aug 12 '24 00:08 tikue

The "multiplexing transport" solution is good, but it requires writing a lot of code. Can't the tarpc framework handle these things itself? The microservice framework should be designed to be modular so that we can organize the code more conveniently.

mzdk100 avatar Aug 12 '24 02:08 mzdk100

The main reason tarpc can't easily support native multiplexing is because the transport is typically generic over the request/response type.

Could the multiplexing code be written generically as a library? Then it wouldn't have to be duplicated by each user. If it were proven popular enough, perhaps it could be merged into tarpc.

tikue avatar Aug 12 '24 03:08 tikue

Currently, I'm using the quic-rpc library which can meet my need for modularizing the code, but writing code is not as concise as using the tarpc framework.

mzdk100 avatar Aug 12 '24 03:08 mzdk100

I'm deduplicating this to another issue that brought up a similar question. I've sketched out a potential solution there.

tikue avatar Sep 26 '25 18:09 tikue