[ 
https://issues.apache.org/jira/browse/KAFKA-1912?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14365766#comment-14365766
 ] 

Jay Kreps commented on KAFKA-1912:
----------------------------------

I think this is easier than I thought.

We have an async api now in NetworkClient:
  send(ClientRequest request)

So re-routing is fairly straight-forward:
  reroutedRequest = new RequestSend(newDestinationNode, originalRequest.header, 
originalRequest.body);
  networkClient.send(new ClientRequest(time, true, reroutedRequest, 
    new RequestCompletionHandler() {
      public void onComplete(ClientResponse response) {
        responseQueue.add(response);
      }
    }
  ));

The only issue with this is that  the network client currently requires a ready 
connection to do a send. I think we can fix this by making a small 
RequestRerouter shim that has a queue of unsent messages and a thread that does 
the ready check and send. Hopefully that makes sense, if not I can flesh it out 
a bit more.

> Create a simple request re-routing facility
> -------------------------------------------
>
>                 Key: KAFKA-1912
>                 URL: https://issues.apache.org/jira/browse/KAFKA-1912
>             Project: Kafka
>          Issue Type: Improvement
>            Reporter: Jay Kreps
>             Fix For: 0.8.3
>
>
> We are accumulating a lot of requests that have to be directed to the correct 
> server. This makes sense for high volume produce or fetch requests. But it is 
> silly to put the extra burden on the client for the many miscellaneous 
> requests such as fetching or committing offsets and so on.
> This adds a ton of practical complexity to the clients with little or no 
> payoff in performance.
> We should add a generic request-type agnostic re-routing facility on the 
> server. This would allow any server to accept a request and forward it to the 
> correct destination, proxying the response back to the user. Naturally it 
> needs to do this without blocking the thread.
> The result is that a client implementation can choose to be optimally 
> efficient and manage a local cache of cluster state and attempt to always 
> direct its requests to the proper server OR it can choose simplicity and just 
> send things all to a single host and let that host figure out where to 
> forward it.
> I actually think we should implement this more or less across the board, but 
> some requests such as produce and fetch require more logic to proxy since 
> they have to be scattered out to multiple servers and gathered back to create 
> the response. So these could be done in a second phase.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to