https://tech.gunosy.io/entry/newspass-comment-graphdb
こんにちは。ニュースパスのサーバーサイドエンジニアをしているmanoです。
昨年末から、ニュースパスで記事にコメントができるようになりました。 そのコメントデータを、AWS Neptuneを使ってグラフ構造で保持しています。 今回は、その実装・運用について書きたいと思います。
AWS Neptuneは、GraphDBが扱えるAWSのフルマネージドサービスです(詳しくはこちら)。 マスター・レプリカ構成のクラスターを作ることができ、レプリカは最大で15まで並べることができます。
GraphDBとのやりとりについて、Neptuneは「グラフトラバーサル言語」であるGremlinとSPARQLをサポートしているので、このいずれかで実装することになります。私はどちらも「なんじゃそりゃ」というところからのスタートだったので、直感的に書き方がしっくりきたGremlinを使って実装することにしました。
コメント機能を実装すると決まったときは、AuroraかDynamodbで実装する予定だったのですが、弊社SREメンバーから「Neptuneでやっちゃいなよ」という挑むようなセリフをもらい、また社内にNeptuneについての知見を持っている人が誰もいなかったということもあって、おもしろそうだなと思いNeptuneでやることにしました。 一応、いったん期限付きでできるかどうかトライしてみて、感触的に難しそうならAuroraやDynamoDBで実装しようと思っていました。 それが最も大きな理由だったのですが、他には、今後もしかしたら実装するかもしれない、
などといった機能追加も、データ構造的に容易であるという点にも魅力を感じました。 あとは、簡易的なレコメンド機能の実装も簡単に行える、という利点もあります。
ニュースパスのコメントデータは、Neptuneでこのような形で保持されています。
ニュースパスのコメントデータ構造
上の図について説明していきます。
ちなみにこれ以降の説明にて、こちら
で囲われた部分は「label」です。
article
とcomment
のvertex(頂点)が、about
のedge(辺)で結ばれている(記事<-その記事へのコメント)comment
とuser
のvertexが、post
のedgeで結ばれている(コメント<-投稿したユーザー)comment
とuser
のvertexが、like
のedgeで結ばれている(コメント<-いいねしたユーザー)