2012-01-13 17 views
1

たとえば、ZendeskにはAgent Collision Notificationという機能があります。チケットを編集すると、他の誰かがこのチケットを編集している場合にノートが表示されます。"このオブジェクトを表示している他のユーザー"を実装する方法

このような機能をサポートするインフラストラクチャとは何ですか? This questionは同じことを目指しているようですが、はるかに低いレベルです。

システムが完全に動的で(最初のビューアにも通知する)、妥当な速さであれば、おそらくいくつかの彗星やウェブソケットが必要です。しかし、チケットシステムのチャットシステム(プライムの彗星の例)とは異なり、ユーザーは常にページを切り替える。

このようなプログラムフローとサーバーインフラストラクチャはどうなりますか?

+0

これをクライアント側(comet、websockets、AJAXなど)でどのように実装するかはあなた次第ですが、システムのルートは通常、テーブルに1つまたは2つの余分な列があり、必要なレコードを保持しますこれを実装する。この種のことは、通常、「レコードロック」と呼ばれます。レコード(単純)またはレコードを所有するユーザー参照を保持する "lockwho"とタイムスタンプを保持する "lockwhen"という2つの列にブール型の「ロック」列があり、期限切れのロックを解除することができます(複雑)。ロックメッセージを生成するときは、これらの列をチェックしてください。 – DaveRandom

+0

ポインタをありがとう。しかし私はロックしていない非公式の警告行についてもっと考えていました。ロックのために、タイムスタンプとオプティミスティックロックを使用します。 – max

答えて

3

リアルタイムのコラボレーションを可能にしたい場合は、this questionにも、操作上の変換が記載されています。また、a question about operational transformation librariesもあります。

このようなプログラムフローとサーバーインフラストラクチャはどのようなものでしょうか?

私はPusherのために働いていますので、私たちの技術を使用して1つの解決策を教えてください。

  1. ユーザAは、「衝突」する可能性のあるページを開きます。ページ内にはchannelを購読してください。
  2. ユーザーAがページの編集を開始します。サーバーにAJAXリクエストを送信して、ページが編集されているという事実についていくつかの永続的な状態があるようにします。ユーザーがページを編集中であることを示すチャンネルのイベントをトリガーします。
  3. ユーザーBがページを開きます。ページはロードされ、ページが編集されている持続状態の情報を表示できます。
  4. ユーザーAは編集を終了し、サーバーにページ状態を更新する要求が行われます。誰もそのページを編集していないことを示すイベントをトリガーします。このイベントは、ユーザーBに配布されます(更新されたページは、イベントが受信されると、イベント内またはAJAXリクエストを介して配信されます)。
  5. ユーザーBは、ページを編集できることがわかりました。ユーザーは編集を開始し(ステップ2を参照)、ユーザーBにユーザーBがページを編集中であることがユーザーAに通知されます。

また、あなたがページを見た他の誰見ることができましたし、彼らが起こるとして、ユーザーが変更を議論することを可能にするようpresenceを使用することは非常にクールになります。

+0

「プレゼンス」は、Zendeskが実装しているものです。「JoeとJimもこのページを表示しています。ポインタをありがとう。 – max

関連する問題