kuiperbeltでwebsocketする

この記事はOSS紹介 Advent Calendar 2017 の 25日目の記事です。


「サーバーからクライアントにPushしたい!」、そんな時に便利なツールの紹介です。

GitHub - mackee/kuiperbelt: Asynchronous Protocol Proxy

kuiperbeltはクライアントとWebSocketをつないでやり取りする部分を担ってくれます。

使い方

上記githubリポジトリにreleaseがあるので、ダウンロードできます。

readmeにある通りクライアントが接続してきた時と切断してきた時のcallback先を書いてあげて起動。 あとはアプリでcallback先を実装します。

kuiperbeltサーバーが複数台ある場合、どのクライアントがどのkuiperbeltに接続しているかはkuiperbelt側では管理していないので、アプリ側でconnectしてきた X-Kuiperbelt-Session とどのkuiperbeltが接続しているのかを記録してあげます。

あとはPushしたくなった時に X-Kuiperbelt-Session を指定して、kuiperbeltのsendを叩いてあげるとクライアントにPushされます。

詳しくは 日本語のREADME があるので、そちらを見てもらったほうが良いと思います。

嬉しいこと

  • WebSocketの接続がアプリ側の管理ではなくなる

アプリは(サービスの種類に依ると思いますが)、日に何回もデプロイしたりします。
その度にWebSocketが切断されてしまうと困りますし、再接続がまとめて流れてきてしまうと困ります。
kuiperbeltはWebSocket経由でのPushのみを薄く提供してくれているため、kuiperbeltの更新をしたい場合以外では落としたりすることはないので、これらのことを考えなくても良くなります。

  • クライアントからWebSocket経由で情報は送信できない

Pushする機能のみなので、クライアントからは送信できません。
用途にもよりますが、WebSocketでガンガン通信をするからオーバーヘッドを減らしたいということがなければ、クライアントからのリクエストは普通にAPI叩いてもらったほうがログ的にもサーバーの実装的にも複雑にならないので、嬉しいかなと思います。

ちょっと面倒なこと

  • 複数台あるkuiperbeltサーバーに対して、クライアントがどこに接続しているは保存しておかないといけない

X-Kuiperbelt-Session とサーバー内におけるアカウントの識別子を紐付けておくだけで送信できるようになると非常に嬉しいですが、今はまだできないです。
(kuiperbelt自体が単体のバイナリとして動作するようになっているので、当然ではありますが)

例えば、10人のクライアントに同じ情報を送信したい時に全員の接続しているを引いてこなければならないですが、それぞれが別々のkuiperbeltに接続している場合、アプリ側で10回別々のkuiperbeltのsendを叩いてあげないといけません。

いつかクラスタみたいなものが形成されて、一つのエンドポイントにまとめて投げたら、うまいことやってくれるとかになったら嬉しいですね!

まとめ

アプリケーションとしては、WebSocketについて考えず、普通のAPIエンドポイントを実装していくだけでクライアントにPushできる便利なKuiperbeltの紹介でした。