ソフトウェア内のさまざまな階層レベルにデータが投稿されるソフトウェアのニュースフィードの作成に取り組んでいます。たとえば、このソフトウェアは複数の組織をサポートします。各組織には複数のチームがあり、それぞれの下に複数のチームがあります。
組織の最上位レベルのユーザーは、組織の任意の場所(またはそのチームやチーム)に投稿されたすべてのコンテンツのコンテンツを見ることができます。中レベルのユーザーは、組織全体に投稿されたコンテンツ、または自分のチーム(およびそのチーム)内のコンテンツのみを表示できる必要があります。最下位レベルのユーザーには、組織全体、チーム、または特定のチームにのみ投稿されたコンテンツが表示されます。
また、データベースは、多数の人々のフィードに表示されてコメントされる「投稿」と、特定のイベントが発生したためにユーザーが削除する必要がある個々のユーザーのインジケーターである「通知」の間にも差異があります。
また、現時点では、投稿に異なる重みを割り当て、特定の投稿のみを表示することに関心がありません。関連するすべての投稿を新しい順に表示しても問題ありません。
現在、socket.ioを使用してこのフィード更新をライブにする予定です。私の理解では、socket.ioは名前空間と部屋に依存して決定します。私の質問は、このフィード機能を作成するためにこれらの機能をどのように活用するかについてです。
一見すると、問題に取り組む2つの方法の1つがわかります。
オプション1:組織の階層内の各ノード(組織自体、各チーム、各チーム)のsocket.io名前空間(またはおそらく部屋)を作成し、各クライアントを関連する各名前空間に参加させます(トップレベルのユーザーは組織全体のすべての名前空間に参加し、ボトムレベルのユーザーはグローバル組織の名前空間、チームの名前空間、およびチームの名前空間にのみ参加します)。ユーザー向けのフィードは、ユーザーがいるすべての名前空間の集合になります。
この設計の利点は、名前空間ごとに複数のユーザーがいるため、データベースに新しい投稿を書いている場合でも、その名前空間の1つのクライアントから他のクライアントに直接投稿をプッシュできることです。これにより、すでにアプリケーションを使用している他のユーザーに投稿を配布するためにデータベースを検索する必要がなくなります。
オプション2:各ユーザーのsocket.io名前空間(または、おそらく部屋)を作成します。次に、すべてのクライアントに定期的にサーバーをポーリングして、自分に関連し、ニュースフィードに表示する必要のある新しい投稿を探します。このオプションは、実際にはAJAXスタイルソリューションであり、実際のオーバーヘッドはありませんAJAXこのアプリケーションへのPHPバックエンドへの呼び出しはで書かれています。
この2番目のオプションの一種のバリエーションは、ユーザーごとに名前空間を作成することですが、新しいコンテンツが投稿されたときに、投稿を他のユーザー名前空間に直接プッシュするようにします。これが可能かどうか、どのように可能かはわかりません。
進め方についてアドバイスをいただければ幸いです。
3年近く経ち、問題のソフトウェアがこの間ずっと数十万人のユーザーで生産されているので、私は自分の質問に答えるつもりです。
私はオプション2を使用しました。この場合、各ユーザーは1つの固有の部屋に参加します。サーバーは、接続されたユーザーを反復処理し、各ユーザーに適切なデータを送信する作業を行います(Redis PUB/SUBを使用して新しいイベントのブロードキャストを管理します)。後から考えると、これは各ユーザーのデータのサイロ化を可能にするため、間違いなく正しいアプローチでした。これは、特にプロジェクトに戻って機能を追加したり、ビジネスロジックに他の調整を加えたりする場合に、概念的に考えやすく、コードを記述しやすくなります。