なので、別のテーブルを維持する必要があります: SubscriptionConfig
、ユーザーのリマインダー設定を保存します。 また、ユーザーがリマインダー設定を持っていない場合は、システムによって提供される一連のデフォルト設定を使用できます: defaultSubscriptionConfig
Aggregation
If I public私がオンラインではなかったとき、「XXX」という記事に 10 回コメントが付けられました。オンラインになったときは、次のようなメッセージを 10 回受け取ったはずです。「誰々があなたの記事「XXX」にコメントしました。
まだですか? 「A、B、C、D... あなたの記事 "XXX" にコメントしました。」というメッセージが表示されます。
Zhihu は集計において優れた仕事をしました。彼らが達成したいかどうかを知る必要があります。これはかなり技術的です:
Zhihu のメッセージング メカニズムは技術的にどのように設計され、計画されていますか?
Web サイトのメッセージ (通知) システムは一般的にどのように実装されていますか?
関数のこの部分に関しては、まだ具体的な実装方法が決まっていないため、これ以上詳しく説明することはできません。 ⊙﹏⊙
5 つのエンティティ
上記の分析を通じて、このメッセージング システムを構築するためにどのようなエンティティ クラスが必要であるかがおおよそわかります:
ユーザー メッセージ キュー UserNotify
- ユーザー
- サブスクリプション
- サブスクリプション設定 SubscriptionConfig
- メッセージ通知
- アナウンス
動作の内訳
ここまで述べたので、メッセージ プロセス全体の動作をいくつか整理してみましょう。 >システムまたは管理者、メッセージを作成
createNotify (アナウンス | リマインド | メッセージ)
ユーザー、メッセージの購読、購読解除- 購読、購読のキャンセル
ユーザー管理サブスクリプション設定- getSubscriptionConfig, updateSubscriptionConfig
ユーザー、メッセージをプル- pullNotify (アナウンス | リマインド | メッセージ | すべて)
ユーザー、メッセージ キューをクエリします - getUserNotify(get cancel | remember | message | all)
>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>
モデル設計
通知
<code class="javascript">id : {type: <span class="hljs-string">'integer', primaryKey: <span class="hljs-literal">true}, <span class="hljs-comment">// 主键content : {type: <span class="hljs-string">'text'}, <span class="hljs-comment">// 消息的内容type : {type: <span class="hljs-string">'integer', required: <span class="hljs-literal">true, enum: [<span class="hljs-number">1, <span class="hljs-number">2, <span class="hljs-number">3]}, <span class="hljs-comment">// 消息的类型,1: 公告 Announce,2: 提醒 Remind,3:信息 Messagetarget : {type: <span class="hljs-string">'integer'}, <span class="hljs-comment">// 目标的IDtargetType : {type: <span class="hljs-string">'string'}, <span class="hljs-comment">// 目标的类型action : {type: <span class="hljs-string">'string'}, <span class="hljs-comment">// 提醒信息的动作类型sender : {type: <span class="hljs-string">'integer'}, <span class="hljs-comment">// 发送者的IDcreatedAt : {type: <span class="hljs-string">'datetime', required: <span class="hljs-literal">true}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
保存リマインド
メッセージ テーブルには、target
、targetType
フィールドが必要です。このリマインダーに関連付けられたオブジェクトを記録します。 action
フィールドには、リマインダーに関連付けられたアクションが記録されます。
たとえば、メッセージ: 「Xiao Ming が記事を気に入った」
その後:
<code class="javascript">target = <span class="hljs-number">123, <span class="hljs-comment">// 文章IDtargetType = <span class="hljs-string">'post', <span class="hljs-comment">// 指明target所属类型是文章sender = <span class="hljs-number">123456 <span class="hljs-comment">// 小明ID</span></span></span></span></span></span></code>
アナウンスとメッセージを保存
もちろん、Notify は保存もサポートしていますお知らせと情報。 content
フィールドは使用されますが、target
、targetType
、および action
フィールドは使用されません。
UserNotify
<code class="javascript">id : {type: <span class="hljs-string">'integer', primaryKey: <span class="hljs-literal">true}, <span class="hljs-comment">// 主键isRead : {type: <span class="hljs-string">'boolean', required: <span class="hljs-literal">true}, user : {type: <span class="hljs-string">'integer', required: <span class="hljs-literal">true}, <span class="hljs-comment">// 用户消息所属者notify : {type: <span class="hljs-string">'integer', required: <span class="hljs-literal">true} <span class="hljs-comment">// 关联的NotifycreatedAt : {type: <span class="hljs-string">'datetime', required: <span class="hljs-literal">true}</span></span></span></span></span></span></span></span></span></span></span></span></span></code>
UserNotify を使用して、リマインダー (通知) の特定のコンテンツに関連付けられたユーザーのメッセージ キューを保存します。
UserNotify は主に 2 つの方法で作成されます:
- アナウンスとリマインドをプルするためにサブスクリプション テーブルを走査するときに作成されます
- 新しい情報 (メッセージ) はすぐに作成されます。
サブスクリプション
<code class="javascript">target : {type: <span class="hljs-string">'integer', required: <span class="hljs-literal">true}, <span class="hljs-comment">// 目标的IDtargetType : {type: <span class="hljs-string">'string', required: <span class="hljs-literal">true}, <span class="hljs-comment">// 目标的类型action : {type: <span class="hljs-string">'string'}, <span class="hljs-comment">// 订阅动作,如: comment/like/post/update etc.user : {type: <span class="hljs-string">'integer'},createdAt : {type: <span class="hljs-string">'datetime', required: <span class="hljs-literal">true}</span></span></span></span></span></span></span></span></span></span></span></code>
サブスクリプションは、Notify テーブルから UserNotify にメッセージをプルするための前提条件です。ユーザーはまず特定のターゲットのアクションをサブスクライブし、次にこの Only を生成します。ユーザーはターゲットのアクションを通知されます。
例: 「Xiao Ming は製品 A のコメントに注目しました」、データは次のように表現されます:
<code class="javascript">target: <span class="hljs-number">123, <span class="hljs-comment">// 产品A的IDtargetType: <span class="hljs-string">'product',action: <span class="hljs-string">'comment',user: <span class="hljs-number">123 <span class="hljs-comment">// 小明的ID</span></span></span></span></span></span></code>
このように、製品 A で生成されたすべてのコメントにより Xiao への通知が生成されます。明。
SubscriptionConfig
<code class="javascript">action: {type: <span class="hljs-string">'json', required: <span class="hljs-literal">true}, <span class="hljs-comment">// 用户的设置user: {type: <span class="hljs-string">'integer'}</span></span></span></span></code>
ユーザーごとにサブスクリプションの習慣が異なる場合があります。このテーブルでは、ユーザーは特定のアクションをサブスクライブするかどうかを一律に設定できます。デフォルトでは、システムによって提供されるデフォルト構成が使用されます。
<code class="javascript">defaultSubscriptionConfig: { <span class="hljs-string">'comment' : <span class="hljs-literal">true, <span class="hljs-comment">// 评论 <span class="hljs-string">'like' : <span class="hljs-literal">true, <span class="hljs-comment">// 喜欢}</span></span></span></span></span></span></code>
このモデルのセットでは、targetType
と action
は必要に応じて拡張できます。各アクションのリマインダーをさらに追加します: hate
が嫌われた、update
が更新されたなど。
設定ファイル NotifyConfig
<code class="javascript"><span class="hljs-comment">// 提醒关联的目标类型targetType: { PRODUCT : <span class="hljs-string">'product', <span class="hljs-comment">// 产品 POST : <span class="hljs-string">'post' <span class="hljs-comment">// 文章},<span class="hljs-comment">// 提醒关联的动作action: { COMMENT : <span class="hljs-string">'comment', <span class="hljs-comment">// 评论 LIKE : <span class="hljs-string">'like', <span class="hljs-comment">// 喜欢},<span class="hljs-comment">// 订阅原因对应订阅事件reasonAction: { <span class="hljs-string">'create_product' : [<span class="hljs-string">'comment', <span class="hljs-string">'like'] <span class="hljs-string">'like_product' : [<span class="hljs-string">'comment'], <span class="hljs-string">'like_post' : [<span class="hljs-string">'comment'],},<span class="hljs-comment">// 默认订阅配置defaultSubscriptionConfig: { <span class="hljs-string">'comment' : <span class="hljs-literal">true, <span class="hljs-comment">// 评论 <span class="hljs-string">'like' : <span class="hljs-literal">true, <span class="hljs-comment">// 喜欢}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
サービス層 NotifyService
NotifyService には次のメソッドがあります:
- createAnnounce(content, sender )
- createRemind(ターゲット、targetType、アクション、送信者、コンテンツ)
- createMessage(コンテンツ、送信者、受信者)
- pullAnnounce(user)
- pullRemind ( user)
- subscribe(user, target, targetType,reason)
- cancelSubscription(user, target, targetType)
- getSubscriptionConfig(userID)
- updateSubscriptionConfig ( userID)
- getUserNotify(userID)
- read(user, NoticeIDs)
各メソッドの処理ロジックは以下のとおりです:
createAnnounce (content, sender)
- Notify テーブルにアナウンス レコードを挿入します
createRemind(target, targetType, action, sender 、content)
- Notify テーブルにリマインダー レコードを挿入します
createMessage(content, sender,Receiver)
- Notify テーブルに情報レコードを挿入します
- UserNotify テーブルにレコードを挿入し、新しく作成された Notify を関連付けます
pullAnnounce(user)
- UserNotify から最新のアナウンス情報の作成時刻を取得します:
lastTime
-
lastTime
をフィルター条件として使用して、Notify のアナウンス情報をクエリします
- 新しい UserNotify を作成し、クエリされたお知らせ情報を関連付けます
pullRemind(user)
- ユーザーのサブスクリプション テーブルをクエリし、一連のユーザーのサブスクリプションを取得しますrecords
- 各サブスクリプション レコードの
target
、targetType
、action
、createdAt
を介して Notify テーブルをクエリし、サブスクライブされた Notify レコードを取得します。 (サブスクリプション時刻はリマインダーの作成時刻よりも前である必要があることに注意してください)
- ユーザーの構成ファイル SubscriptionConfig をクエリします。そうでない場合は、デフォルトの構成 DefaultSubscriptionConfig を使用します。
- サブスクリプション構成を使用して、クエリされたものをフィルタリングします。 Notify
- フィルターされた通知を関連付けとして使用して、新しい UserNotify
subscribe(user, target, targetType,reason)
を作成します- 理由 NotifyConfig によってクエリを実行し、対応するアクション グループを取得します:
actions
- アクション グループを走査し、アクションごとに新しいサブスクリプション レコードを作成します
cancelSubscription (user, target, targetType)
-
user
、target
、targetType
getSubscriptionConfig に対応する 1 つ以上のレコードを削除します(userID)
- SubscriptionConfig テーブルをクエリしてユーザーのサブスクリプション構成を取得します
updateSubscriptionConfig(userID)
- ユーザーの SubscriptionConfig レコードを更新します
getUserNotify(userID)
- ユーザーのメッセージ リストを取得します
読み取り(ユーザー、通知ID)
- 指定された通知を更新し、isRead 属性を true に設定します
シーケンス図
リマインダーのサブスクリプション、作成、取得
リマインダーのサブスクリプション、作成、プル
製品の作成後に NotifyService.subscribe
メソッドを呼び出し、
メソッドを呼び出して、製品のレビュー後に呼び出すことができます。 NotifyService.createRemind
メソッド、
はその後、ユーザーがシステムにログインするときに NotifyService.pullRemind
メソッドを呼び出します。または、ユーザーがメッセージ キューをクエリするときに、
は最後に NotifyService.getUserNotify
メソッドを呼び出します。
アナウンスの作成と取得
アナウンスの作成と取得
管理者から送信 アナウンス時が作成され、NotifyService.createAnnounce
メソッドが呼び出され、
次に、ユーザーがシステムにログインするとき、または別の時点で NotifyService.pullAnnounce
メソッドが呼び出され、最後にユーザーがシステムにログインしたときに
メソッドが呼び出されます。メッセージキューをクエリします。 NotifyService.getUserNotify
情報の作成
情報の作成
情報を作成するには、
を直接呼び出すだけです これNotifyService.createMessage
次回ユーザーがメッセージ キューをクエリするときに、この情報がクエリされます。