1

Facebook と同様に、自分の Web サイトに通知システムを構築したいと考えています。通知はリアルタイムである必要はありません。

これは私が念頭に置いていることです:

  1. ユーザーがイベントを作成します (新しい写真のアップロード、写真のような新しいコメントの追加、またはすべてのユーザーへの管理アラートさえも)

  2. 5 分ごとに cronjob を実行して、通知テーブルに通知を追加します。id|id_content|type_of_content_enum|affected_user_id|date|seen_bool

  3. cronjob は、通知の種類ごとにいくつかの機能を実行します。次に例を示します。

    add_photos_notification()// この関数は、過去 5 分間に追加されたすべての写真をチェックし、この人物をフォローしているユーザーごとに通知テーブルに行を挿入します。この機能は、過去 5 分間に追加されたすべての写真をグループ化するため、フォロワーは同じ種類のコンテンツについて多くの通知を受け取りません。次のような通知が表示されます: ユーザー X がプロフィールに Y 枚の写真を追加しました。

    add_admin_notification()// この関数は、過去 5 分間にサイトの管理者によって追加されたすべてのニュースをチェックし、システム上の各ユーザーについて、通知テーブルに行を挿入します ...

これは通知システムを構築するための正しいアプローチですか?

関数が過去 5 分間のイベントを取得する 5 分ごとに cron を実行して、イベントを見逃すことは可能ですか?

安全のために、「通知済み」フィールドが真ではないすべてのイベントをチェックする代替手段があると思いますか? 'notified' = false のイベントを取得する同じ関数は、その通知を通知テーブルに追加した後、true に更新します。

ありがとう、

4

2 に答える 2

3

私は cronjob ルートを使用し、これまでのところうまく機能しています。私たちのシステムは非常に多くのユーザーに通知する必要があるため、2 つの理由からこれが最も適切な方法であることがわかりました。

  1. 現在のスクリプト コードを編集して、通知するすべてのイベントに通知を追加する関数を挿入する必要はありません。

  2. 多くのユーザーが影響を受けるアクションがあるため、リアルタイムで通知を追加すると、スクリプトの遅延やタイムアウトが長くなる可能性があります。

notifications というクラスを作成しました。このクラス内には、通知したいすべてのイベントに通知を追加する関数があります。user_commented_on_a_photo();

通知が生成されるたびに、通知を受けるユーザーごとに 1 つのエントリを追加します。これは私の通知データベースがどのように見えるかです:

id
affected_user_id //user being notified
user_generating_the_notification_id
content_type // enum containing all type of notifications my system has (example: photo, video, comment) ...
content_json // a json containing the notification content. Based on the content type, on the display view file, I call helpers that will format the notification row using the json info.
date // the date the notification was added
seen_on // the date the user saw the notification
clicked_on // if user clicked on the notification, store the date he clicked on it
display // true or false
  • この目的のために、作成するすべての新しい通知に表示フィールドの原因を追加しました。同じユーザーが、同じ生成ユーザーからの別の通知を見ていないかどうかをデータベースで確認します。この条件が true の場合、古い通知を display = false に設定し、2 つの新しい通知をグループ化すると、次のようになります。ユーザー X が自分のギャラリーに X 個の新しい写真を追加しました。
  • clicked_on フィールドには、アイテムがクリックされた日付が格納されるため、必要に応じてこの情報に基づいてレポートを生成できます。コンテンツを表示するときに、この項目が null でない場合は、通知を強調表示して、まだチェックされていないものをマークします。
  • 通知コンテンツを json に保存するテキスト フィールドを作成しました。これは、通知ごとにユーザーに表示するスタイルが異なるためです。たとえば、新しいコメント通知にはテキストしかありませんが、新しい写真通知にはプレビュー サムがあります。

これまでのところ、問題なく実行でき、私のニーズに応えています。

唯一の欠点は、cron ジョブは 1 分ごとにしか実行できないため、通知に 1 分の遅延が発生する可能性があることです。しかし、リアルタイムでは必要ないので、cronjob を 5 分ごとに実行するように設定しました。

于 2013-09-24T14:19:39.053 に答える