以前DynamoDBをLocalで建てるようにしたことでDynamoDBを使ったサービスの開発やテストがローカルで完結できるようになって幸せをかみしめていたのですが、このたびSQSも使うことになり、さてどうしたものかと思っていたらElasticMQというSQS互換インターフェイスを持った実装が存在することを知って、使ってみました。なお自分はElasticってつくとなんでもAWSのサービスみたいに感じてますが、ElasticMQとElasticSearchはAWSのサービスではないですね。
ElasticMQはJavaで実装されてるので、ダウンロードしてきて実行すればいいだけなので超簡単。開発も今のところ継続的に行われており、ロングポーリングもver 0.7から対応しているようで素敵です。
1 |
java -jar elasticmq-server-0.8.0.jar |
Pythonでbotoを使ってキューを登録してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import sys from boto.sqs import regioninfo from boto.sqs.message import Message AWS_ACCESS_KEY='TEST' AWS_SECRET_KEY='TEST' queue_name = 'test_queue' name = "localhost" endpoint = "localhost" fake_region = regioninfo.SQSRegionInfo(name=name, endpoint=endpoint) conn = fake_region.connect(aws_access_key_id="TEST", aws_secret_access_key="TEST", port=9324, is_secure=False); queue = conn.create_queue(queue_name) queue.write(Message(body='QUEUE TEST')) |
アクセスキーとシークレットはダミーですので何を指定してもいいっぽいです。 続いてキューを読み出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import sys from boto.sqs.message import Message from boto.sqs import regioninfo AWS_ACCESS_KEY='TEST' AWS_SECRET_KEY='TEST' queue_name = 'test_queue' name = "localhost" endpoint = "localhost" fake_region = regioninfo.SQSRegionInfo(name=name, endpoint=endpoint) conn = fake_region.connect(aws_access_key_id="TEST", aws_secret_access_key="TEST", port=9324, is_secure=False); queue = conn.create_queue(queue_name) queue.set_attribute('ReceiveMessageWaitTimeSeconds', 20) i=0 while 1: msgs = queue.get_messages(10) for msg in msgs: print msg.get_body() queue.delete_message(msg) |
読み出しのループを回しておいてキューにデータを入れると、読み出されているのがわかります。
ロングポーリングが正しく動いていない気がするので、今後調査の方向で。