我目前在做一个发送验证码的功能,每一次发送验证码都要去发送外部请求。我目前的是用一个线程去消费队列。当我我模拟并发,发现效率很差。差不多从队列中消费一个验证码请求需要 300ms ,而这个时间大部分都花费在了发送 http 的外部请求上了。那么我在不增加消费线程的情况下,要如何优化?这里我不知道 300ms 是主要花了在建立 http 资源请求,还是传输链路开销。我觉得主要是在 http 资源请求?是否有什么缓存,或者请求池,能够解决这个问题?谢谢!
1
dingyaguang117 2015-08-25 08:21:51 +08:00
加 DNS cache
|
2
dingyaguang117 2015-08-25 08:23:03 +08:00
另外你说的很对,你这种没什么数据传输,主要是在 DNS 解析和连接建立上。如果对方支持 keepalive 可以考虑弄个连接池
|
3
kslr 2015-08-25 08:45:30 +08:00
一个简单验证码性缓存下都很不错了,为什么还要加上这些队列什么的。
|
4
ljbha007 2015-08-25 09:12:00 +08:00
1. 没必要用队列
2. 请求是请求验证码的图片吗?那可以直接把图片的地址放在前端啊 |
6
ljbha007 2015-08-25 10:49:10 +08:00 via Android
@hackingwu
原来是这样 1 、不必等 http 请求成功完成再返回 可以直接放另一个线程里让那个线程慢慢去发 接口先返回响应让前端先展示出来 这样不影响用户体验 2 、前面提到的 DNS 缓存、长连接也都可以节省请求时间 |
7
ljbha007 2015-08-25 10:52:05 +08:00 via Android
还有根据不同的语言和框架也有一些优化
比如说 java 的 nio 可以有效减少 CPU 时间在等待 IO 上的浪费 还有 nodejs tornado 也是一样的道理 |
8
ryd994 2015-08-25 11:00:30 +08:00 via Android
用 urllib3 ,带连接池
|
9
aisk 2015-08-25 13:56:28 +08:00
楼上说的都治标不治本,物理限制在那摆着呢。
|
10
invite 2015-08-25 19:35:55 +08:00
短信验证码? 那你这 300ms 的延时完全没问题, 主要延时在手机端接受密码上.
|