私は同じことに取り組んでいます!まず第一に、私のスキーマは少し異なります。私はユーザー、トピック、およびコメントを持っています。トピックは、コメントID(IEnumerable long)のリストを持つ単なるクラスです。最初のコメントは投稿です。
ああ、本当に最初にすべての、少し警告:私はちょうどサービスファブリックを始めているので、私はそれが間違っている可能性があります;)
ユーザーは私には関係ありません。私はちょうどコメントにユーザーIDを格納します。コメントのリストを取得するとき、私はステートフルなユーザーサービスからユーザーを取得します。または、私はコメントに直接ユーザー名を格納しますが、まだわかりません。
トピックやコメントが残っています。まず、「ステートフルトピックサービスとステートフルコメントサービスを作成できる」と考えました。しかし、私は私がロードするトピックごとに、コメントを得るために、コメントごとにCommentServiceを呼び出す必要があることに気付きました。
私はトピックとコメントの2つのIReliableDictionariesを扱うTopicServiceを作成しました。
コメントが投稿されるたびにTopicIdをパーティションキーとして使用し、そのパーティションにコメントが保存されます。コメント欄を使用しないでください!この方法では、特定のトピックのコメントはすべて同じパーティションにあります。
すべてのコメントをトピックにロードするときに、TopicIdを再度パーティションキーとして使用します。トピックの信頼辞書からトピックを取得し、コメントの信頼辞書内のコメントIDのリストをループします。わからないことはできますが、私のGetCommentsは次のように見える場合:私はまだいないよ
var topics = await this.StateManager.GetOrAddAsync<IReliableDictionary<long, TopicModel>>("topics");
var comments = await this.StateManager.GetOrAddAsync<IReliableDictionary<long, CommentModel>>("comments");
List<CommentModel> result = new List<CommentModel>();
using (var tx = this.StateManager.CreateTransaction())
{
ConditionalValue<TopicModel> topic = await topics.TryGetValueAsync(tx, topicid);
if(topic.HasValue)
{
foreach(long commentid in topic.Value.CommentsInternal)
{
ConditionalValue<CommentModel> comment = await comments.TryGetValueAsync(tx, commentid);
if (comment.HasValue)
result.Add(comment.Value);
}
}
await tx.CommitAsync();
}
return result;
、方法いくつかのより多くの仕事を。
おそらくこれはあなたが
編集:)助け:OW、デメリットがあるの! idで1つのコメントをロードする場合は、topicidを指定する必要があります。だから私のCommentModelクラスはCommentIdとTopicIdプロパティを持っています。
答えをありがとう。私はパーティショニングについて考えていましたが、私には少し複雑なように思えましたが、私は単純な解決策を探し続けました。 特定のユーザーのすべてのコメントをどのように取得しますか? 信頼できるコレクションに変更がないので、なぜ 'CommitAsync'を呼び出しますか? 信頼できる辞書内のリストにコメントを保存していますか?もしそうなら、スレッドセーフではないので、避けてください。 – cassandrad
パーティショニングはそれほど難しくありません。ノード上のデータのグループ化に関するすべて。サービスファブリックはそのために最も効果的です。また、コメント数にも依存します。その数千の場合は、パーティションを気にしないでください。 hunderdの場合は、数千...パーティション!特定のユーザーに対するすべてのコメントは、Azure Searchで行うことも、別々のインデックスを保持することもできます。私はうさぎとしてコミットする。私はトランザクションを持っているので、コミットして終了します。リスト内のコメントはい、私はデータを編集するためにActor(永続性なし)を使用します。アクターはシングルスレッドで動作しています。 Write = Actor、Read =ステートフルサービス。 – Martin
したがって、コメントを保存するトピックごとに1人のアクタ、またはサービスに格納され、データの編集だけを行い、アクタからサービスのメソッドを呼び出しますか?トピックに新しいコメントを同時に追加/削除できるユーザーはいくつですか? – cassandrad