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 ) {
// // 处理逻辑…………
//}
}
}