HTTP请求转队列

为了能应对客户端的大量数据提交请求,可以采用队列来缓冲请求压力,具体有2个步骤:

  • 将整个HttpRequest存入队列
  • 在另一个进程中订阅队列消息来处理HttpRequest



HttpRequest存入队列

[HttpPost]
public async Task<int> Databus()
{
    // 将请求序列化字节数组
    byte[] data = await this.RequestToBytesWithMonitorAsync();

    // 将当前请求发送到MQ
    this.SendRabbitMessage(ResNames.Rabbit, data, s_queueName);

    return data.Length;
}



如果需要将当前请求发到不同的MQ,请按下面方式处理:

[HttpPost]
public async Task<int> Databus()
{
    // 将请求序列化字节数组
    byte[] data = await this.RequestToBytesWithMonitorAsync();

    // 如果需要将当前请求发到不同的MQ,请按下面方式处理:
    if( /* 条件1 */ true )
        this.SendRabbitMessage(ResNames.Rabbit, data, "queue_1111");

    if( /* 条件2 */ true )
        this.SendRabbitMessage(ResNames.Rabbit, data, "queue_2222");

    if( /* 条件3 */ true )
        this.SendRabbitMessage(ResNames.Rabbit, data, "queue_3333");

    return data.Length;
}



处理HttpRequest

public class RequestMsgHandler : BaseMessageHandler<NHttpRequest>
{
    public override void ProcessMessage(PipelineContext<NHttpRequest> context)
    {
        NHttpRequest request = context.MessageData;

        // 在这里可以获取到从MQ中还原出来的 request 对象,你可以像 Controller中那样处理
        // 好处是,这里没有并发压力

        //// 例如:读取请求头
        //string contentType = request.ContentType;
        //string datatype = request.Header("x-datatype");

        //// 获取请求体内容
        //string body = request.BodyText;  // 注意:这里已经做过了 gzip 解压缩

        //// 获取客户端发送的 List 对象
        //List<OprLog> list = body.FromMultiLineJson<OprLog>();

        //foreach(var x in list ) {
        //    // 处理逻辑…………
        //}

    }
}