Software Engineer Blog

エンジニアブログです。技術情報(Go/TypeScript/k8s)や趣味の話も書くかもです。

GoSNS

概要

github.com

AmazonSNS likeな、簡易メッセージングサーバーを練習がてら書いてみました。
(Amazon SNSちゃんと使ったことないので、ぜんぜん違うかもしれないですが…)
モデルは、Pub/Subを意識しています。

機能概要

  • Channel登録
  • Channelに対して購読登録
    • 購読手段はSlackのWebHook一択(Mail等の対応も検討中)
  • 新規Channelの開設
  • Handshakeリクエス

簡易API Doc一覧

メルカリ製のgo-httpdocを利用してドキュメント生成しました。

github.com

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ファイルになってて驚きましたが、問題なく使えています。

利用しているライブラリ一覧

感想

Goを触り始めて、初めてある程度ましな成果物を作成しました。
AmazonSNSのドキュメントを読んで、メッセージングサーバーの面白さを感じ、とりあえず自分でも作ってみたといった感じです。

書いてて感じたことですが、パッケージ構成の方法 がよくわからなかったです。
パッケージの切り方や、同一パッケージ内でのファイル分割の方法等で、いまいち方針がなく何度も再構成しました。
他の方のソースを読んで、このあたりは勉強していこうかなと思います。
総じて、楽しく書けたのでGoはかなり自分にあっている気がします。