6

(mongo-userディスカッショングループhttps://groups.google.com/d/topic/mongodb-user/i1ge4bNiMgM/discussionで質問)

こんにちは。MongoDBをメッセージキューとして使用したいと思います。そのために、上限付きコレクションと調整可能なカーソルを使用することを検討しました。テーラブルカーソルを使用して、挿入順にドキュメントにアクセスできることは知っていますが、

  1. カーソルに任意のソート順を使用できますか?
  2. テーリングカーソルはフィルタークエリで機能しますか(処理したくないドキュメントをスキップするため)?もしそうなら、それは新しいドキュメントの挿入をどのように処理しますか?新しいドキュメントがクエリ基準に一致する場合にのみ通知されますか?
  3. テーリングカーソルはC#ドライバーで完全にサポートされていますか?
  4. キューで単一の配信を保証したいのですが、2つのクライアントが同じコレクションからメッセージを読み込もうとした場合、同じメッセージを「消費」できないようにする必要があります。これはfindAndModifyで実現できると思いますが、テーリングカーソルでそれを行うにはどうすればよいですか?

ありがとうRG

4

1 に答える 1

9

2012年4月にシリコンバレーMUGで開催された「メッセージキューとしてのMongoDB」に関するAOL/About.meからのプレゼンテーションがあり、アプローチの計画に役立つ可能性があります。

  1. カーソルに任意のソート順を使用できますか?
  2. テーリングカーソルはフィルタークエリで機能しますか(処理したくないドキュメントをスキップするため)?もしそうなら、それは新しいドキュメントの挿入をどのように処理しますか?新しいドキュメントがクエリ基準に一致する場合にのみ通知されますか?

調整可能なカーソルは、上限のあるコレクションの最後を自然な順序でのみ調整します。並べ替え順序が必要な場合は、代わりにインデックス付きクエリを使用する必要があります。

詳細については、「テール可能カーソルの作成」ドキュメントページをお読みください。

テーリングカーソルはC#ドライバーで完全にサポートされていますか?

はい、調整可能なカーソルのサポートは1.1 C#ドライバーに実装されました(コード例を参照)。

キューで単一の配信を保証したいのですが、2つのクライアントが同じコレクションからメッセージを読み込もうとした場合、同じメッセージを「消費」できないようにする必要があります。これはfindAndModifyで実現できると思いますが、テーリングカーソルでそれを行うにはどうすればよいですか?

いくつかのアプローチがあります:

  • 調整可能なカーソルを持つ単一のリーダーに、タスクをワーカースレッドに分散させます(つまり、ワーカーキューの深さまたはラウンドロビンに基づいて)。これは、複数のリーダーを使用するよりも効率的ですが、単一障害点になる可能性があります。
  • (以下のコメントで@Contangoによって提案されています)複数のリーダーがありますが、楽観的同時実行制御を使用して、各タスクを1人のワーカーのみが「所有」するようにします。これによりI/Oが増加しますが、ワーカーが直接テーリングしている場合は、設計が簡素化される可能性があります。

アトミック操作の詳細については、MongoDBマニュアルの「操作のシーケンスの分離」を参照してください。

于 2012-08-23T06:58:08.080 に答える