軽量の Message Queue プロキシを実装したいと考えています。その仕事は、Web アプリケーション (PHP) からメッセージを受信し、メッセージ キュー サーバーに非同期的に送信することです。このプロキシを使用する理由は、MQ が常に使用できるとは限らず、遅れたりダウンしたりすることもありますが、メッセージが配信され、Web アプリケーションがすぐに戻ることを確認したいからです。
そのため、PHP は同じホストで実行されている MQ プロキシにメッセージを送信します。そのプロキシは、クラッシュの場合に永続化のためにメッセージを SQLite に保存します。同時に、接続が利用可能になると、SQLite から MQ にメッセージをバッチで送信し、SQLite からメッセージを削除します。
さて、私が理解しているように、このサービスには次のコンポーネントがあります。
- メッセージ リスナー (PHP からのメッセージをリッスンし、受信キューに書き込みます)
- DB フラッシャー (受信キューからメッセージを読み取り、データベースに保存します。SQLite のシングルスレッド性によります)
- MQ 接続ハンドラー (再接続することにより、MQ サーバーへの接続をオンラインに維持します)
- メッセージ送信者 (SQlite db からメッセージを収集して MQ サーバーに送信し、db から削除します)
#1 (TCPServer) に Twisted を使用することを考えていましたが、イベント駆動型ではない他のポイントとの統合に問題があります。直感的には、これらの各ポイントは個別のスレッドで実行する必要があることがわかります。これは、すべてが IO バウンドであり、互いに独立しているためです。ただし、それらを 1 つのスレッドに簡単に配置できます。にもかかわらず、このワーカー スレッドを Twisted のメイン ループとは別に実装する方法について、(私にとっては) 適切で明確な例を見つけることができませんでした。
私が始めた例は、service.Application および internet.TCPServer オブジェクトを使用するchatserver.pyです。TCPServer サービスを作成する前に独自のスレッドを開始すると、スレッドは数回実行されますが、停止して二度と実行されません。なぜこれが起こっているのかはわかりませんが、おそらく Twisted でスレッドを正しく使用していないことが原因です。
別のワーカー スレッドを実装して Twisted を維持する方法について何か提案はありますか? 考えている代替アーキテクチャはありますか?