有偿求助抢单软件优化,报酬 500~800,最好懂 Go

2018-07-18 20:53:54 +08:00
 yulon

目前已做出软件,但是速度不够,希望大佬们能提供些意见,我自己还是想独立完成的,顺便学习,所以不太想外包,也就不存在骗源码的情况,如果有可以明显提升效率的建议就会按程度给报酬,多人就均分,相同建议只给第一个人,当然实在想接外包的也不是不可以,但是金额范围不变,也是有效果才会给报酬。

整个抢单流程是:刷新单子信息是否出单→开始抢单。

在刷新单子信息时,我现在是用百个 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 变量判断有没有完成该任务,应该不存在阻塞,问题就是上面说的过时的请求要不要主动关闭😂

5289 次点击
所在节点    Go 编程语言
33 条回复
wenbinwu
2018-07-18 20:56:18 +08:00
最多才 800,还可能跟别人平分?
torbrowserbridge
2018-07-18 20:58:48 +08:00
看完你这段描述浪费的时间都不止 800 了
yulon
2018-07-18 21:00:20 +08:00
@wenbinwu 要求是有效,其实我不觉得能有太多不同的建议。
gam2046
2018-07-18 21:04:41 +08:00
@torbrowserbridge 老哥收入有点厉害的。算看的慢一点,30 分钟看完,值 800。一天 8 小时工作,12800 元了。一个月 21.75 个工作日,税前月薪 27.84 万。

对于楼主的情况,是否能够先解构一下各个部分的大致耗时占比?先看一下目前的情况,主要时间消耗在哪里。是网络请求,解析内容,还是其他方面慢了,再做针对性的操作。
aru
2018-07-18 21:04:44 +08:00
1. 正常情况下,解析 json 要比 http 请求快很多倍,你可以通过多次循环并打印日志来验证这点
2. 并发抢单服务器端可以做了限制
3. 代理一般都挺慢的,不可靠。如果会达到限制,那就用多代理吧,最后下单最好直接本机下
torbrowserbridge
2018-07-18 21:10:20 +08:00
@gam2046 夸张的手法😄
angryRabbit
2018-07-18 21:20:55 +08:00
没看完,太长了
gamexg
2018-07-18 22:09:07 +08:00
不知道你抢的什么网站的单,但是数百个并发请求不怕被封?

>在 Go 的实现里是否只有服务器主动断开时才会得到 EOF ?
Body.Read ?
http 协议有 3 种表示 body 结束的方式,其中两种不依靠 tcp 连接关闭,go 能够正确识别,另一种依赖 tcp 连接关闭,不过 http 服务器发送完内容会立刻关闭,不会影响速度。

json 流式解析不需要解析到 EOF,到 } 就结束,你可以试下,连续多个 {} 可以解析多次。

go http 内部有个 tcp 连接池,池空了会立刻创建新连接,但是不确定是否有连接数限制,应该没有。
一般 http 池不会出问题,极端情况基本见不到不需要考虑。

实际觉得不需要在意本地 json 解析等的速度,这个相对于网络耗时应该可以忽略不计。
真想提高速度,先确定对方服务器位置,直接租同一机房的。
pathbox
2018-07-18 22:14:02 +08:00
耗时在网络上,办个网速贼好的服务器,离抢单服务越近越好,速度可能可以翻翻
zhs227
2018-07-18 22:32:28 +08:00
一般耗时都在网络上,解析库上来说不是最关键的。如果想优化解析这部分的逻辑的话,直接把 rsp.Body[:10]出来,用 string match 一下,不需要做 unmarshal。觉得有必要再 unmarshal,这样可以做到 zero copy。
yulon
2018-07-18 22:33:43 +08:00
@gamexg 某国企网站,只是流量大的时候会封 IP 几分钟,外包的网站估计员工也不怎么会用,流量大的几天都是强制人员驻点抢单,已经拉了条本地企业宽带专供一台主机😂
yulon
2018-07-18 22:40:15 +08:00
@zhs227 恩,所以我说了知道出单才会继续读,因为信息数据有点多,原来全部读完再解析都要比别的公司慢一秒,现在是同一秒了,但还是差那么几百毫秒。。。
RangerWolf
2018-07-18 22:42:45 +08:00
不知道目前你说的不够, 是个什么程度。 什么程度才够?

另外真的很好奇贵司的业务。。。 强制抢单?
realpg
2018-07-18 22:50:08 +08:00
上海拍车牌?
LucasLee92
2018-07-18 22:54:14 +08:00
拍车牌,抢火车票之类的业务
yulon
2018-07-18 22:59:03 +08:00
@RangerWolf 某物流公司,网站是抢货单的,而且还和网站有点 PY 交易,但是某段时间开始所有物流公司都开始用工具,我们老板有很多别司没有的权限,但在工具面前毫无优势,其实现在已经优化到所有公司平均水平了,就是想争第一吧🤣
xiangyuecn
2018-07-18 23:02:23 +08:00
时间(单位毫秒) | 事件
00.000 | 发起请求
05.000 | 远程服务器接收请求并处理
25.000 | 远程服务器处理完毕,开始回传数据
35.000 | 数据接收完毕,开始解析
35.001 | 数据解析完毕,拿到了 json 对象

来试试负优化:
1、网速有点影响,提高点网速,在他们家同一机房开个服务器吧,速度妥妥的
2、网速有点影响,按你的思路,流式读取数据,接收前几个字节能判断出结果就直接关闭连接返回,省一点点时间
3、重量级的还是人家的服务器处理速度,卡个 10-20ms 才开始返回第一个字节数据很正常,基本上没法优化
4、json 解析不耗时间,优化了也没叼用


实际情况是一个完整请求至少耗时 100-300 毫秒(滑稽
Lax
2018-07-18 23:13:02 +08:00
网络请求时间,一般远远大于在本地 cpu 中计算的时间消耗,看看服务器之间的网络延时,尽量优化一下 /换个机房。

只读前几个字节可能会少占用几个计算周期。不过网络传输数据包的长度相对固定( MTU ),不会因为少读后面的字节而减少传输时间。可以让程序在 TCP 层面进行处理,减少 HTTP 的额外等待。

并行太多,调度开销就大,有条件可以试试减少并行任务数。
IvanLi127
2018-07-19 01:51:48 +08:00
基本上是网络问题,你在他服务器同机房里租个机子吧
fiht
2018-07-19 08:03:11 +08:00
发个 HTTP 包带上 etag 信息试试?
或者自己构造一个 HTTP 报文用 socket 发过去只取前 2048 个字节?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/472144

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX