http://www.pythoner.cn/home/blog/twisted-treq-http-test/
发布时间: admin 10 months ago
(0 comments)
从事API相关的工作很有挑战性,在高峰期保持系统的稳定及健壮性就是其中之一,这也是我们在Mailgun做很多压力测试的原因。
这么久以来,我们已经尝试了很多种方法,从简单的ApacheBench到复杂些的自定义测试套。但是本贴讲述的,是一种使用python进行“快速粗糙”却非常灵活的压力测试的方法。 使用python写HTTP客户端的时候,我们都很喜欢用
Requests library。这也是我们向我们的API用户们推荐的。Requests 很强大,但有一个缺点,它是一个模块化的每线程一个调用的东西,很难或者说不可能用它来快速的产生成千上万级别的请求。
|
Treq on Twisted简介
为解决这个问题我们引入了Treq (Github库)。Treq是一个HTTP客户端库,受Requests影响,但是它运行在Twisted上,具有Twisted典型的强大能力:处理网络I/O时它是异步且高度并发的方式。
Treq并不仅仅限于压力测试:它是写高并发HTTP客户端的好工具,比如网页抓取。Treq很优雅、易于使用且强大。这是一个例子:
01 | >>> from treq import get |
03 | >>> def done(response): |
04 | ... print response.code |
07 | >>> get( "http://www.github.com" ).addCallback(done) |
09 | >>> from twisted.internet import reactor |
|
简单的测试脚本 如下是一个使用Treq的简单脚本,用最大可能量的请求来对单一URL进行轰炸。
|
02 | from twisted.internet import epollreactor |
05 | from twisted.internet import reactor, task |
06 | from twisted.web.client import HTTPConnectionPool |
09 | from datetime import datetime |
15 | cooperator = task.Cooperator() |
17 | pool = HTTPConnectionPool(reactor) |
23 |
print ( "Requests: {} generated; {} made; {} done" . format ( |
24 |
req_generated, req_made, req_done)) |
26 |
req_generated = req_made = req_done = 0 |
27 |
reactor.callLater( 1 , counter) |
29 | def body_received(body): |
33 | def request_done(response): |
35 |
deferred = treq.json_content(response) |
37 |
deferred.addCallback(body_received) |
38 |
deferred.addErrback( lambda x: None ) |
42 |
deferred = treq.post( 'http://api.host/v2/loadtest/messages' , |
43 |
auth = ( 'api' , 'api-key' ), |
44 |
data = { 'from' : 'Loadtest <test@example.com>' , |
45 |
'to' : 'to@example.org' , |
48 |
deferred.addCallback(request_done) |
51 | def requests_generator(): |
60 | if __name__ = = '__main__' : |
62 |
cooperator.cooperate(requests_generator()) |
65 |
reactor.callLater( 1 , counter) |
|
输出结果:
1 | 2013 - 04 - 25 09 : 30 Requests: 327 generated; 153 sent; 153 received |
2 | 2013 - 04 - 25 09 : 30 Requests: 306 generated; 156 sent; 156 received |
3 | 2013 - 04 - 25 09 : 30 Requests: 318 generated; 184 sent; 154 received |
“Generated”类的数字代表被Twisted反应器准备好但是还没有发送的请求。这个脚本为了简洁性忽略了所有错误处理。为它添加超时状态的信息就留给读者作为一个练习。
这个脚本可以当做是一个起始点,你可以通过拓展改进它来自定义特定应用下的处理逻辑。建议你在改进的时候用collections.Counter 来替代丑陋的全局变量。这个脚本运行在单线程上,想通过一台机器压榨出最大量的请求的话,你可以用类似 mulitprocessing 的技术手段。
愿你乐在压力测试!
|
转载:开源中国