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