1

私たちの会社では、SMPP を介して、またモデムを直接使用して、さまざまなクライアントやプロバイダーに SMS を送信するための需要の高いシステムを構築しています。

システムはさまざまな要求を処理し、データベースに接続してメッセージを選択し、そのステータス (送信、受信、エラーなど) を更新します。優先度に従ってキューに入れられ、要求に応じて異なるチャネルによってリリースされる SMS を送信する要求を受け取ります。現在、さまざまなチャネルを同時に処理するスレッドを生成する必要がありますが、トランザクションが多数になる可能性があるため、システムの実行が遅くなります。

同時実行性にあまり問題がなく、サーバー プロセッサを最大限に活用できる新しいシステムの開発に関心があります。

私たちの理解では、リクエストのスレッドの処理を変更してシステムを作り直すことで、問題を解決できる可能性があります。この問題を処理するためにどのアーキテクチャ、フレームワーク、またはライブラリをお勧めしますか?最高のパフォーマンスを提供します。

現在、Java 7 Fork/Join、IBIS (MPJ、GMI、Satin)、AKKA (Actors ライブラリ) を検討していますが、これに限定されるものではありません。また、システムがアーキテクチャに縛られておらず、スケーラブルでクラウド サービスに移行できることも望ましいです。

PD: 現在のシステムは、送信するメッセージごとに 1 つのスレッドを生成し、何らかの形でスレッド プールを使用しますが、最適化された方法ではまったく使用されません。その貧弱な実装を改善することとは別に、すべてのリソース (コア、プロセッサ) を活用して全体的なパフォーマンスを改善したいと考えています。

4

2 に答える 2

1

現在、さまざまなチャネルを同時に処理するスレッドを生成する必要がありますが、トランザクションが多数になる可能性があるため、システムの実行が遅くなります。

このステートメントに含まれているのは、システムを遅くしているのはスレッドであり、トランザクション帯域幅ではないということです。これについてあなたの証拠は何ですか?

スレッドが問題を引き起こす唯一の方法は、スレッドが多すぎてメモリの問題が発生し、GC オーバーヘッドのためにシステムが遅くなった場合です。各スレッドは大きな連続したスタック スペース (デフォルトでは 512k) を割り当てるため、2000 スレッド (たとえば) は 1 GB のコアを消費します。

スレッドに問題があることを確認する 1 つの方法は、jconsole などを使用してアプリケーションのメモリ使用量を監視することです。すべてのメモリ バケットがいっぱいで、GC ボタンがほとんどまたはまったく機能しない場合は、問題ありません。もう 1 つ試すことは、取得するリクエストごとにスレッドをフォークする代わりに、固定サイズのスレッドプールを使用することです。これによりシステムのパフォーマンスが向上するが、トランザクションのスループットが低下する場合は、正解です。

SMPP プロトコルは TCP/IP のように見えるため、すべてのスレッドが待機ループに陥ることは望ましくありません。NIO fu を知っていれば、NIO を使用して独自の SMPP プロトコルを作成できます。

また、Java NIO SMPPライブラリの検索も行います。簡単な検索でJSMPPにたどり着きました。しかし、私はそれを経験していません。

JSMPP は、SMPP プロトコルの Java 実装 (SMPP API) です (現在、SMPP v3.4 をサポートしています)。メッセージ センターまたは ESME (外部ショート メッセージ エンティティ) と通信するためのインターフェイスを提供し、1 秒あたり 3000 ~ 5000 メッセージのトラフィックを処理できます。

于 2012-08-22T17:50:32.983 に答える