web-dev-qa-db-ja.com

キューサービスとしてのMongoDB?

MongoDBをキューサービスとして使用する実際のアプリケーションエクスペリエンスについて詳しく知りたいと思います。もしこの目的でMongoDBを使用した場合、それが使用された環境と同様に、考えを共有できますか?

36
Avi Kapuya

私はmongodbをメール送信のキューサービスとして使用しています。すぐに次のように機能します:

  1. 新しいメッセージが来たら、mongodbに保存します。
  2. バックグラウンドジョブは、アトミック操作 findAndModify を介してmongodbからメッセージをロードし、フラグProcessingをtrueに設定します。したがって、同じメッセージを2回処理しません(バックグラウンドジョブが複数のスレッドを実行するため)並行して)。
  3. 電子メールが送信されたら、mongodbからドキュメントを削除します。
  4. 各メッセージの失敗のカウントを保持し、3回失敗した後に削除することもできます。

一般に、指定されたスケジュールで電子メールを送信する必要があるため、mongodbをキューサービスとして使用します(各メッセージには、送信時刻に関する情報が含まれています)。

スケジュールがなく、メッセージをすぐに処理する必要がある場合は、既存の キューサービス を調べることをお勧めします。これは、おそらくメッセージキューをより深く理解しなければ見られないすべてのケースを処理するためです。

更新

メッセージ処理中にバックグラウンドジョブがクラッシュした場合、次のことができます。

  1. このメッセージを別のメッセージキューエラーコレクションに移動します。

  2. メッセージ内の処理試行カウンタを増やし、ステータス「新規」を再度割り当てて、処理を再試行します。バックグラウンドジョブがi等(同じメッセージを複数回処理でき、データを破損しない)であり、トランザクション(ジョブが失敗した場合、行った変更を元に戻す必要がある場合)を確認してください。 5回試行した後にジョブが失敗した場合(設定値)は#1を実行します。

  3. メッセージ処理のバグが修正されると、「新規」ステータスを割り当ててメッセージキューに移動するか、このメッセージを削除するだけでもう一度処理できます。実際にはビジネスプロセスに依存します。

41
Andrew Orsich

私はこの質問が2012年から戻ってきたことを知っていますが、私自身の研究中にこの記事を見つけて、serverdensityの開発者がrabbitmqをmongodbで単純なキューイングシステムに置き換えたことを他のユーザーに伝えたいだけです。

詳細な記事は次のとおりです。

https://blog.serverdensity.com/replacing-rabbitmq-with-mongodb/

5
Fer To

すばらしい記事 mongoDBのレプリケーションoplogをキューとして使用する方法を説明しています。

別のコレクションでも同じことができます。主なアドバイスは、 capped collection を使用することです。mongoドライバーには、クライアントが常にポーリングしないように、capped collectionで待機する効率的な手段があります。

3
Sean Reilly

PubSub/queueのPython実装 これは、上限付きコレクションの末尾カーソルまたは通常のコレクションのポーリングによって機能します。スタックを単純化してかなり良い結果を得たいいくつかのプロジェクトで使用しました。もちろん、アトミックなfindAndModifyの限界に達するまで誰かが既に述べたように、それはさまざまなテクニックによって処理できます。

0
nickmilon

よく検索して、JavaScriptバージョンを見つけました https://github.com/chilts/mongodb-queue 。しかし、goバージョンが必要なため、Goでメッセージをポーリングするマネージャーを含む単純な実装が行われました。 https://github.com/justmao945/mongomq

0
justmao945

シンプルなメッセージキュー 実装 です。

さまざまなメッセージキューシステムのパフォーマンスを評価する article の一部です。

シングルスレッド、シングルノードのセットアップでは、7 900 msgs/sの送信と1 900 msgs/sの受信を実現します。

0
Neil