2

軽量の Message Queue プロキシを実装したいと考えています。その仕事は、Web アプリケーション (PHP) からメッセージを受信し、メッセージ キュー サーバーに非同期的に送信することです。このプロキシを使用する理由は、MQ が常に使用できるとは限らず、遅れたりダウンしたりすることもありますが、メッセージが配信され、Web アプリケーションがすぐに戻ることを確認したいからです。

そのため、PHP は同じホストで実行されている MQ プロキシにメッセージを送信します。そのプロキシは、クラッシュの場合に永続化のためにメッセージを SQLite に保存します。同時に、接続が利用可能になると、SQLite から MQ にメッセージをバッチで送信し、SQLite からメッセージを削除します。

さて、私が理解しているように、このサービスには次のコンポーネントがあります。

  1. メッセージ リスナー (PHP からのメッセージをリッスンし、受信キューに書き込みます)
  2. DB フラッシャー (受信キューからメッセージを読み取り、データベースに保存します。SQLite のシングルスレッド性によります)
  3. MQ 接続ハンドラー (再接続することにより、MQ サーバーへの接続をオンラインに維持します)
  4. メッセージ送信者 (SQlite db からメッセージを収集して MQ サーバーに送信し、db から削除します)

#1 (TCPServer) に Twisted を使用することを考えていましたが、イベント駆動型ではない他のポイントとの統合に問題があります。直感的には、これらの各ポイントは個別のスレッドで実行する必要があることがわかります。これは、すべてが IO バウンドであり、互いに独立しているためです。ただし、それらを 1 つのスレッドに簡単に配置できます。にもかかわらず、このワーカー スレッドを Twisted のメイン ループとは別に実装する方法について、(私にとっては) 適切で明確な例を見つけることができませんでした。

私が始めた例は、service.Application および internet.TCPServer オブジェクトを使用するchatserver.pyです。TCPServer サービスを作成する前に独自のスレッドを開始すると、スレッドは数回実行されますが、停止して二度と実行されません。なぜこれが起こっているのかはわかりませんが、おそらく Twisted でスレッドを正しく使用していないことが原因です。

別のワーカー スレッドを実装して Twisted を維持する方法について何か提案はありますか? 考えている代替アーキテクチャはありますか?

4

3 に答える 3

4

あなたは基本的に、メッセージング サーバーにアドホックな拡張機能を作成することを検討しています。その仕事は、要求した信頼性の保証を提供することです。

代わりに、おそらく、この新しいプロキシーを実行する予定だったハードウェアを使用して、その上で別の MQ ノードを実行する必要があります。新しいノードは、他のノードが過負荷またはオフラインになっている間、配信したメッセージの永続化と中継を処理する必要があります。

于 2010-06-01T18:32:36.797 に答える
1

ブロッキング コールを回避するために Twisted で別のスレッドを使用するのは、費用対効果が最も高いとは言えないかもしれませんが、時には害の少ないソリューションが最適な場合もあります。スレッド化を Twisted に統合する方法を示すリンクは次のとおりです。

http://twistedmatrix.com/documents/10.1.0/core/howto/threading.html

場合によっては、簡単に実装できる方が、何時間も何日もかかる研究よりも早い場合があります。

于 2010-10-31T20:54:51.007 に答える
0

この問題の適切な解決策は、キー値ストアRedisを使用することです。多数のクライアントを備えた高速の永続データ ストアです。php と python クライアントがあります (メッセージの処理に時限/バッチ プロセスを使用する場合は、データベースの作成を節約し、永続ストーリーも処理します)。 . Cywin/Windows + posix 環境で問題なく動作します。

PHP Redis クライアントはこちら.

Python クライアントはこちらです。

どちらも非常にクリーンでシンプルな API を備えています。Redis は、必要に応じてパブリッシュ/サブスクライブ メカニズムも提供しますが、一貫性のないキューにパブリッシュする場合、その価値は限られているように思えます。

于 2010-06-02T08:55:33.537 に答える