Rocherlee
Rocherlee

Reputation: 2781

How to make a Thrift client for multiple threads?

I have a working Thrift client in the below snippet.

TTransport transport = new THttpClient(new Uri("http://localhost:8080/api/"));
TProtocol protocol = new TBinaryProtocol(transport);
TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "UserService");
UserService.Client userServiceClient = new UserService.Client(mp);
System.out.println(userServiceClient.getUserById(100));

When running the client within multi-threaded environment

threads[i] = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println(userServiceClient.getUserById(someId));
    }
}

I got an exception: out of sequence response

org.apache.thrift.TApplicationException: getUserById failed: out of sequence response
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:76)

I guess the reason is that Thrift generated Client is not thread safe. But if I want multi-clients to call the same method getUserById() simultaneously, how can I make it?

Upvotes: 6

Views: 5058

Answers (1)

JensG
JensG

Reputation: 13411

Thrift clients are not designed to be shared across threads. If you need multiple client threads, set up one Thrift client per thread.

But if I want multi-clients to call the same method getUserById() simultaneously, how can I make it?

We don't know much about the context, so I have to guess a bit. If the issue is that there are a lot of such calls coming in at a time, a possible solution could be to group calls to save roundtrip time:

service wtf {
  list<string>  getUsersById( 1 : list<int> userIds)
}

That's just a short idea. Maybe you want to return list<user_data_struct> instead. For practical reasons I would also recommend to wrap the returned list into a struct, so the whole thing becomes extensible.

Upvotes: 5

Related Questions