web-dev-qa-db-ja.com

通知サービスロジックを構築するには

エンドユーザーにプッシュ通知を送信する通知サービスを構築しています。通知には2つのタイプがあります

  1. グループ内のすべてのユーザーに同じテキスト通知を送信するグループ通知。誰もがグループをサブスクライブし、グループに通知を送信するため、これは簡単に達成できます。

  2. 各ユーザーに特定のテキスト通知を送信するパーソナライズされた通知。

私の質問は(パーソナライズされた通知の場合)通知サービスをどのように設計すればよいかです。

アプローチ1:ユーザーごとにメッセージを作成し、メッセージを含むユーザーのバッチを通知サービスに送信して送信するアプリケーションサービスのアプリロジックに基づいて、ユーザーを選択するロジックを維持していますか?

アプリケーションロジックに基づいてユーザーを選択(アプリサーバー上)->各ユーザーをループし、カスタムメッセージを作成(アプリサーバー上)->メッセージで1Kユーザーのバッチを作成し、通知サービスに送信(アプリサーバー上)->通知を送信(通知サービス)

  • アプリケーションサーバーに負荷を追加します

アプローチ2:通知サービスでアプリデータベースに直接アクセスしてユーザーを取得し、メッセージを作成して送信しますか?

ユーザーを選択->ループオーバーしてメッセージを作成->各ユーザーに送信(通知サービスのすべて)

  • このアプローチでは、通知サービスはアプリDBにアクセスする必要があり、多くのアプリロジックがここに行きますが、正しくないようです。通知サービスを作るので、アプリのロジックがたくさん含まれています。
  • すべてが通知サービスによって実行される必要があるため、アプリサーバーの負荷を軽減します。

皆さんは何を示唆していますか?検討できる他のアプローチはありますか?パーソナライズされた通知を100万人のユーザーに送信する必要がある場合があることを考慮してください。

3
mitesh sharma

あなたの質問に対する答えは、サービスの境界を特定する方法だと思います。基本的なアプローチは、どのサービスも、そのジョブを実行するために必要なすべてのデータを所有する必要があるということです。つまり、サービスは some SOAガイドラインの場合のように、水平層ではなく、 vertical slices によって定義されます。独自のコントローラー、ドメインロジック、UIを備えた、ビジネス機能またはビジネスプロセスの具体的な部分。自律型であるため、他のサービスのデータや動作を必要としません。

したがって、例を考えると、通知サービスは、より大きな論理サービスの一部である可能性があります。たとえば、ドメインが小売ネットワークに関するもので、ある日大きな割引があり、すべての顧客に通知したいとします。顧客の電話番号、割引に関する情報(おそらく特定のタイプの顧客に合わせたもの)、および通知テキストが必要です。誰が割引ビジネスルールを管理しますか?どのサービスが顧客のデータを所有していますか?きっとそれは販売サービスだ。したがって、通知サービスは間違いなくその一部です。したがって、この販売サービスには、通知を送信するために必要なすべてのデータを含む独自のデータベースが必要です。

パフォーマンスの問題について考えている場合は、この通知機能を独自の物理マシンに抽出してもかまいません。必要な場合は、マシンをさらに追加するだけです。また、サービスの境界は物理的なものではなく論理的なものであるため、この新たに抽出された機能のために個別のデータベースを作成する必要はありません。

これが 一連の投稿 これらの問題に詳細に対処する方法です。

3
Zapadlo