有偿求助抢单软件优化,报酬 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 变量判断有没有完成该任务,应该不存在阻塞,问题就是上面说的过时的请求要不要主动关闭😂

5304 次点击
所在节点    Go 编程语言
33 条回复
reus
2018-07-19 09:07:00 +08:00
想独占蛋糕,就不怕同行把桌子掀了?
soulmine
2018-07-19 10:05:22 +08:00
你这都快是高频交易了吧 这么在意延迟 为什么不用 C++写
lihongjie0209
2018-07-19 10:22:28 +08:00
@soulmine #22 高 io 操作用 c++能上天?
yulon
2018-07-19 10:51:10 +08:00
@reus 问题就是之前被一个同行独占了,所以都开始搞了。

@soulmine 想过 C++,但是 goroutine 并发比较成熟,或者有什么 C++ 高频 HTTP 请求库推荐的吗?

@fiht 单子信息请求响应都是即时的,没有 If-None-Match 和 ETag,现在已经对请求报文做过缓存了😂
hoosin
2018-07-19 11:09:13 +08:00
我觉得看完这个需求,就值 800 了
luw2007
2018-07-19 11:35:08 +08:00
以前用 go 做过 p2p 金融抢单,大致说一下软件思路。
调度进程,业务进程分离。采用 tcp 协议,内网部署。
调度进程负责管理资源(帐号,对方服务器的外网地址列表,代理列表,业务进程 ...)
业务进程只管获取资源和请求和解析并回传。

最终干赢其他对手,甚至于把金融网站打崩(调度里面的动态计算任务间隔,配置成 0 了)。
起到最大作用的原因并非代码层面。

==>价值 800 元的经验在这里<==
而是找到对方服务器所在机房,并且拿到了源服务器。请求相应时间从 200ms 下降到 40ms。
pxlxh
2018-07-19 12:10:19 +08:00
看完楼上的感觉楼主是来羞辱知乎 er 的。
2379920898
2018-07-19 12:27:27 +08:00
给 1 万都不干, 免费送你 黄马褂 手套
yulon
2018-07-19 13:07:57 +08:00
@2379920898 你这种水平要能干成我给你 5 万,要走开源众包还是码市?
yjd
2018-07-19 13:15:20 +08:00
你们考虑过那个网站服务器,带宽的感受吗。被你们这么多家抢单再分摊下,还怎么快。23333
woscaizi
2018-07-19 13:24:42 +08:00
搞过类似的,是一个虚拟货币网站抢交易单子。
开始我能把网站所有单子抢了。
50 个线程,每个线程间隔 10ms,单台电脑,带宽 100M。
后来网站做了限制,单账号对单子列表的刷新限制到 1 分钟 1 次。
然后我就放弃了。

针对你的情况。
我想网络层不是问题,增加账号做新订单的刷新检测,检测到后发给想下单的账号做下单操作。试想下,如果你 1000 个账号做刷新,每个账号每次检测间隔 30 秒,一秒钟起码你可以有 30 个账号做检测,相当于 30ms 刷一次。
luw2007
2018-07-20 14:01:03 +08:00
luw2007
2018-07-20 14:03:13 +08:00
@woscaizi 如果有利可图,频次限制都解决不了这种问题。帐号,代理都有人提供。频次限制总不能影响掉普通用户吧。

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

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

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

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

© 2021 V2EX