Couchbase Server 2.0を使用すると、2つのバケット(または、物理リソースを分離する場合は2つの別個のクラスター)をセットアップできます。セッションクラスターでは、おそらく次のように、JSONドキュメント(キーと値のペアの値)を保存します。
{
"sessionId" : "some-guid",
"users" : [ "user1", "user2" ],
"chatData" : [ "message1", "message2"],
"isActive" : true,
"timestamp" : [2012, 8, 6, 11, 57, 00]
}
次に、セッションデータベースにMap / Reduceビューを記述して、期限切れのすべてのアイテムのリストを表示できます(以下の例では、メタ引数を使用して、DP4ではなくCouchbaseServer2.0の最近のビルドが必要です。
function(doc, meta) {
if (doc.sessionId && ! doc.isActive) {
emit(meta.id, null);
}
}
次に、任意のCouchbaseクライアントライブラリを使用して、ビューをクエリし、アイテムを取得して分析クラスター(またはバケット)に移動するタスクを実行できます。したがって、C#ではこれは次のようになります。
var view = sessionClient.GetView("sessions", "all_inactive");
foreach(var item in view)
{
var doc = sessionClient.Get(item.ItemId);
analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
sessionClient.Remove(item.ItemId);
}
代わりに、明示的なタイムスタンプまたは有効期限を使用したい場合は、タイムスタンプに基づいてビューにインデックスを付けることができます。
function(doc) {
if (doc.sessionId && ! doc.isActive) {
emit(timestamp, null);
}
}
次に、タスクは、x日以内にタッチされていないすべてのドキュメントを返すためのスタートキーを含めることにより、ビューをクエリできます。
var view = sessionClient.GetView("sessions", "all_inactive").StartKey(new int[] { DateTime.Now.Year, DateTime.Now.Months, DateTime.Now.Days-1);
foreach(var item in view)
{
var doc = sessionClient.Get(item.ItemId);
analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
sessionClient.Remove(item.ItemId);
}
Couchbase Server 2.0の詳細については、 http://www.couchbase.com/couchbase-server/nextを確認してください。このアプローチについて説明が必要な場合は、このスレッドでお知らせください。
-ジョン