<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SQS</title><link>https://blog.ast.moe/tags/sqs/</link><description>Recent posts from 五里霧中</description><generator>Hugo</generator><item><title>SQSをローカルでテストする互換シミュレーター「lqs」を公開した</title><link>https://blog.ast.moe/blog/2026-09-19/</link><pubDate>Sat, 19 Sep 2026 20:05:53 +0900</pubDate><guid>https://blog.ast.moe/blog/2026-09-19/</guid><description>&lt;p&gt;SQSをローカルでテストするための互換シミュレーター、
&lt;span&gt;
&lt;a target="_blank" href="https://github.com/ieee0824/lqs"&gt;
lqs
&lt;/a&gt;
&lt;img class="external-link-icon" src="https://blog.ast.moe/images/outer-link.png" width="12" height="12" alt="" aria-hidden="true" loading="lazy"&gt;
&lt;/span&gt;
を公開した。名前は &lt;strong&gt;local queue service&lt;/strong&gt; の略。&lt;/p&gt;
&lt;p&gt;AWS SDKから接続できるHTTP APIを用意していて、StandardキューとFIFOキューの送受信や、可視性タイムアウト、DLQへの移動などを手元で試せる。&lt;/p&gt;
&lt;p&gt;一旦、用意していたissueが全部片付いたので公開することにした。&lt;/p&gt;
&lt;h2 id="sqsをローカルで試したかった"&gt;SQSをローカルで試したかった&lt;/h2&gt;
&lt;p&gt;SQSを使うアプリケーションを書いていると、キューへ送ったメッセージをワーカーが受け取るところまで、ローカルで動かしたくなる。&lt;/p&gt;
&lt;p&gt;単に送信と受信が成功するだけでなく、処理中にワーカーが落ちたらどうなるか、同じメッセージを再送したらどうなるかも確認したい。そのたびにAWS上のキューを用意するのも少し面倒だった。&lt;/p&gt;
&lt;p&gt;ローカルでSQSを使うためのものは既にあって、
&lt;span&gt;
&lt;a target="_blank" href="https://docs.localstack.cloud/aws/services/sqs/"&gt;
LocalStack
&lt;/a&gt;
&lt;img class="external-link-icon" src="https://blog.ast.moe/images/outer-link.png" width="12" height="12" alt="" aria-hidden="true" loading="lazy"&gt;
&lt;/span&gt;
や
&lt;span&gt;
&lt;a target="_blank" href="https://github.com/softwaremill/elasticmq"&gt;
ElasticMQ
&lt;/a&gt;
&lt;img class="external-link-icon" src="https://blog.ast.moe/images/outer-link.png" width="12" height="12" alt="" aria-hidden="true" loading="lazy"&gt;
&lt;/span&gt;
がある。&lt;/p&gt;
&lt;p&gt;LocalStackはSQSを含む複数のAWSサービスをローカルで扱う環境で、ElasticMQはSQS互換インターフェースを持つメッセージキュー。SQSのエミュレーターを探すと、このあたりが出てくる。&lt;/p&gt;
&lt;p&gt;自分でも、SQSを使う処理の開発・テストに使えるものを作ってみたくなった。そこから作り始めたのがlqsになる。&lt;/p&gt;
&lt;h2 id="aws-sdkから接続できるhttp-api"&gt;AWS SDKから接続できるHTTP API&lt;/h2&gt;
&lt;p&gt;lqsはローカルでHTTPサーバーとして起動する。アプリケーション側では、SQSクライアントの接続先をlqsへ向けて使う。&lt;/p&gt;
&lt;p&gt;既定の接続先は&lt;code&gt;http://127.0.0.1:9324&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;キューの作成、メッセージの送信・受信・削除といった操作をHTTP APIから実行できる。JSON形式とSQS Query形式の両方に対応している。&lt;/p&gt;
&lt;p&gt;実際にAWS SDK for Go v2からサーバーへ接続する結合テストも用意した。送受信だけでなく、FIFOやDLQ、エラー応答なども確認している。&lt;/p&gt;
&lt;p&gt;署名の検証は行わないので、SDKに設定する認証情報はローカル用のダミー値でよい。テストではアクセスキーとシークレットにそれぞれ&lt;code&gt;test&lt;/code&gt;、リージョンに&lt;code&gt;us-east-1&lt;/code&gt;を指定している。&lt;/p&gt;
&lt;h2 id="今できること"&gt;今できること&lt;/h2&gt;
&lt;p&gt;主な対応機能はこんな感じ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;機能&lt;/th&gt;
&lt;th&gt;試せること&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Standard / FIFO&lt;/td&gt;
&lt;td&gt;メッセージの送受信、FIFOのグループ内の順序制御&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可視性タイムアウト&lt;/td&gt;
&lt;td&gt;受信後の一時的な非表示、期限切れ後の再受信、期限の変更&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIFOの重複排除&lt;/td&gt;
&lt;td&gt;IDや本文を使った送信の重複排除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ロングポーリング&lt;/td&gt;
&lt;td&gt;メッセージの到着を待って受信&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DLQ&lt;/td&gt;
&lt;td&gt;受信回数の上限に達したメッセージの移動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;遅延・保持期限&lt;/td&gt;
&lt;td&gt;すぐに配信しないメッセージや、期限切れの扱い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バッチ操作&lt;/td&gt;
&lt;td&gt;複数メッセージの送信・削除・可視性変更&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;属性・キュー管理&lt;/td&gt;
&lt;td&gt;メッセージ属性、キュー設定、一覧、タグ、パージなど&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;キューの設定やメッセージはローカルに保存できるので、再起動して続きを確認することもできる。&lt;/p&gt;
&lt;h3 id="処理に失敗したときの再配信とdlq"&gt;処理に失敗したときの再配信とDLQ&lt;/h3&gt;
&lt;p&gt;キューから受信しただけでは、メッセージは削除されない。処理が終わってから削除する。&lt;/p&gt;
&lt;p&gt;途中でワーカーが落ちて削除できなかった場合は、可視性タイムアウトが切れると再び受信できる。この動きをローカルでも試せるようにした。&lt;/p&gt;
&lt;p&gt;何度やっても処理できないメッセージは、設定した受信回数の上限に達したあと、再び受信対象になるタイミングでDLQへ移す。&lt;/p&gt;
&lt;p&gt;正常なメッセージだけを流していると気づかないこともあるので、こういう失敗側の動きを試せるのは欲しかったところ。&lt;/p&gt;
&lt;h3 id="fifoの順序と重複排除"&gt;FIFOの順序と重複排除&lt;/h3&gt;
&lt;p&gt;FIFOでは、同じグループのメッセージの順序を維持しながら、別のグループの処理を進められる。&lt;/p&gt;
&lt;p&gt;例えば注文ごとにグループを分ければ、同じ注文のイベントを順に処理しつつ、別の注文も扱える。&lt;/p&gt;
&lt;p&gt;送信の重複排除もあり、5分間の重複排除期間内に同じIDで再送しても、新しいメッセージを追加しない。本文から重複を判定する設定も使える。&lt;/p&gt;</description></item></channel></rss>