GoSNS
概要
AmazonSNS likeな、簡易メッセージングサーバーを練習がてら書いてみました。
(Amazon SNSちゃんと使ったことないので、ぜんぜん違うかもしれないですが…)
モデルは、Pub/Subを意識しています。
機能概要
- Channel登録
- Channelに対して購読登録
- 購読手段はSlackのWebHook一択(Mail等の対応も検討中)
- 新規Channelの開設
- Handshakeリクエスト
簡易API Doc一覧
メルカリ製のgo-httpdocを利用してドキュメント生成しました。
I/F
基本POSTリクエストでサーバーとやり取りをします。
POSTのBodyに下記のRequest構造のJSON
を書き込んでリクエストします。
Channel登録 (/meta/channel)
新規に開設したい、Channelを登録します。
Request
名前 | 型 | 概要 |
---|---|---|
channel | String | 登録したいchannel名 |
サンプル
{ "channel": "golang" }
Response
JSON構造
名前 | 型 | 概要 |
---|---|---|
channel | String | 登録したchannel名 |
successful | String | 登録成否 |
error (optional) |
String | エラー |
購読登録 (/meta/subscribe)
購読の登録をします。
現在は、Slack通知(WebHook URL)を用いての手法にのみ対応しております。
Request
名前 | 型 | 概要 |
---|---|---|
channel | String | /meta/subscribe |
client_id | String | ID(現在は適当な文字列) |
subscriptions | Array(String) | 購読したいchannelのリスト |
method | Method | 購読手法 |
Method
名前 | 型 | 概要 |
---|---|---|
method | String | 購読手段(下記選択) - slack |
webhook_url | String | Slack WebHookURL (slack選択時必須) |
サンプル
{ "channel": "/meta/subscribe", "client_id": "MRAjWwhTHcgagka", "subscription" : [ "/golang" ], "method" : { "format": "slack", "webhook_url": "https://hooks.slack.com/services/XXX" } }
Response
JSON構造
名前 | 型 | 概要 |
---|---|---|
channel | String | /meta/subscribe |
successful | String | 購読成否 |
client_id | String | ID |
subscriptions | Array(String) | 購読したchannelのリスト |
error (optional) |
String | エラー |
Topic登録 (/topic)
Channelに対して、Topicを登録します。
Request
名前 | 型 | 概要 |
---|---|---|
channel | String | Topic登録するchannel名 |
data | String | Topic内容 |
{ "channel": "/golang", "data" : "*Update GAE Go1.8*" }
Response
文字列
文字列 | |
---|---|
成功 | ok |
失敗 | not found channel |
内部実装
どのように実装をしているか、メモ書き程度に残しておきます。
Pub/Sub Model
PublisherとSubscriberの関係は、1Topicに限ると1対多の関係です。
PublisherはどのSubscriberに送信するかといった情報には関与しません。
Publisherはtopicを送るだけ、Subscriberは送られたTopicを購読するだけといった構成です。
データ保持
購読データの保持は、JSONファイル
にて行っております。
(DB等の利用がベタ-かと思いましたが、ファイルが一番楽だったので選びました)
ファイルI/Oを呼び出しごとに発生させたくなかったため、内部でキャッシュを持たせています。 キャッシュとファイルは常に同期している想定です。
ただ、キャッシュから時間でデータが破棄されることもあり、キャッシュにない場合はファイルを見にいくようにしてます。
ユーザー認証
完全に未実装です。認証なくPOSTが送れたら自由にデータの書き換えができます。
テスト
go-httpdoc に記法にならって記述しています。
API I/Fの部分以外で書けていないところは、順次書き足したいです。
パッケージ管理
depを利用しています。 管理ファイルがtomlファイルになってて驚きましたが、問題なく使えています。
利用しているライブラリ一覧
- API Documet作成用 github.com
- 購読情報のキャッシュ github.com
- パッケージ管理 github.com
感想
Goを触り始めて、初めてある程度ましな成果物を作成しました。
AmazonSNSのドキュメントを読んで、メッセージングサーバーの面白さを感じ、とりあえず自分でも作ってみたといった感じです。
書いてて感じたことですが、パッケージ構成の方法
がよくわからなかったです。
パッケージの切り方や、同一パッケージ内でのファイル分割の方法等で、いまいち方針がなく何度も再構成しました。
他の方のソースを読んで、このあたりは勉強していこうかなと思います。
総じて、楽しく書けたのでGoはかなり自分にあっている気がします。