2017-12-10 7 views
0

以下のプロジェクトに最適なアーキテクチャを設計したいと考えています。ユーザーがデータを共有する他のユーザーとの間で通知を送受信できる任意のデバイス(デスクトップ、モバイルなど)でアプリケーションを実行しています。ストリーミングデータアーキテクチャ

基本的に、ユーザーは自分がアプリケーションで行っていることを他のユーザーと共有することができ、他のユーザーは変更のリアルタイムで通知を受けることができます。また、ユーザーは他のユーザーが許可している通知のみを受け取ることができます。

たとえば、ユーザーが画面上のウィジェットを移動すると、アプリケーションは新しいウィジェットの位置を保存し、画面上で変更を行うためにこの新しい位置をリアルタイムで他のユーザーに通知する必要があります。この必要性のために、パブリッシュ・サブスクライブ・パターンを持つイベント駆動型アーキテクチャーが見えます。しかし、アプリケーションが例えばウィジェットを共有するためのユーザのリストを取得する必要があるときにも、同期要求 - 応答パターンを処理する必要があると思います。

私はストリーミングデータアーキテクチャが記述されているStreaming Data book by Manningを簡単に見ましたが、この種のアーキテクチャが私のニーズに合っているかどうかはわかりません。実装部分の1つの違いの1つは、イベントソースプロデューサがアプリケーション内のイベントコンシューマでもあるということです(本の中では、イベントソースプロデューサは別のパブリックストリーミングAPIであり、実際のアプリケーションは唯一のコンシューマです)

私の考えは、データの取り込みとデータアクセスのためのWebSocket、メッセージリポジトリとしてのブローカのようなカフカ、そしてカフカのトピックを消費し、DBにデータを保存する別の分析サービスという本が少し続くと思います。データ取り込みとデータアクセスの両方にWebSocketを1つしか使用できない場合、1つの質問があります。

これらのニーズを満たすために使用する詳細なアーキテクチャとツールはありますか?

実装では、クライアント部分のjavascriptとサーバー部分のJavaを考慮します。

+0

複数のユーザーがGoogleドキュメントのように同じ画面を編集できますか?または、特定の画面の「ライター」で、他のすべてが「読者」だけであるユーザーは1人だけですか? –

+0

@AdiLevinすべてのユーザーが編集できます。 – rico

答えて

1

これは、Kafka(ブロードキャストとストレージの両方の要素を利用している)の非常に一般的な使用例です。文脈は若干異なるが助けるべきであるここにいくつかの例があります:あなたは、画面の位置に加えた変更は、イベントを作成しますので、CQRSパターンは、使用されている。この例では

https://github.com/confluentinc/kafka-streams-examples/tree/4.0.0-post/src/main/java/io/confluent/examples/streams/microservices

https://www.confluent.io/blog/building-a-microservices-ecosystem-with-kafka-streams-and-ksql/

kafkaに送信されると、他のアプリケーションインスタンスが(長く)ポーリングして変更を取得できるビューサービスを作成します。

これをwebsocketで実装することもできます。これについてgithubについていくつかの実装がありますが、私はそれらを個人的に試していません。多くのノードにスケールアウトしたい場合は、KafkaのメッセージをWebSocketを開くようにマッピングする必要があります(ただし、RESTの例のカッピング・パーティションへのマッピング要求は自動的に処理されます)。単一のサーバー実装を開始するには、このような複雑さは必要ありません。