RabbitMQ 測試問題
使用eventlet併發consumer腳本:
eventlet.monkey_patch(all=True)
msg_per_queue = 50
queue_num = 10
rabbit_host = '10.23.54.150:5672'
class Consumer():
def __init__(self,
count):
self.queue_name = 'test_queue%d' % count
self.i=0
self.a=None
self.b=None
server = {'host':rabbit_host,
'userid':'guest',
'password':'guest', 'ssl':False}
self.conn = amqp.Connection(
server['host'],
userid=server['userid'],
password=server['password'],
ssl=server['ssl'])
self.ch = self.conn.channel()
self.ch.access_request('/data', active=True,
read=True)
self.ch.exchange_declare(exchange='rabbit_test_concurrent',
type='topic',
durable=True,
auto_delete=False)
self.ch.queue_declare(queue=self.queue_name,
durable=True,
exclusive=False, auto_delete=False)
self.ch.queue_bind(queue=self.queue_name,
exchange='rabbit_test_concurrent',
routing_key=self.queue_name)
def showmsg(self,
msg):
if self.i == 0:
self.a =
time.time()
self.i = self.i + 1
msg.channel.basic_ack(msg.delivery_tag)
if self.i == msg_per_queue:
self.b
=time.time()
msg.channel.basic_cancel(msg.consumer_tag)
if msg.body == 'quit':
msg.channel.basic_cancel(msg.consumer_tag)
def
__call__(self):
self.ch.basic_consume(self.queue_name,
callback=self.showmsg)
try:
while
self.ch.callbacks:
self.ch.wait()
self.ch.close()
self.conn.close()
except KeyboardInterrupt, e:
print
'hello'
raise
e
if __name__ == '__main__':
consumers = []
pool =
eventlet.GreenPool()
try:
for i in range(1, queue_num+1):
consumer =
Consumer(i)
consumers.append(consumer)
pool.spawn_n(consumer)
pool.waitall()
except KeyboardInterrupt
:
msg_sum = sum(consumer.i for consumer in
consumers)
print 'the sum of received
messages is %d' % msg_sum
exit()
a = min(consumer.a for
consumer in consumers)
b = max(consumer.b for
consumer in consumers)
if a and b:
print 'the time used is %f' % (b-a)
運行出現下面問題:
Traceback (most recent call last):
File "consumer_concurrent_eventlet.py",
line 68, in
consumer =
Consumer(i)
File "consumer_concurrent_eventlet.py",
line 27, in __init__
ssl=server['ssl'])
File
"/usr/lib/python2.6/site-packages/amqplib-1.0.2-py2.6.egg/amqplib/client_0_8/connection.py",
line 138, in __init__
self._x_start_ok(d,
login_method, login_response, locale)
File
"/usr/lib/python2.6/site-packages/amqplib-1.0.2-py2.6.egg/amqplib/client_0_8/connection.py",
line 719, in _x_start_ok
self._send_method((10,
11), args)
File
"/usr/lib/python2.6/site-packages/amqplib-1.0.2-py2.6.egg/amqplib/client_0_8/abstract_channel.py",
line 76, in _send_method
method_sig, args,
content)
File
"/usr/lib/python2.6/site-packages/amqplib-1.0.2-py2.6.egg/amqplib/client_0_8/method_framing.py",
line 252, in write_method
self.dest.write_frame(1,
channel, payload)
File
"/usr/lib/python2.6/site-packages/amqplib-1.0.2-py2.6.egg/amqplib/client_0_8/transport.py",
line 165, in write_frame
frame_type, channel,
size, payload, 0xce))
File
"/usr/lib/python2.6/site-packages/eventlet-0.13.0-py2.6.egg/eventlet/greenio.py",
line 307, in sendall
tail = self.send(data,
flags)
File
"/usr/lib/python2.6/site-packages/eventlet-0.13.0-py2.6.egg/eventlet/greenio.py",
line 293, in send
total_sent +=
fd.send(data[total_sent:], flags)
socket.error: [Errno 104] Connection reset by peer
將代碼進行如下修改,貌似可解決問題:
if __name__ ==
'__main__':
consumers = []
pool = eventlet.GreenPool()
try:
for i in
range(1, queue_num+1):
consumer = Consumer(i)
consumers.append(consumer)
pool.spawn_n(consumer)
pool.waitall()
except KeyboardInterrupt :
msg_sum =
sum(consumer.i for consumer in consumers)
print 'the
sum of received messages is %d' % msg_sum
exit()
改爲如下:
if __name__ == '__main__':
consumers = []
pool =
eventlet.GreenPool()
try:
for i in range(1, queue_num+1):
consumer =
Consumer(i)
consumers.append(consumer)
print '%d connection is open' % i
for consumer in consumers:
pool.spawn_n(consumer)
pool.waitall()
except KeyboardInterrupt
:
msg_sum = sum(consumer.i for consumer in
consumers)
print 'the sum of received
messages is %d' % msg_sum
exit()
當發現問題時,第一反映是服務器端可能出現了tcp連接數限制問題,覺得自己腳本正常。通過打印標誌得到原來好多鏈接並沒有connection成功。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.