#!/usr/bin/env python # Filename: qpid101.py # Description: Qpid 101 # Supported Langauge(s): Python 2.7.x # Time-stamp: <2014-07-19 01:04:29 someone> # ------------------------------------------------------- # * What's qpid? # It's like a queue from data structures 101. How do you share # the queue between two or more separate programs on two more # more separate computers? Forget about passing pointers and # sharing namespaces. Instead use a network queue server with # its own protocol. Then imagine special queues like how in data # structures class there were special trees and make this server # support those special extensions to a traditional queue. # # * Could I use something other than a queue? # Sure, you could use a DB or a RESTful web-service but DBs are # better at storing data, not passing it. A web-service between # two programs doesn't allow for the message to be queued for # later if the other program is down; i.e. it is not asynchronous. # Why not make something new and focus on what it should do well? # See http://qpid.apache.org/overview.html for more justification. # # * How how do I use it? # In a 101-level nutshell follow the examples below from: # https://qpid.apache.org/releases/qpid-trunk/programming/book # # * How do I install the Python library? # On Fedroa: 'yum install python-qpid python-qpid_messaging' # # * Need a qpid server? # The swat-a-fly-with-a-telephone-pole-method... # If you have an openstack install around, allow the client (to be # written below) to connect to your openstack server on port 5672. # ------------------------------------------------------- import sys from qpid.messaging import * broker = "192.168.122.28:5672" address = "amq.topic" connection = Connection(broker) try: # establish connection to message broker connection.open() # create a session object on which messages can be sent/recv'd session = connection.session() # create a sender that sends to the given address sender = session.sender(address) # create a receiver receives messages from the given address receiver = session.receiver(address) # send the message sender.send(Message("Hello world!")); # receive the message (only wait 1 second, else wait forver) message = receiver.fetch(timeout=1) print message.content # ack receipt of message during session session.acknowledge() except MessagingError,m: print m finally: connection.close() # ------------------------------------------------------- # Not too exciting on the client: # sh-4.2$ ./qpid101.py # Hello world! # sh-4.2$ # # Let's look at the server: # * 'yum install qpid-tools' # # * Run 'qpid-printevents' and re-run qpid101.py # ** The following is the output; all lines from one run; fields trimmed # # 1. clientConnect broker=localhost:5672 rhost=192.168.122.28:5672-192.168.122.1:33254 user=anonymous # 2. queueDeclare broker=localhost:5672 rhost=192.168.122.28:5672-192.168.122.1:33254 user=anonymous # qName=41a24690-c85b-4d4b-97c4-cdfc4ae0664a:0.0 durable=F excl=T autoDel=T args={} disp=created # 3. bind broker=localhost:5672 rhost=192.168.122.28:5672-192.168.122.1:33254 user=anonymous exName=amq.topic # qName=41a24690-c85b-4d4b-97c4-cdfc4ae0664a:0.0 key=# args={} # 4. subscribe broker=localhost:5672 rhost=192.168.122.28:5672-192.168.122.1:33254 user=anonymous # qName=41a24690-c85b-4d4b-97c4-cdfc4ae0664a:0.0 dest=0 excl=F args={} # 5. unsubscribe broker=localhost:5672 rhost=192.168.122.28:5672-192.168.122.1:33254 user=anonymous dest=0 # 6. queueDelete broker=localhost:5672 rhost=192.168.122.28:5672-192.168.122.1:33254 user=anonymous # qName=41a24690-c85b-4d4b-97c4-cdfc4ae0664a:0.0 # 7. clientDisconnect broker=localhost:5672 rhost=192.168.122.28:5672-192.168.122.1:33254 user=anonymous # # Try flooding it with 'while [ 1 ]; do ./qpid101.py > /dev/null ; done' and watch it run # # * Run 'qpid-queue-stats' # ** It's a ~150 line Python program and prints the enq/deq rate every 10 seconds # # * Let's look at qpid-stat # ** It's a ~500 line Python program that displays msgIn/MsgOut per queue and other stats # ** Try 'watch "qpid-stat -q -S msgIn"' to see the queues sorted by messages in # ** run '/etc/init.d/qpidd restart' as root in another termainal and watch the msgIn reset # # queue dur autoDel excl msg msgIn msgOut bytes bytesIn bytesOut cons bind # ========================================================================================= # q-plugin 0 25.3k 25.3k 0 19.2m 19.2m 1 2 # 2dcb1680... Y 0 15.3k 15.3k 0 5.70m 5.70m 1 2 # conductor 0 7.66k 7.66k 0 8.68m 8.68m 1 2 # ... # # ** Try 'watch "qpid-stat -c -I"' to pick out who is connecting # *** Use the first 10 lines of code via a Python REPL and wrap the send in loop # *** Pick out your client address and note the change in idle, and msgIn # # client-addr cproc cpid connected idle msgIn msgOut # =================================================================================== # :5672-192.168.122.1:41724 21772 8m 25s 3m 30s 120k 40.2k # :5672-192.168.122.28:54254 cinder-volume 15803 9h 18m 17s 10s 4.72k 5.02k # ... #
Saturday, July 19, 2014
qpid101
Subscribe to:
Posts (Atom)