「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
前言
GoReplay 对数据流的抽象出了两个概念,即用 输入(input ) 和 输出(output ) 来表示数据来源与去向,统称为 plugin,用介于输入和输出模块之间的中间件实现拓展机制。
output_http.go:主要是 HTTP 输出的插件,实现 HTTP 协议, 实现 io.Writer 接口,最后根据配置注册到 Plugin.outputs 队列里。
参数说明
1 | bash复制代码-output-http value //转发进入的请求到一个http地址上 |
默认情况下,Gor 创建一个动态工作池:
它从 10 开始,并在 HTTP 输出队列长度大于 10 时创建更多的 HTTP 输出协程。创建的协程数量(N)等于该工作时间的队列长度检查并发现其长度大于10.每次将消息写入 HTTP 输出队列时都检查队列长度。在产生 N 个协程的请求得到满足之前,不会再有协程创建。如果动态协程池当时不能处理消息,它将睡眠 100 毫秒。如果动态工作协程无法处理消息2秒钟,则会死亡。可以使用 --output-http-workers=20
选项指定固定数量的协程。
HTTP 输出工作数量
NewHTTPOutput 默认情况:
1 | go复制代码// NewHTTPOutput constructor for HTTPOutput |
配置后启动 httpclient:
1 | go复制代码o.client = NewHTTPClient(o.config) |
启动多个发送协程:
1 | go复制代码func (o *HTTPOutput) startWorker() { |
执行发送:
1 | go复制代码func (o *HTTPOutput) sendRequest(client *HTTPClient, msg *Message) { |
发送细节,各种配置生效点:
1 | go复制代码// Send sends an http request using client create by NewHTTPClient |
HTTP 输出队列
队列用在哪儿呢?
代码逻辑调用图
本文转载自: 掘金