AmazonSQSを簡単に使えるライブラリを書いたので使い方とか #jawsug

うちの会社ではAmazon SQSをバリバリ使ってるんですが、巷では全然流行ってないらしいので、簡単に扱えるライブラリを書きました。javaBlockingQueueインターフェースを実装しているので、普段使っているQueueと差し替えることで簡単にSQSを利用することが出来ます。

githubで公開しています。

https://github.com/lettas/amazon-sqs

使い方

AmazonSQSTestに簡単な使い方が書いてありますが、軽く解説します。

出てくるクラス
AmazonSQS // クラスメソッドのconnectで、AmazonSQSのサービスに接続します。
AmazonSQSManager // SQS上のQueueインスタンスを作成したり削除したりします。
BlockingQueue<String> // javaのブロック可能なQueueインターフェース
Queueのインスタンス取得まで
final String AWS_ACCESS_KEY = "AWSのアクセスキー";
final String AWS_SECRET_ACCESS_KEY = "AWSのシークレットキー";
String key = "Queueインスタンスの識別キー";
AmazonSQSManager manager = AmazonSQS.connect(AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY);
BlockingQueue<String> queue = manager.createQueueAccessor(key);
Queueにメッセージを追加・取得する
// 追加
queue.add("Hello");

// 取得
String message = queue.poll();
System.out.println(message); // => "Hello"

注意すること

Amazon SQSは同期的に操作することが出来ません。メッセージを追加した直後に取得しようとしても、うまく取得できないことがありますし、順番も保証されていません。また、Queueのサイズを取得しても、必ずしも正しい値が返ってくるとはかぎりません。そのため、Queueが空になるまで処理をする場合は、Queueが空になっているかどうかを何回か確認するといった工夫が必要になります。また、isEmpty()がfalseだったとしても、実際には取得できないことがあるので要注意です。

こんな感じですかね。

for(int retry=0; retry<5; retry++) {
    while(!queue.isEmpty()) {
        retry = 0;
        String message = queue.poll();
        if(message == null) {
            break;
        }
        // なんか処理
    }
    Thread.sleep(1000);
}

Amazon SQSの宣伝

Amazon SQSを使うと複数台のEC2でQueueが共有できるので、タスクの分散処理が簡単になりますよ。Amazon S3と組み合わせればもっと大きなメッセージも扱えるようになるので、工夫次第であんな事やこんなことが出来ます。Queueの容量をみてEC2のインスタンスを増減するようなプログラムを書けば、タスクの量を見て自動的にスケールする素敵なアプリケーションの完成です。