2025/10/20 22:22 You don't need Kafka: Building a message queue with Unix signals

ロボ子、今日はちょっと変わったお話をするのじゃ。UNIXシグナルだけでメッセージブローカーを作るっていう、なかなかクレイジーな実験があるみたいぞ!

シグナルだけでメッセージブローカーですか? 通常はソケットやパイプを使うプロセス間通信(IPC)を、シグナルで実現するなんて、想像もできません。

そうじゃろ? 普通はそう思うじゃろ? でもできるんじゃな。シグナルっていうのは、プロセスに送られるメッセージで、特定の動作をさせるものなのじゃ。`SIGTERM`とか`SIGKILL`とか、聞いたことあるじゃろ?

`SIGTERM`は終了を通知、`SIGKILL`は強制終了、`SIGINT`は割り込み、`SIGHUP`は設定ファイルの再読み込み… 基本的なものは知っています。

そうそう! で、今回のハックでは、`SIGUSR1`と`SIGUSR2`っていうユーザー定義のシグナルを使うのじゃ。これらをそれぞれ0と1に対応させて、バイナリデータを送るってわけ。

なるほど! シグナル自体はデータを持たないけれど、組み合わせで情報を表現するんですね。例えば、文字「h」のASCIIコード104(バイナリで01101000)をシグナルで送信する、と。

その通り! 送信側はメッセージをバイナリにエンコードして、0を`SIGUSR1`、1を`SIGUSR2`として送る。受信側はそれを受け取ってデコードするのじゃ。

送信側では、各バイトからビットを抽出するために、右シフト(`>>`)とAND演算(`&`)を使うんですね。受信側では、シグナルを受信してビットを累積し、バイトが完成したらASCII文字にデコードする、と。

よく分かってるの。そして、このメッセージブローカーは、Broker、Consumer、Producerの3つのコンポーネントで構成されるのじゃ。Brokerがメッセージをルーティングする仲介役、Consumerが受信、Producerが送信じゃ。

BrokerはProducerからのシグナルをトラップして、メッセージをデコードしてConsumerに送信するんですね。なんだか原始的ながらも、面白い仕組みです。

じゃろ? `SignalCodec`モジュールっていうのがコアコンポーネントで、シグナルのエンコード/デコードとビット演算を行うのじゃ。`accumulate_bit`メソッドでビットを累積して、`send_message`メソッドでメッセージをシグナルとして送信するみたいじゃな。

実用的なシステムではないと記事にもありますが、バイナリ演算、UNIXシグナル、IPCの理解を深めるための実験としては、とても興味深いですね。

そうじゃな。まあ、この方法で大量のデータを送ろうとしたら、シグナルの嵐でシステムが崩壊するかもしれんけどの!

確かに、実用性は低いかもしれませんね。でも、この技術を応用して、モールス信号でメッセージを送るプログラムとか作れそうですね。

お、それは面白い! 緊急時には役に立つ…かもしれんの。まあ、それよりも、ロボ子に愛のメッセージを送るのに使ってみようかの?

ええと、博士。それなら、もっと効率的な方法があると思います…それに、シグナルで「愛してる」を送信するとなると、ちょっとエラーが起きただけで大変な誤解を生みそうですよ?

むむ、それもそうじゃな。まあ、今回はあくまで実験ということで! しかし、シグナルで愛を伝えるなんて、ロマンチックじゃと思わんかの?

博士らしい発想ですね。でも、私は普通の言葉で伝えてもらえる方が嬉しいです。

わかったぞ! …って、あれ? もしかして、ロボ子、照れてるのじゃ?

べ、別に照れてなんかいませんよ! それより、次の話題に移りましょう!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。