需求是短时间内发送大量 GET 和 POST 请求,支持并行,要有极致的效率,慢一毫秒都无法接受的那种。
我现在已经用 Python 的异步方式实现了一个小 Demo,用到了 Trio 和 HTTPX 这两个包。但是速度并不满意。虽然能够并发,但是随着并行数量越来越多,提升硬件和带宽并不能提升效率。毕竟异步仍然是单核单线程。
我也搜了相关的内容,比如用 Go 语言试试。但是时间有限,比较着急,希望熟悉的大佬能指点一下,谢谢。
需求是短时间内发送大量 GET 和 POST 请求,支持并行,要有极致的效率,慢一毫秒都无法接受的那种。
我现在已经用 Python 的异步方式实现了一个小 Demo,用到了 Trio 和 HTTPX 这两个包。但是速度并不满意。虽然能够并发,但是随着并行数量越来越多,提升硬件和带宽并不能提升效率。毕竟异步仍然是单核单线程。
我也搜了相关的内容,比如用 Go 语言试试。但是时间有限,比较着急,希望熟悉的大佬能指点一下,谢谢。
|
JoooooooooDec 14, 2020
1
java 的 netty
|
|
2
时间有限那就要看你们团队最擅长的语言是什么了,当然 go 确实满足你的需求
|
|
learningmanDec 14, 2020
3
快那就 C 啊,libcurl,不过这个线程不安全
|
|
maocatDec 14, 2020
4
golang 纯天然的并发啊
|
|
WalkingEraserDec 14, 2020 via Android
5
Erlang OTP,一门为并发而生的软实时语言
|
|
6
Elixir / Erlang
Actor 模型做这种相对独立的并行任务比 CSP 模型更舒服些。 |
|
misaka19000Dec 14, 2020
7
任何语言都实现不了「慢一毫秒都无法接受」,包括市面上主流的操作系统也实现不了你这个需求
|
|
misaka19000Dec 14, 2020
8
go 肯定不行,go 还有 gc 呢,对比你这个需求简直是太慢了
C 或者 C++可能也不行,因为操作系统可能会对进程进行 schedule 导致处理时间变慢 综上,你只能使用实时操作系统,并且配合 C 语言 |
|
shoalyDec 14, 2020
9
这种场景, 瓶颈通常在 网络那边, 不在本机吧..
|
|
FutherAllDec 14, 2020
10
啥应用场景,火箭发射吗?
|
|
renmu123Dec 14, 2020 via Android
11
发送请求是网络密集型,用不了多少 cpu 。可以多开几个进程搭配异步。go 应该是目前携程用起来最爽的语言了,性能肯定达不到你说的慢 1ms,手写机器语言应该可以达到速度最优但是达不到快速。
|
|
12
慢一毫秒都无法接受的那种,只有 rtos+硬件中继能满足你了
|
|
GMDec 14, 2020
13
一脸问号:既然追求极致效率,还用 HTTP ?果断 Socket 走起啊。
|
|
wuwukai007Dec 14, 2020 via Android
14
随着并发数量增多,效率降低,开多进程作负载应该可以提升不少吧
|
|
YouLMAODec 14, 2020
15
量化交易, JP Morgan 开源的嵌入式编程, 使用微波通信, 比光纤快
|
|
16
"慢一毫秒都无法接受"
操作系统的调度是有随机性的,网络的拥堵程度也是不可控的。 另外,速度和吞吐量是两个矛盾的指标。你的标题要“大量并发”,你的正文要“极致速度”,这两个指标是不可能同时满足的 |
|
17
可能我描述的不太准确。就像 DDOS 那样,只管发,不管目标服务器的反馈。只是尽最大可能保证极致速度。
|
|
hdbzsgmDec 14, 2020
18
c++
|
|
19
你用 Python 实现的 demo 瓶颈在于 Python 只能是单核单线程的情况下直接多跑几个不就可以了吗= =...
|
|
20
@WalkingEraser 我也搜到了 Erlang,但是这门语言的文档和资料少之又少,倒是看国外的社区有很多人推荐。如果用 GO 也可以的话,想用 GO 试试。
|
|
mclxlyDec 14, 2020
23
|
|
zachlhbDec 14, 2020 via Android
24
tornado
|
|
tempdbanDec 14, 2020 via Android
25
你要找的是测试仪? t-rex
|
|
march1993Dec 14, 2020
26
要求这么高,就不要用 http 了吧,自己写 socket 调优?
|
|
MeteorCatDec 14, 2020 via Android
27
估计得上实时系统
|
|
opengpsDec 14, 2020
28
不要纠结单线程多线程,你还可以考虑下多进程。
我之前开发 gps 压测 tcp 连接的时候,用了一个非常简易的小客户端,然后一个 1080 的屏幕摆满了满满一屏幕小窗口,以至于单个系统发起的连接都已经达到了 65535 的极限,最后开多个电脑内网压测 |
|
29
慢一毫秒都不行,VxWorks ?
|
|
woctordhoDec 14, 2020 via Android
30
Erlang,传说中的面向并发编程
|
|
qinfenskyDec 14, 2020 via iPhone
31
elixir ?
|
|
kevinwanDec 14, 2020 via iPhone
32
https://github.com/tal-tech/go-zero
可以试试,我们百万级 qps 平均延迟一般 30 毫秒内 |
|
wjxforuDec 14, 2020
33
erlang 可以考虑一下. erlang vm 对于软实时这方面的优化非常好了. erlang 线程甚至可以支持几十万的线程的并发了.
书籍的话. 入门: Erlang 趣学指南 https://book.douban.com/subject/26868859/ 进阶: 高伸缩性系统 https://book.douban.com/subject/30262041/ 熟悉了 gen_server 之后, 可以快速的开发 server 服务了. OTP 框架已经处理了非常多的考虑了. |
|
zvl0reqglvdDec 14, 2020
34
硬实时操作系统+C 估计可以,是火箭导弹发射呢?还是月球车遥控呢?
|
|
janxinDec 14, 2020
36
直接上 RTOS 杜绝多余操作系统开销
|
|
SaltCatDec 14, 2020
37
> 一毫秒都无法接受
rust + tokio 吧. |
|
sampengDec 15, 2020 via iPhone
38
毫秒都不行…只有 c 了…当然如果怕写出安全漏洞,那自然是 rust 了。允许毫秒的损失; golang 最合适。
|
|
samuelDec 15, 2020
39
如果把极致性能作为唯一要求,那应该就是 C 了,然后应该还用得上 DPDK: https://www.dpdk.org/
|
|
echowuhaoDec 15, 2020
40
|
|
opiviqoDec 15, 2020
41
写裸机程序 不要操作系统 c 语言
|
|
mingl0280Dec 15, 2020 via Android
42
C 裸机程序,就这样了……
|
|
43
所以昨晚 Google 宕机是楼主在做测试吗?
|
|
dotw2xDec 15, 2020 via iPhone
44
讲真,并发并行考虑下 Erlang,蛮屌的
|
|
46foDec 15, 2020
45
慢一毫秒都不行?不是局域网的话网络延迟都大于一毫秒了。
|
|
46
FPGA 吧, 量化交易这么干的
|
|
wertyDec 15, 2020
47
堆机器?
这是最简单的方案了吧 |
|
dzmcsDec 15, 2020
48
tcp 不行啊,你得自研新协议,得点对点,不能路由存储转发了,或者只有几级转发
自研了协议,也不用 rtos 了,网络中断事件里自己调度任务,貌似只有这样才能满足 1ms 都不延误 |
|
q149072205Dec 15, 2020
49
大并发和语言有毛关系,是整个系统的架构问题,可以做负载转发啊。。
|
|
jtnwmDec 15, 2020 via Android
50
FPGA +1
|
|
jtnwmDec 15, 2020 via Android
51
FPGA 应该可以满足这样极致的效率,不过成本应该挺高的😂
|
|
52
@philipjf 但是我没 D Google,D 的墙内某节点。
首先感谢这么多大佬回答。怪我没有描述清楚。 其实我的核心需求和 DDOS 差不多,只不过还有大量业务逻辑,比如接收到目标服务器关键反馈做出处理。 |
|
yolee599Dec 15, 2020 via Android
53
不是这么设计的啊,网络延时都不稳定
|
|
ivan_wlDec 15, 2020
54
dpdk +1
|
|
mingszDec 15, 2020
55
c rust
|
|
manzhiyongDec 15, 2020
56
你这是要 dns 旁路投毒吗
|
|
dartabeDec 15, 2020
57
可以用高级语言设计之后转成 FPGA 架构 HLS
但不是短时间搞得定的 不知道有没有谁提供定制化服务 |
|
dartabeDec 15, 2020
58
AWS AZURE 服务器集群的智能网卡都是 FPGA 做的
|
|
zfishDec 15, 2020
59
必须上 elixir/erlang 了
|
|
StlinDec 15, 2020
60
go go go
|
|
GreatshuDec 15, 2020
61
上 FPGA 吧,这个需求适合用 C/汇编
|
|
jinliming2Dec 15, 2020
62
只管发不管收,那我建议直接 socket,建立 TCP 连接之后直接把固定的 HTTP 协议头硬编码作为 byte[] 发出去,不要走 HTTP 那一套。
建议 C 语言。 这种小程序,随便网上一搜就能搜到 sockst 编程示例。 另外起多个进程,有几个 CPU 核心就起几个进程,进程指定 CPU 亲和性,每个进程分配到指定的 CPU 上。 |
|
CRVVDec 16, 2020
63
需求不是这么提的,不能用 “尽最大可能” 这几个字。如果要用 “尽最大可能”,那你就需要明确项目预算或者类似的限制。
尽最大可能提高速度,那当然是直接把 Internet 停了,全给你一个人用,同时把光纤铺满地球,地表满了就打洞过去,如果嫌光在介质里的速度不够快还可以再开发个不用光纤的传输方式,这样才叫尽最大可能。 另外,所谓速度其实是两件事情,高吞吐量高和低延迟。DDOS 那样应该是高吞吐量但延迟无所谓。但楼主又说“慢一毫秒都无法接受”,这和 DDOS 完全是两码事了。 |
|
jones2000Dec 16, 2020
64
c++开发, 或者上集群靠机器顶
|
|
jones2000Dec 16, 2020
65
另外你的写了你的需求, 但是预算没写呀。 预算越多, 并发越快。给多少钱就办多少事。
|
|
nmapDec 16, 2020
66
是不是昨天 google 宕机就是你干的?
|