0

こんにちは、次のインターフェイスがあります。

public interface KeyValueStore {
    public void put(String key, byte[] value);
    public byte[] get(String key);
    public void putAll(Map<String,byte[]> pairs);
    public Map<String,byte[]> getAll(Collection<String> keys);
}

そして、以前のインターフェースを実装する次のクライアントがあります。

public class Client implements KeyValueStore{

    @Override
    public void put(String key, byte[] value) {
    }

    @Override
    public byte[] get(String key) {
    }

    @Override
    public void putAll(Map<String, byte[]> pairs) {

    }

    @Override
    public Map<String, byte[]> getAll(Collection<String> keys) {
    }
}

特定のインターフェイスと対話するためにクライアントを実装するにはどうすればよいですか? これをクライアント サーバー アーキテクチャで実現したいと考えています。

もう 1 つ欲しいのは、データがどこに保存されているかを知る「ネーム サーバー」 (基本的には「ストレージ サーバー」へのキーのマッピングを持っている) と、データが実際に永続化される他のいくつかのサーバーです。

4

3 に答える 3

1

最も基本的な実装は internal を使用することですが、それは少しばかげています。そもそもMapa を使用しないのはなぜですか?Map

public class Client implements KeyValueStore{
    private final Map<String, byte[]> internalMap = new HashMap<String, byte[]>();

    @Override
    public void put(String key, byte[] value) {
        this.internalMap.put(key, value);
    }

    @Override
    public byte[] get(String key) {
        return internalMap.get(key);
    }

    @Override
    public void putAll(Map<String, byte[]> pairs) {
        internalMap.putAll(pairs);
    }

    @Override
    public Map<String, byte[]> getAll(Collection<String> keys) {
        return internalMap.keySet();
    }
}

だから私はそれがあなたが望むものかどうかわかりません。クライアント/サーバー アーキテクチャが必要ですか? その場合は、ご希望の仕様とともに、質問に明記してください。

于 2011-12-14T17:26:39.250 に答える
1

これはかなり自由回答形式の質問です。撮ってみます。

次の 3 つの異なる概念を念頭に置く必要があると思います。

インターフェイス実装クライアント

それぞれを見てみましょう。あなたはすでにインターフェースを持っているので、その部分はすべて問題ありません。

あなたがクライアントと呼んでいるものは、実装であると私は信じています。つまり、インターフェイスで定義されたメソッドの動作を実装するのは実際のコードです。

クライアント (私の解釈では) は、システムのさらに別の部分であり、作成する実装を通じてインターフェイスと対話します。

あなたの質問への対処: 最初のステップは、put と putAll によって導入されたデータをどのように永続化するかを理解することです。いくつかのものをメモリに保持したいだけなら、おそらく Map で十分でしょう。エントリの数が大幅に増加すると予想される場合は、実装をデータベース (または他の形式の永続性) と対話させたいと思うでしょう。

これはあなたの質問にいくつかの光を追加しますか? さらに詳細を追加してください。可能であれば、より多くの洞察を提供します。

それが役に立てば幸い。

編集:

分散ストレージ システムには、非常に多くの変数が含まれています。

何らかの方法 (ラウンドロビンまたはより複雑なアルゴリズム) でデータを保存する場所を選択する集中型のエンドポイントはありますか?

クライアントはシステムとどのようにやり取りしますか? それは Web ベースのシステム、RMI などですか?

このようなシステムの主な問題は堅牢性と処理の欠陥であるため、実際の実装を考える前に基本的なアーキテクチャに集中する必要があると思います。

1つの可能性は、データがどこに保存されているかを知る「ネームサーバー」(基本的に「ストレージサーバー」へのキーのマッピングを持っている)と、データが実際に永続化されるいくつかの他のサーバーを持つことです。これらがそれらの間でどのように通信するかを選択する必要があります。または、各サーバーが「ネームサーバー」と「ストレージサーバー」の両方になるかどうか...ここには本当に多くの可能性があります!

于 2011-12-14T17:28:05.017 に答える
0

ここで何を求めているのか正確にはわかりませんが、クライアントにインターフェイスを実装し、インターフェイスも実装するサーバーへの呼び出しをリモートで行うことを想定しています。ここに私の考えがあります:

  1. リモート処理テクノロジを選択する必要があります。 RMIは簡単な選択です。ある種の HTTP クライアント/サーバーも別の可能性です。これは単純な UDP クライアント/サーバーです。ここにいくつかのアイデアがあります。

  2. サーバー上でデータを処理する必要があります。明らかな 1 つは、ローカルの in-memory を持つことHashMapです。H2のような SQL データベースを使用すると、簡単に永続化できます。 もう 1 つはBerkeley DB JEです。

  3. この問題の最も難しい部分は、どうにかしてリクエストを分散する方法を考え出すことです。hashCode()クライアントで値を取得し、サーバー間でハッシュ スペースを分割できます。たとえば、hashCode()整数をサーバーの数で変更できます。その値は、送信先のサーバーになります。サーバーの数が変更された場合、残念ながらすべてを再変更する必要があります。put要求をランダムなサーバーに送信してから、すべてのget要求をすべてのサーバーに送信し、すべての応答を待つことができます。ただし、連続して実行しない限り、スレッド fu が必要です。

于 2011-12-14T21:41:55.857 に答える