17

私のアプリケーションでは、ユーザがコメントや投稿で言及されたときに通知する必要があります。
ユーザーのハンドルはのように@user_nameです。です。私もそれを実装する方法を把握することはできませんRailsで通知を実装する

Mention 
    mentioned_by: user_id (foreign key) 
    user_mentioned: user_id (foreign key) 
    comment_id: (foreign key) 
    post_id: (foreign key) 

:用
データベーステーブルのようなルックスに言及しています。 Facebook/Twitterはどうしていますか?

私が同意したのは、ActiveRecord callbacks/ Observer design patternでした。新しいコメント/投稿がデータベースに保存されるたびに、投稿/コメントの内容を調べて、すべての言及を探してから通知を実行します。必須。

私はいくつかの欠けている部分があると感じ、私はそれを正しく得ていない。
これを行う最善の方法ですか?

+0

"facebook"と "twitter"というタグをこの質問に追加することをお勧めします。また、これに恩恵を与えるかもしれませんか?私は、多くの人がそのような質問に対する答えに興味があると確信しています。 – dmonopoly

+0

@daze:提案していただきありがとうございます。適切なタグを追加することが役に立ちました。 :) –

答えて

27

FacebookとTwitterは、中規模のRailsアプリケーションではありません。彼らは企業です。それらを実行する技術は、特にFacebookの場合には、ほとんどカスタムです。

あなたが把握しているように見える部分は、を実行者でスケーラブルな方法で通知する人を決定する方法です。これはたわごとが真実になる場所です。それぞれの背後にあるアーキテクチャーに関する多くの情報を見つけることができます。また、これらのことを考えるのに役立つ素晴らしいものがたくさんありますが、最終的にはどのアプリケーションにも実装するものではありません。再構築する。 Quoraのでオーバー

http://www.quora.com/What-is-Facebooks-architecture

Facebook Architecture

http://www.infoq.com/news/2009/06/Twitter-Architecture

http://engineering.twitter.com/2010/10/twitters-new-search-architecture.html

もっとたくさんジューシーな詳細。


残念ながら、これはあなたの目標に近づけません。 Pusherのようなサービスを結びつけてクライアントに気にせずにメッセージを送信するには、ActiveRecord Observerを使用して、background queueに通知を追加して、実際にその通知を送信するようにすることが最も現実的なことですプッシャーにこれは1日以下の作業で、1日に少なくとも10kの通知に拡張する必要があります。パフォーマンスの問題が発生したら、ObserverとPusherをGoliathのようなものに置き換えて、両方のジョブをローカルに処理できるようにします。

ボトムライン、ペースを介して置かれている大規模で経験豊富なシステムについて何することができます学びますが、主にちょうど彼らがに走ったと、彼らはそれらを解決する方法問題参照してください。これらのメソッドは大人でも同じではなく、実装ごとに異なることになります。

うまくいけば、それはあなたを良い方向に向けるのに役立ちます。 :)

+0

私を正しい方向に向けてくれてありがとう。 –

2

レコードが保存されている間(before_save、after_save、before_create、after_createなど)にコメントコンテンツを参照し、すべてのモデルを検索して作成し、dbに保存する際に、ActiveRecordコールバックを使用できます。

+0

私は上記の私の質問で同じことを言及しています。私が求めているのは、もしそれが最善の方法であれば。 Facebook/Twitterはどうしていますか? –

2

私は実際に自分自身の具体的な答えに興味があります。私はFacebookやTwitterがどうやってそれをするのか分からないが、一般的な検索から、宝石のように行動することはタグ付け可能なので、仕事を完了できると知っている。 https://github.com/mbleigh/acts-as-taggable-onをチェックしてください。 Implementing twitter-like hashtag on rails

幸運:

また、stackoverflowの上でこの問題も、あなたはいくつかの情報を提供することがあります。この質問にもっと注意を払い、私が言ったことよりも確かな答えを得ようと思います。 :]

2

TumblrはRedisのキューシステム(Resqueのような)を使っています。私はそのボリュームを扱うと信じています。

コールバック(前述のとおり)を行い、それをResqueに渡します。 (Railscasts about Resuqe recentlyがありました)

+0

あなたの答えをありがとう。しかし、実際には、キューイング・ソルを最適化するのではなく、それを実行する最善の方法を知ることにもっと興味があります。それでも、あなたの提案に感謝します。ちゃんと覚えておきますよ。 –

1

このための推奨アプローチはありません。上のレベルでは、 'Comet programming'、ポーリングとWebSockets [HTML5]を見て、適切な組み合わせを選択するとよいでしょう。レールでプッシュ通知を管理するための素晴らしい実装がいくつかあります。 WebSocket &を使用して完全サポートを処理するためのフラッシュオプションを使用するかどうか調べるには、深く掘り下げなければなりません。

FayeもNode.js設定を与えていますが、私は他人についてはわかりません。使用鋸山または同等 - -

  • が関係するユーザーを見つけるために、コンテンツを解析パーサーにそれをキュー

    1. 保存内容:

      一応の手順は、次のようになります。

    2. Twitterのようなアプローチを見ているなら、それは別のプロセスとしてcurrent_sessionの関与するユーザーに彗星/投票してください。
    3. //投稿記録で他のことを行う
    4. 関与するユーザに通知を送り、あとでオンラインになるとdestroy()する。

      ある方向を与えることを望みます。

  • 1

    私はこの質問は時代遅れだと知っていますが、最近私は、メンビーオブジェクトと告訴者の間で言及を作成することを可能にするrubygems.orgに最近MentionSystem宝石をリリースしました。 #hashtagを使用して説明を作成します。

    宝石はgithubのでホストされている:https://github.com/pmviva/mention_system

    あなたは@usernameの形でユーザーを挙げることができるポストを持っているとしましょう。

    あなたはその後、カスタム言及プロセッサを定義したクラスに

    class Post < ActiveRecord::Base 
        act_as_mentioner 
    end 
    

    class User < ActiveRecord::Base 
        act_as_mentionee 
    end 
    

    を持っている:

    class PostMentionProcessor < MentionSystem::MentionProcessor 
        def extract_mentioner_content(post) 
        return post.content 
        end 
    
        def find_mentionees_by_handles(*handles) 
        User.where(username: handles) 
        end 
    end 
    

    は、その後、あなたの投稿のコントローラにあなたが持っているアクションを作成

    def create 
        @post = Post.new(params[:post]) 
        if @post.save 
        m = PostMentionProcessor.new 
        m.add_after_callback Proc.new { |post, user| UserMailer.notify_mention(post, user) } 
        m.process_mentions(post) 
        end 
    
        respond_with @post 
    end 
    

    あなたの投稿の内容に@ user1、@ user2、@ user3がある場合、その名前プロセッサはuser1、user2、user3を解析し、ユーザ名[user1、user2、user3]を持つユーザを見つけてデータベースそれぞれの記述の後に、後のコールバックを実行します。この例では、ポストとユーザーの間で言及を通知する電子メールが送信されます。

    関連する問題