目前已做出软件,但是速度不够,希望大佬们能提供些意见,我自己还是想独立完成的,顺便学习,所以不太想外包,也就不存在骗源码的情况,如果有可以明显提升效率的建议就会按程度给报酬,多人就均分,相同建议只给第一个人,当然实在想接外包的也不是不可以,但是金额范围不变,也是有效果才会给报酬。
整个抢单流程是:刷新单子信息是否出单→开始抢单。
在刷新单子信息时,我现在是用百个 goroutine 循坏执行“ HTTP 请求+读 body+解析 body ”,我觉得“解析 body ”的部分是肯定可以提升效率的,但是“ HTTP 请求”或“读 body ”会不会互斥更高效?
就我自己搭的小服务器来说,是所有操作都并发能更快的得到网站的更改,但这适不适用于大型服务器呢?原谅我不能直接在发单的服务器上做实验。
如果有比较快的 Go 的 HTTP 包或是 JSON 包也可以推荐一下,fasthttp 我试了好像对客户端的提升并不明显,而第三方的 JSON 包使用风格都各不相同,就没有尝试了。
而上面“读 body+解析 body ”是我现在的方案,整个 body 的数据是 JSON 的,但读取前 10 个字符就已经能知道是否出单,所以知道出单后我会用一个 buffer 缓存 body 的数据,通过自己读 {} 是否闭合来知道是否读完,而不是直接读到 EOF,我观测到读 EOF 可能会有延迟,在 Go 的实现里是否只有服务器主动断开时才会得到 EOF ?
然后直接 json.Unmarshal(buf.Bytes()),我是觉得先 I/O 再解析完整的内存数据比较好,但因为我已经有一个检查 {} 的操作了,这里如果把开头的 10 字节和 body 封装成 io.Reader 接口,丢给 json.Decoder 边读边解析会不会更好呢?但 json.Decoder 是解析到 {} 闭合为止,还是要读到 EOF ?
接着是抢单,抢单的请求也需要并发执行吗?我是觉得第一个连接丢包的话可能没有其他并发的请求快。
而抢单请求时,之前未被关闭的刷新信息的请求会阻塞抢单请求吗?如果会,那么有没有好的 HTTP 请求池方案,能够达到关闭之前请求的时间比被阻塞的时间更少?
其他,代理 IP 对抢单有提升吗,是用“本机带宽 /单 IP 最大不被封带宽”数量的代理好,还是用尽可能多的代理占“本机带宽 /代理数量”的带宽好呢?
就先说到这里吧,其他的想到再补充,其实我更想知道有没有被我忽视的地方,多线程数据同步的话,除了最后的结果我是用 channel 发送到主线程,在并发任务里我都是通过 atomic 变量判断有没有完成该任务,应该不存在阻塞,问题就是上面说的过时的请求要不要主动关闭😂
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.