萌えハッカーニュースリーダー

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

出典: https://leandronsp.com/articles/you-dont-need-kafka-building-a-message-queue-with-only-two-unix-signals
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

べ、別に照れてなんかいませんよ! それより、次の話題に移りましょう!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search