web-dev-qa-db-ja.com

モバイル(Android)チャットアプリケーションのアーキテクチャ

Whatsappを思い出させるチャットアプリを開発したいのですが、学習プロジェクトとしてやっています。 Androidコースを行っているという理由だけで、現在Androidでそれを行っています。

要件は次のとおりです。

  1. ユーザーはいくつかのデータ(電話番号、名前)で登録します
  2. ユーザーは、同じアプリケーションを使用する友達にメッセージを書き込むことができます
  3. メッセージはDBに書き込まれます-メッセージがサーバーに送信されてDBに書き込まれたときに通知が受信者のモバイルに送信されるという理由だけで、書き込みは多いが読み取りは少ないと思いますが、将来的には追加することもできますWebインターフェースなので、DBからの読み取りも多く含まれる場合があります。
  4. メッセージを読んだらDBを更新したい。

最初に、すべてのユーザーを保存するためにMySQLを使用し、メッセージを保存するために一部のNoSQLを使用することを考えていました-MongoDB。これは、メッセージデータが大規模に急速に増大し、RDBの使用が問題になる可能性があるためです。

このアーキテクチャを使用することが適切だと思いますか?多くの更新があるかもしれないので、MongoDBは問題になりますか?メッセージが書き込まれた後、受信者の電話がメッセージを受け入れると、更新がサーバーに示されたメッセージの受信に送信されますか?

多分私はあなたが考えることができる何かが足りないのですか?

より良いアーキテクチャがあると思われる場合は、貢献していただけるとありがたいです。

ありがとう。

7
user1002065

いくつかの考慮事項:

  1. データベースの選択:MysqlやPostgresなどのリレーショナルデータベースは、MongoDBなどよりもスケーリングが難しいとは限りません。多くの場合、それはまったく逆です。さまざまなストレージテクノロジーの優れた比較を次に示します。 http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

  2. 「イベント駆動型」アーキテクチャ:「これが起こったときに何かをする」に要約される多くの要件があります。このようなアーキテクチャを構築する一般的な方法は、発行されるイベントとそれらのイベントに作用するイベントリスナーを考えることです。例えば:

    • 「メッセージの読み取り」は、誰かがメッセージを読み取ったときにAndroidアプリがサーバーに送り返すイベントです。サーバーはそのようなイベントを待機するリスナーを持つことができ、それを取得するたびに、データベースにメッセージを「既読」としてマークします
    • 「メッセージ受信」はイベントです-リスナーはそのメッセージを受け取り、それを受信者に転送します。
    • もう1つ:「ユーザー接続」-誰かがアプリを起動してサーバーに接続するときに、オフライン中に収集されたメッセージを転送し、イベントを使用して簡単に対処できます。

通常、アプリケーションの中心部分としてメッセージキューがあり、すべての種類のリスナーが接続されており、それを介して送信されるすべてのイベントが送信されます。

  1. サードパーティソリューション:Android開発に重点を置いた学習課題としてこれを行う場合は、サードパーティソリューションの使用を検討してください。バックエンドのニーズの多くを処理できます。一例は https://www.firebase.com/ です。このようなアプリの本格的なバックエンドシステムを構築することは、深刻なスケーリングとパフォーマンス要件を伴い、Androidの学習に時間を費やすのに多大な労力を要します。

  2. 簡単な開始、繰り返し:データベースなしの非常に単純なバックエンドアプリから始め、Androidアプリ。どのデータベースを使用するかなどの大きな決定を下す前に、要件について可能な限り理解していることを確認してください。これを行う唯一の実際の方法は、プロトタイプを作成し、できるだけ迅速に反復することです。


ここで、開始点として使用できる具体的なソリューション「テンプレート」をいくつか示します。

Firebaseを利用したバックエンド

次の場合は、このルートに進みます。

  • Androidの学習に集中し、バックエンドについて心配しないでください。
  • システムのすべての部分で一度に手を汚すよりも、何かをすばやく実行することを優先します

Firebaseは多くのニーズに対応できます。データベースとスケーリングについて考える必要はありません。ただし、データモデルを理解する必要があります。

開始するいくつかの場所:

Node.js + Socket.io + MongoDB + Redis

次の場合は、このルートに進みます。

  • リアルタイム通信の要件に適合する一般的なフレームワークを使用したい
  • 他の言語やテクノロジーのセット全体を導入してもかまいません
  • JavaScriptを使用してもかまいません

システムの大まかな概要:

  • Node.jsとsocket.ioは、Androidアプリとのすべての通信を処理します
  • MongoDBは、メッセージとユーザー情報を格納するために使用されます
  • Redisは、イベントエミッターとイベントリスナーを接続するための「メッセージキュー」として使用されます

Socket.ioは通信が得意です。低レベルのネットワークコードを記述する必要はありません。 Node.jsはそのようなものに対して優れたパフォーマンスを発揮します。

ポインタ:

Java Netty + RabbitMQ + MongoDB

次の場合は、このルートに進みます。

  • できるだけJavaを使いたい
  • 低レベルのネットワーキングに関することをたくさん学んでも構いません
  • インフラストラクチャを可能な限り理解して管理したい

概要:

  • ネットワーク通信用のNetty
  • イベントエミッターとリスナー間の通信用のメッセージキューとしてのRabbitMQ
  • メッセージとユーザー情報を保存するMongoDB

ポインタ:

12
pbkhrv