MongoDBをキューサービスとして使用する実際のアプリケーションエクスペリエンスについて詳しく知りたいと思います。もしこの目的でMongoDBを使用した場合、それが使用された環境と同様に、考えを共有できますか?
私はmongodbをメール送信のキューサービスとして使用しています。すぐに次のように機能します:
Processing
をtrueに設定します。したがって、同じメッセージを2回処理しません(バックグラウンドジョブが複数のスレッドを実行するため)並行して)。一般に、指定されたスケジュールで電子メールを送信する必要があるため、mongodbをキューサービスとして使用します(各メッセージには、送信時刻に関する情報が含まれています)。
スケジュールがなく、メッセージをすぐに処理する必要がある場合は、既存の キューサービス を調べることをお勧めします。これは、おそらくメッセージキューをより深く理解しなければ見られないすべてのケースを処理するためです。
メッセージ処理中にバックグラウンドジョブがクラッシュした場合、次のことができます。
このメッセージを別のメッセージキューエラーコレクションに移動します。
メッセージ内の処理試行カウンタを増やし、ステータス「新規」を再度割り当てて、処理を再試行します。バックグラウンドジョブがi等(同じメッセージを複数回処理でき、データを破損しない)であり、トランザクション(ジョブが失敗した場合、行った変更を元に戻す必要がある場合)を確認してください。 5回試行した後にジョブが失敗した場合(設定値)は#1を実行します。
メッセージ処理のバグが修正されると、「新規」ステータスを割り当ててメッセージキューに移動するか、このメッセージを削除するだけでもう一度処理できます。実際にはビジネスプロセスに依存します。
私はこの質問が2012年から戻ってきたことを知っていますが、私自身の研究中にこの記事を見つけて、serverdensityの開発者がrabbitmqをmongodbで単純なキューイングシステムに置き換えたことを他のユーザーに伝えたいだけです。
詳細な記事は次のとおりです。
https://blog.serverdensity.com/replacing-rabbitmq-with-mongodb/
すばらしい記事 mongoDBのレプリケーションoplogをキューとして使用する方法を説明しています。
別のコレクションでも同じことができます。主なアドバイスは、 capped collection を使用することです。mongoドライバーには、クライアントが常にポーリングしないように、capped collectionで待機する効率的な手段があります。
PubSub/queueのPython実装 これは、上限付きコレクションの末尾カーソルまたは通常のコレクションのポーリングによって機能します。スタックを単純化してかなり良い結果を得たいいくつかのプロジェクトで使用しました。もちろん、アトミックなfindAndModifyの限界に達するまで誰かが既に述べたように、それはさまざまなテクニックによって処理できます。
よく検索して、JavaScriptバージョンを見つけました https://github.com/chilts/mongodb-queue 。しかし、goバージョンが必要なため、Goでメッセージをポーリングするマネージャーを含む単純な実装が行われました。 https://github.com/justmao945/mongomq