外部ゲートウェイを使用して SMS を送受信するクライアント サーバー ベースのアプリケーションがあります。効率とパフォーマンスを向上させるために、既存のアーキテクチャを再設計/変更することを考えています。同じことに関する考えや提案を歓迎します。ピーク時は約10分ですのでご注意ください。クライアント - サーバー - ゲートウェイから 1 時間あたり 3000 件の SMS が送信されます。1 日に送信される SMS の合計量は、8000 ~ 10,000 の間である可能性があります
既存のアーキテクチャ
SMSを送信
- クライアントはサーバーに SMS を送信し、サーバーからの一意の smsid (データベースによって生成される) を待ちます (接続を開く)
- サーバーはSMSをデータベースに保存し、SMSをゲートウェイに送信します。
- ゲートウェイは sms をハンドセットに送信し、一意のレシート ID をサーバーに返します。
- サーバーは一意の領収書 ID をデータベースに保存します
- サーバーは一意の smsid (手順 2 で生成) をクライアントに返します
ステップ 1 ~ 5 は、1 つの要求 - 応答サイクルです。
SMS の確認
- ゲートウェイはサーバーにメッセージのステータスを送信します
- サーバーは、データベース内のメッセージのステータスを、送信済み/失敗/不明などに更新します。
- クライアントはサーバーを定期的にポーリングして、以前に受信した smsid を使用してメッセージのステータスを受信します。
- クライアントは、クライアント側でステータスを更新します。
データベース設計
すべての SMS は、データベース内の 1 つの単一の SMS テーブルに格納されます。当初、データは 2006 年頃にさかのぼり、1 つのテーブルに約 500 万件のレコードがありました。これでデータがアーカイブされ、現在の年のデータのみが表に表示されます。
短所 - クライアントが長時間待機すると、接続タイムアウト エラーが発生し、同じメッセージがサーバーに再送信されることがあります。サーバーはこれが重複メッセージであることを検出する方法がないため、メッセージをゲートウェイに再送信し、その結果、顧客への SMS が重複します。- 複数の SELECT、UPDATE クエリが毎秒 sms テーブルで実行され、データベースにかなりの負荷がかかり、システムに障害が発生することがあります。また、データをアーカイブするメカニズムもありません。
新しいアーキテクチャ
SMSを送信
- クライアントはサーバーに SMS を送信し、サーバーからの一意の smsid (データベースによって生成される) を待ちます (接続を開く)
- サーバーはSMSをデータベースに保存し、一意のSMSIDをクライアントに返します。
ステップ 1 から 2 は、1 つの要求応答サイクルです。
- cron を使用してデータベース テーブルを定期的にポーリングし、SMS を取得してゲートウェイに送信する別のプロセス、または Java マルチスレッドを使用できますか???
- ゲートウェイは sms をハンドセットに送信し、一意のレシート ID をサーバーに返します。
- サーバーは一意の領収書 ID をデータベースに保存します
SMS が上記と同じままであることを確認する
DB設計
- Postgresql の時間/範囲パーティショニングを使用して、受信日または継承に基づいてデータをパーティショニングします。
- 毎日 table1 から table2 にデータを移動する別のスクリプト。ユニオン クエリを使用してテーブルを結合し、データのレポートと取得を行います。
データベースのパフォーマンスに基づくより良いアプローチは何ですか?