twemproxy0.4原理分析-消息处理机制概览

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zg_hover/article/details/85112303

概述

本文描述twemproxy0.4的消息处理机制的概览。

twemproxy0.4会通过FIFO(先进先出)队列的方式来对消息进行排队。本文先介绍一个消息处理的概要框架,后续会详细讲解该消息框架的实现。

消息处理框架总述

在创建后台网络服务程序时,后台服务的个数是有限的。而来自客户端的请求可能是无限的,但我们需要尽可能的满足客户端的请求,让客户端的体验不至于太差。这样我们就需要对客户端的请求进行控制。

twemproxy0.4中在处理消息时会使用两个FIFO(first in first out)个队列,一个输出队列,一个输入队列来实现对消息的控制。如下图所示:

  • 消息输入队列:接收到的请求会放入到消息输入队列中。
  • 消息输出队列:输出的请求会放到消息输出队列中。

从客户端连接接收到的请求,会放到服务端的消息输入连接请求队列中,该队列被称为:in_q。一旦消息被转发,从客户端的角度来看,它是未完成的并且在客户端的out_q中被跟踪(除非请求被标记为noreply)。

服务器依次从它自己的in_q中获取请求,并处理它们上。一旦请求的处理未完成,并且请求希望得到期望的消息回复,服务器就会在其自己的out_q中跟踪未完成的请求。

在服务器端,out_q让请求与响应能够配对,在客户端out_q能够让客户端接收请求的顺序和响应配对。

实例分析

 *
 *      Clients                             Servers
 *                                    .
 *    in_q: <empty>                   .
 *    out_q: req11 -> req12           .   in_q:  req22
 *    (client1)                       .   out_q: req11 -> req21 -> req12
 *                                    .   (server1)
 *    in_q: <empty>                   .
 *    out_q: req21 -> req22 -> req23  .
 *    (client2)                       .
 *                                    .   in_q:  req23
 *                                    .   out_q: <empty>
 *                                    .   (server2)
 *

上面的例子写在源码中的注释中,说明如下:

  • 客户端client1有两个请求:req11和req12正在和server1的连接上排队
  • 客户端client2有三个请求:req21, req22和req23,其中req21正在server1的连接上排队,而req22和req23正分别等待server1和server2接收。
  • 客户端out_q的fifo(先进先出性质)特性,确保在发送队列中其他已完成请求的响应之前,始终在队列头部发回请求响应。

输入和输出队列数据结构

struct conn {
    ...
    struct msg_tqh      imsg_q;          /* incoming request Q */
    struct msg_tqh      omsg_q;          /* outstanding request Q */
    ...   
}

其中imsg_q是输入请求的队列头结构,而omsg_q是输出队列的头结构。

总结

本文从总体上介绍了twemproxy0.4的消息处理机制和实现。后面会介绍更加详细的消息处理机制。

猜你喜欢

转载自blog.csdn.net/zg_hover/article/details/85112303