質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

Q&A

解決済

2回答

668閲覧

マイクロサービスにて、別サービスが提供するデータのIDを保持するということの是非

MutsuyukiTanaka

総合スコア24

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

0グッド

0クリップ

投稿2019/09/05 04:35

マイクロサービスで設計する際、別のサービスの特定のデータを紐づけたい場合、別サービスのデータのIDなどを自分のDBに保存してもよいものなのでしょうか?

良いたとえではないですが具体例を挙げます。
ブログアプリを作るとして、2つのマイクロサービスで構成するとします。

  • ユーザー管理マイクロサービス
  • 投稿マイクロサービス

1つのアカウントでいろんなサービスを使えるようにユーザー管理だけを別サービスにするというのはそこまでおかしくはない気もします。

ブログアプリ(フロント)では、各マイクロサービスを操作して以下の
1.ユーザー管理マイクロサービスでログイン処理をし、ユーザーID、ユーザー名などを取得
2.投稿マイクロサービスから投稿内容を取得して表示したり、サービスにブログ投稿を依頼したりする

この時、投稿マイクロサービスでは以下のようなモデル(Postテーブル)があるはずです。

Post { id int primary key title text message text user_id int <---- ユーザー管理マイクロサービスの発行するユーザーIDを持って良いものか } ```` フロントアプリでは、投稿表示などの際、Postテーブルに持っているユーザーidを元に今度はユーザー管理マイクロサービスからユーザー名などを拾ったりして表示するなどします。 一般的なWAF等で作るならPostテーブルにユーザーIDを持つこと自体は普通だと思います。 ただ、このケースではユーザーIDは別のサービスのidなので、投稿マイクロサービスとしては何の意味も持たない情報になります。これが設計上よいのか気になっています。 特定のサービス(この例ではユーザー管理マイクロサービス)に依存するシステムにもなってしまいます。 投稿マイクロサービス内で独自にユーザーテーブルをを持ったとしてもサービスにまたがって同じユーザーIDがあるだけでもっと悪い気がしますし。。 上記の例に限らず、自サービスの特定のデータを別サービスの特定のデータに紐づけたい、ということはありそうな気がするのですが、その際別のサービスのデータのキー項目を自サービスに保持してしまってよいものなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

PostからUserIdに依存するのは要件から考えると必要かどうかわかるはずです。つまり投稿は誰が投稿したかわかる必要があればUserIdを保持する必要があります。

問題はPostとUserは別々のシステムでDBも違い、PostとUserを別々のトランザクション境界で永続化されています。結果整合になります。なので、Post.userId は user.idに外部キー制約も適用できません。つまり、PostのuserIdはもう退会しているか、サスペンドされて使えない可能性もあります。

そういったことを考える必要がありますが、サービス間でAPI経由でポーリングし合うようなアーキテクチャになるとポーリングだけで負荷があがりスケールしなくなることがあります。ポーリングの頻度は気をつける必要があります。

できるだけ、必要な情報を非同期にプッシュするようにしないといけません。Pub/Subってやつです。サービス間でメッセージキューを使って非同期にメッセージを送りあったりします。

ご参考までに

投稿2020/08/14 09:24

j5ik2o

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

・ユーザー管理マイクロサービス
・投稿マイクロサービス
これらとは別にユーザ情報をもったデータベースやメッセージがあると思ってください。
ユーザ情報の仕様はインターフェイスなどで共有します。
ユーザー管理マイクロサービスも投稿マイクロサービスもユーザ情報の仕様には依存しますが
お互いは干渉しないように出来るとおもいます。

投稿2019/09/05 09:16

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MutsuyukiTanaka

2019/09/05 13:32

すみません、いくつか追加で質問させてほしいです。 まず、別途3つ目のユーザー情報データベースやメッセージ(APIですよね?)を持つマイクロサービスを登場させるという意味で合っているでしょうか? そのうえで、 ユーザー情報(エンティティ)はユーザー管理のサービスが持つのが妥当な気がするのですが、ここで管理しない理由は何でしょうか? また、ユーザー管理サービス、投稿サービス共におっしゃるユーザー情報を持った第3のサービスの中のキー(ユーザID)は保持する(つまり、このユーザーサービスのIDの仕様に依存する)については問題ないということで合っているでしょうか?
hihijiji

2019/09/06 02:22

ユーザー管理のサービスがユーザー情報のストア機能を兼ねてもいいですし、ユーザー情報のストアを別サービスにしてもいいです。 重要なのは、サービス間でやり取りする「ユーザ情報の仕様」は特定のサービスの配下にしないことです。 むしろ、ユーザー情報を扱うサービスは「ユーザ情報の仕様」に従うように設計します。 ユーザ情報に一意のキーが必要ならば「ユーザ情報の仕様」に一意のキーを盛り込みます。 データストアを行うサービスがその一意のキーをデータストアに利用するのは問題ありません。 要はサービスありきでななく、仕様ありきです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問