2

ドキュメントサーバーを実装しています。現在、2人のユーザーが同じドキュメントを開き、それを変更して変更を保存すると、ドキュメントの状態は未定義になります(最初のユーザーの変更が永続的に保存されるか、2番目のユーザーの変更が永続的に保存されます)。これは完全に不十分です。この問題を解決するために、2つの可能性を検討しました。

1つは、誰かが最初に開いたときにドキュメントをロックし、閉じたときにロックを解除することです。ただし、サーバーへのネットワーク接続が突然中断された場合、ドキュメントは永久にロックされた状態のままになります。明らかな解決策は、サーバーに定期的なpingを送信することです。サーバーが特定のクライアントからKpingを連続して受信しない場合(K> 1)、このクライアントによってロックされているドキュメントのロックが解除されます。そのクライアントが再び表示された場合、誰かがまだドキュメントをロックしていない場合は、ドキュメントが再びロックされます。これは、クライアントアプリケーション(Webブラウザで実行中)が予期せず終了し、サーバーに「終了、ドキュメントのロックを解除」信号を送信できなくなった場合にも役立ちます。

2つ目は、異なるユーザーによって保存された同じドキュメントの複数のバージョンを保存することです。ドキュメントへの変更が連続して行われる場合、システムはバージョンをマージするか、優先バージョンを選択することを提案します。ストレージスペースを最適化するには、ドキュメントの差分のみを保持する必要があります(ソース管理ソフトウェアと同様)。

サーバーへの接続が遅く、応答しない場合があることを考慮して、どの方法を選択する必要がありますか?パラメータ(ping間隔、高速連続間隔)はどのように決定する必要がありますか?

PS残念ながら、ドキュメントをデータベースに保存できません。

4

3 に答える 3

1

あなたが説明する最初のオプションは本質的に悲観的なロックモデルですが、2番目のオプションは楽観的なモデルです。どちらを選択するかは、実際には多くの要因に帰着しますが、本質的には、ビジネスがどのように機能したいかによって決まります。たとえば、編集する必要のあるドキュメントが別のユーザーによってロックされた場合、ユーザーに不当な迷惑をかけますか? ドキュメントがロックされていて、クライアントが接続された状態で誰かが休暇に出かけるとどうなりますか? 各ドキュメントの競合の可能性は? つまり、同じドキュメントが 2 人のユーザーによって同時に変更される可能性はどの程度か? 1 つのドキュメント内で変更がどの程度ローカライズされる可能性があるか? (同じセクションが定期的に変更されている場合、マージを実行すると、単に変更を再度行うよりも時間がかかる場合があります)。

競合が比較的少ない、および/または各変更のサイズがかなり小さいと仮定すると、自動または手動のマージを使用して競合を解決する楽観的なモデルを選択することになるでしょう。ドキュメントの内容のバージョン番号またはチェックサムを使用して、マージが必要かどうかを判断できます。

于 2008-08-13T13:26:57.580 に答える
0

私の提案はあなたの最初のもののようなものになるでしょう。最初のユーザー(Bob)がドキュメントを開くと、他のユーザーが現在のドキュメントのみを読み取ることができるようにロックを取得します。ユーザーが使用中にドキュメントを保存した場合、ユーザーはロックを保持します。彼がドキュメントを終了したときのみ、ロックが解除され、他の人が編集できます。

ボブがロックをかけているときに2番目のユーザー(ケイト)がドキュメントを開くと、ケイトはドキュメントが編集不可であることを示すメッセージを受け取りますが、ロックが解除されるまでドキュメントを読むことができます。

では、ボブがロックを取得するとどうなりますか。ドキュメントを1〜2回保存した後、アプリケーションを終了してロックを解除したままにします。

あなた自身が言ったように、ロックを持ったクライアントに特定の頻度でpingを送信するように要求することはおそらく最良のオプションです。設定された時間クライアントからpingを受信しない場合、これは事実上、クライアントが応答しなくなったことを意味します。これがWebアプリケーションの場合、pingにjavascriptを使用できます。最後に保存されたドキュメントはロックを解除し、Kateはそれを取得できるようになります。

pingには、クライアントがロックオンしているドキュメントの名前を含めることができ、サーバーは、そのドキュメントの最後のpingがいつ受信されたかを計算できます。

于 2008-08-13T12:10:43.240 に答える
0

現在、ドキュメントは限られたグループの人々によって公開されており、それぞれが別々の主題に取り組んでいます。したがって、ロックによる不都合は最小限に抑えられます。人々はほとんどの場合、既存のドキュメントを拡張し、間違いを修正します。

悲観的なモデルについて言えば、ロックの有効期限をロック開始日の 1 日前などに設定することで、「N 日間クライアントを接続したままにする」というシナリオを回避できます。編集されたドキュメントは決してミッション クリティカルではなく、複数のユーザーによって変更されることはめったにないため、それで十分な場合があります。

ここで、楽観モデルを考えてみましょう。ドキュメントが規則的な (たとえば、階層的な) 構造を持っている場合、違いをどのように検出する必要がありますか? そうでない場合は?これらの場合、自動マージが成功する可能性はどのくらいですか?

一部のドキュメント (「admins」ユーザー グループによって編集された) には重要な構成情報 (ドキュメントのグローバル インデックス、ユーザー ロールなど) が含まれているため、状況はさらに複雑になります。私の考えでは、日常的に変更されるわけではないため、まさにこの種の情報にはロックの方が有利です。そのため、一部のハイブリッド ソリューションが受け入れられる場合があります。

どう思いますか?

于 2008-08-13T14:07:32.273 に答える