KeyValueStore Интерфейс - PullRequest
       12

KeyValueStore Интерфейс

0 голосов
/ 14 декабря 2011

Привет, у меня есть следующий интерфейс:

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) {
    }
}

Как я могу реализовать клиента для взаимодействия сданный интерфейс?Я хочу сделать это с архитектурой клиент-сервер.

Еще одна вещь, которую я хочу, - это «сервер имен», который знает, где хранятся данные (в основном он имеет сопоставление ключей с «серверами хранения»),и несколько других серверов, где данные фактически сохраняются.

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Это довольно открытый вопрос. Я сделаю снимок.

Я думаю, вам нужно помнить три различных понятия:

Интерфейс Реализация Клиент

Давайте посмотрим на каждого. У вас уже есть интерфейс, так что с этой стороны все хорошо.

То, что вы называете клиентом, я полагаю, является реализацией, то есть это фактический код, который реализует поведение методов, определенных в вашем интерфейсе.

Клиент (в моей интерпретации) будет еще одной частью вашей системы, которая взаимодействует с вашим интерфейсом через реализацию, которую вы напишите.

Решение вашего вопроса: Первым шагом было бы выяснить, как вы сохраните данные, введенные через put и putAll. Если вы просто хотите сохранить некоторые данные в памяти, то, вероятно, карты будет достаточно. Если ожидается, что количество записей значительно возрастет, возможно, вы захотите заставить реализацию взаимодействовать с базой данных (или другой формой постоянства).

Добавляет ли это немного света на ваш вопрос? Добавьте еще несколько деталей, и я дам больше информации, если смогу.

Надеюсь, это поможет.

Edit:

В распределенной системе хранения имеется довольно много переменных, занесенных в таблицу.

У вас есть централизованная конечная точка, которая затем выбирает, где данные будут храниться каким-либо образом (циклический перебор или какой-нибудь более сложный алгоритм)?

Как клиенты будут взаимодействовать с вашей системой? Это веб-система, RMI, что-то еще?

Я думаю, что вам нужно сосредоточиться на базовой архитектуре, прежде чем думать о фактической реализации, поскольку основные проблемы в такой системе - это надежность и обработка недостатков.

Одной из возможностей является наличие «сервера имен», который знает, где хранятся данные (в основном он имеет отображение ключей на «серверах хранения»), и нескольких других серверов, где данные фактически сохраняются. Вам нужно выбрать, как они будут взаимодействовать между ними, или если каждый сервер будет одновременно и «сервером имен», и «сервером хранения» ... здесь действительно много возможностей!

1 голос
/ 14 декабря 2011

Самой простой реализацией было бы использование внутреннего Map, но это немного глупо, почему бы вам не использовать 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();
    }
}

Так что я не уверен, что ты этого хочешь. Вы хотите клиент-серверную архитектуру? Если это так, пожалуйста, четко укажите это в своем вопросе и укажите требуемые характеристики.

0 голосов
/ 15 декабря 2011

Не совсем точно, что вы спрашиваете здесь, но я предполагаю, что вы хотите, чтобы клиент реализовал интерфейс и удалил вызовы на сервер, который также реализует интерфейс. Вот мои мысли:

  1. Вам необходимо выбрать технологию удаленного взаимодействия. RMI - это простой выбор. Какой-то HTTP клиент / сервер - еще одна возможность. Вот простой UDP клиент / сервер . Вот еще несколько идей .

  2. На сервере вам придется что-то делать с данными. Очевидным было бы просто иметь локальную память HashMap. Использование базы данных SQL, такой как H2 , было бы простым способом сохранить ее. Беркли DB JE это еще один.

  3. Самая сложная часть проблемы - выяснить, как вы собираетесь каким-то образом распределять запросы. Вы можете взять значение hashCode() на клиенте и разделить хеш-пространство между серверами. Например, вы можете взять целое число hashCode() и изменить его по количеству серверов. Это значение будет сервером для отправки. Если количество серверов изменится, вам, к сожалению, придется все переделывать. Вы можете отправить запросы put на произвольный сервер, а затем отправить все запросы get на все серверы и дождаться всех ответов. Однако это требует некоторого потока, если вы не делаете это поочередно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...