关于如何优化外部请求的问题?

2015-08-25 08:06:56 +08:00
 hackingwu

我目前在做一个发送验证码的功能,每一次发送验证码都要去发送外部请求。我目前的是用一个线程去消费队列。当我我模拟并发,发现效率很差。差不多从队列中消费一个验证码请求需要 300ms ,而这个时间大部分都花费在了发送 http 的外部请求上了。那么我在不增加消费线程的情况下,要如何优化?这里我不知道 300ms 是主要花了在建立 http 资源请求,还是传输链路开销。我觉得主要是在 http 资源请求?是否有什么缓存,或者请求池,能够解决这个问题?谢谢!

2516 次点击
所在节点    程序员
11 条回复
dingyaguang117
2015-08-25 08:21:51 +08:00
加 DNS cache
dingyaguang117
2015-08-25 08:23:03 +08:00
另外你说的很对,你这种没什么数据传输,主要是在 DNS 解析和连接建立上。如果对方支持 keepalive 可以考虑弄个连接池
kslr
2015-08-25 08:45:30 +08:00
一个简单验证码性缓存下都很不错了,为什么还要加上这些队列什么的。
ljbha007
2015-08-25 09:12:00 +08:00
1. 没必要用队列
2. 请求是请求验证码的图片吗?那可以直接把图片的地址放在前端啊
hackingwu
2015-08-25 09:41:55 +08:00
@ljbha007 短信验证码啊,,,,
ljbha007
2015-08-25 10:49:10 +08:00
@hackingwu
原来是这样
1 、不必等 http 请求成功完成再返回 可以直接放另一个线程里让那个线程慢慢去发 接口先返回响应让前端先展示出来 这样不影响用户体验
2 、前面提到的 DNS 缓存、长连接也都可以节省请求时间
ljbha007
2015-08-25 10:52:05 +08:00
还有根据不同的语言和框架也有一些优化
比如说 java 的 nio 可以有效减少 CPU 时间在等待 IO 上的浪费
还有 nodejs tornado 也是一样的道理
ryd994
2015-08-25 11:00:30 +08:00
用 urllib3 ,带连接池
aisk
2015-08-25 13:56:28 +08:00
楼上说的都治标不治本,物理限制在那摆着呢。
invite
2015-08-25 19:35:55 +08:00
短信验证码? 那你这 300ms 的延时完全没问题, 主要延时在手机端接受密码上.
s7lx
2015-08-28 16:55:14 +08:00
@invite 人家这个肯定是发给短信网关的。
@hackingwu 建一个发送队列然后让单一的发送线程去发,业务逻辑只要往队列里丢就可以了(缺点是网络拥塞的时候延迟就很大了)

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

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

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

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

© 2021 V2EX