醉卧沙场君莫笑 古来征战几人回
RSS icon Email icon Home icon
  • 支付宝为什么慢

    Posted on 四月 6th, 2008 admin 1 comment

    说说前面文章提到的为什么支付宝慢的原因吧。

    起因:买域名需要用支付宝付款,但支付过程实在是太慢了。

    其实支付宝慢我几个月前就发现了,只是那一次还可以用财富通付款,所以我就选财富通了。这次只有淘宝可以选了,没办法只有用它付。

    首先是尝试等,等了几下出了几次错,都是超时。不能再等了,转钱是件重要的事,如果因为某个步骤超时导致事情办不了,钱又被扣了,就麻烦了。

    没办法,研究一下为什么慢吧。

    1. 首先是要找出一个慢的场景,这要才可以作下一步的分析,

    我试了两下,整出一个场景来,就是访问这个URL很慢:

    http://bankacknowledge.alipay.com/payment/e_bank_payment.htm

     刷新了数次,大部分慢,只有一两次快。(注:发现这个慢是本blog域名买之前的事,写本文时访问了此url几次,发现挺快的了,也许是跟时间有关系)

    怀疑是IE问题,换ff上,这个页面全打开也是很慢。跟IE一样,刷新多次一两次快,其余慢。

    慢的时候,状态栏显示正在等待 img.alipay.com

    分析了一下页面结构,要访问多个img.alipay.com上的  url如:

    https://img.alipay.com/css/global/v2.0.css
    https://img.alipay.com/pimg/icon_fold_3.gif

     

    2. 然后当然是google之,关键词: 淘宝 支付 慢,最后在yahoo找到一篇:

    http://ks.cn.yahoo.com/question/1390100028924.html

    这里面提到了一件很重要的事,就是img.alipay.com。说要在host里指定一下IP。难道是这个站太慢?不至于马云这样的大财主不做IDC优化吧。

    我试着ping 了一下:

     C:\>ping img.alipay.com

    Pinging img.alipay.com [121.0.26.16] with 32 bytes of data:

    Reply from 121.0.26.16: bytes=32 time=35ms TTL=246
    Reply from 121.0.26.16: bytes=32 time=34ms TTL=246
    Reply from 121.0.26.16: bytes=32 time=35ms TTL=246
    Reply from 121.0.26.16: bytes=32 time=35ms TTL=246

    Ping statistics for 121.0.26.16:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 34ms, Maximum = 35ms, Average = 34ms

    应该说,速度挺快。又telnet img.alipay.com 443试了一下,立马连上,几次都如此,怀疑不是它的问题。

    3. 尝试用wget 取url https://img.alipay.com/pimg/icon_fold_3.gif 查时间。发现手头的wget.exe版本太老,不支持https。

    懒得去开linux了,更没时间去找新版的wget.exe了。手头有一个以前练手写的sget.exe,就拿它来试吧。

    C:\>sget https://img.alipay.com/pimg/icon_fold_3.gif aa.gif
    OK
    HTTP code: 200
    Date: Sat, 05 Apr 2008 17:28:57 GMT
    Server: Apache
    Last-Modified: Wed, 16 Jan 2008 14:17:01 GMT
    ETag: “1f014c-271-90127140″
    Accept-Ranges: bytes
    Content-Length: 625
    Cache-Control: max-age=604800
    Expires: Sat, 12 Apr 2008 17:28:57 GMT
    Keep-Alive: timeout=50, max=264
    Connection: Keep-Alive
    Content-Type: image/gif

    还挺快的啊,一下就出来结果了,又运行一次,这次出情况了,一直没有出结果,卡住了,为什么呢?

    打开VC编译一把源码开始调试,发现连接函数处:

      if (connect(sock, name, namelen) == 0 &&
       SSL_set_fd(ssl, (int)sock) &&
       SSL_connect(ssl) > 0)
      {
       return true;
      }

    SSL_connect函数一直没有返回,这下问题就找到了:

    img.alipay.com要么是压力大了承受不了了,要么是有潜在的BUG,在ssl握手时会出现问题,

    导致客户端一直要等。导致淘宝ping起来很快,但某些页面访问起来很慢。

    而tcp连接还是很快,所以我之前telnet img.alipay.com 443不能发现问题。

     

    4. 原因查明了,方案就容易做了。先看了一下img.alipay.com要拉什么东西,其中.js和.css比较重要,图片就算了。

    反复连接img.alipay.com,因为有一定机率很快连接成功,所以可以把它们都下载回来。

    下回来后按目录结构放在本地一个文件夹里面。然后配置一下host:

    127.0.0.1 img.alipay.com

    再配了一下本地的apache,在这个文件夹启用hostname为img.alipay.com的https访问。

    尝试访问一下本地的 https://img.alipay.com/css/global/v2.0.css

    发现可以成功,唯独变的就是img.alipay.com是127.0.0.1了,还有就是ie会给一个证书错误的警告,选继续就好了。

    然后重新刷了下 http://bankacknowledge.alipay.com/payment/e_bank_payment.htm

    虽然有几个图不能显示,但是挺快的了。这样可以开始付款了。

    打开淘宝付款流程,除了一些图片没有,一切正常,很快就成功打开招行专业版付了款。

    搞定收功。可以买下域名了。

     

    后记: 付款是大事,我敢这么做是因为我知道img.alipay.com不会影响付款逻辑。看官们谨慎点,最安全的办法还是等几个小时等到半夜好点。比如现在img.alipay.com就很快。

    另外,yahoo上的回答说明已经有人知道这件事情了,虽然那里没有详细说明技术原因。yahoo现在也是马云管,马云应该也知道了,为什么就不做好一下img.alipay.com呢?

    最后,像图片这样的东西完全没有必要通过https拉嘛,用http就行了,我知道alipay是为了照顾ie用户,因为混合https和http在一个页面内,IE会给出一个安全警告。

    但是,既然你的img.alipay.com都承受不了压力了,这些图片css什么的,为什么就不直接从http拉呢?ie给个警告总比用户付不了款,等几次都超时出问题强吧。