как отправить сетевые запросы (географически) самому близкому серверу

Неизменяемый объект - это объект, в котором внутренние поля (или, по крайней мере, все внутренние поля, которые влияют на его внешнее поведение) не могут быть изменены.

Есть много преимуществ для неизменяемых строк:

Производительность: Выполните следующую операцию:

String substring = fullstring.substring(x,y);

Базовый C для метода substring () вероятно, что-то вроде этого:

// Assume string is stored like this:
struct String { char* characters; unsigned int length; };

// Passing pointers because Java is pass-by-reference
struct String* substring(struct String* in, unsigned int begin, unsigned int end)
{
    struct String* out = malloc(sizeof(struct String));
    out->characters = in->characters + begin;
    out->length = end - begin;
    return out;
}

Обратите внимание, что ни один из символов не должен быть скопирован! Если бы объект String был изменяемым (символы могли измениться позже), то вам пришлось бы скопируйте все символы, в противном случае изменения символов в подстроке будут отражены в другой строке позже.

Параллелизм: Если внутренняя структура неизменяемого объекта является действительной, она всегда будет действительной. Нет никаких шансов, что разные потоки могут создать недопустимое состояние в этом объекте. Следовательно, неизменяемыми объектами являются Thread Safe .

Сборщик мусора: Сборщику мусора гораздо проще принимать логические решения относительно неизменных объектов.

Однако есть и недостатки неизменности:

Производительность: Подождите, я думал, вы сказали, что производительность - это преимущество неизменности! Ну, иногда, но не всегда. Возьмите следующий код:

foo = foo.substring(0,4) + "a" + foo.substring(5);  // foo is a String
bar.replace(4,5,"a"); // bar is a StringBuilder

Обе строки заменяют четвертый символ буквой «а». Второй фрагмент кода не только более читабелен, но и быстрее. Посмотрите, как вы должны сделать основной код для foo. Подстроки просты, но теперь, когда в пятой позиции уже есть символ и что-то еще может ссылаться на foo, вы не можете просто изменить его; Вы должны скопировать всю строку (конечно, некоторые из этих функций абстрагированы в функции в реальном базовом C, но суть здесь в том, чтобы показать код, который выполняется все в одном месте).

struct String* concatenate(struct String* first, struct String* second)
{
    struct String* new = malloc(sizeof(struct String));
    new->length = first->length + second->length;

    new->characters = malloc(new->length);

    int i;

    for(i = 0; i < first->length; i++)
        new->characters[i] = first->characters[i];

    for(; i - first->length < second->length; i++)
        new->characters[i] = second->characters[i - first->length];

    return new;
}

// The code that executes
struct String* astring;
char a = 'a';
astring->characters = &a;
astring->length = 1;
foo = concatenate(concatenate(slice(foo,0,4),astring),slice(foo,5,foo->length));

Обратите внимание, что concatenate вызывается дважды , что означает, что вся строка должна быть зациклена! Сравните это с кодом C для операции bar:

bar->characters[4] = 'a';

Операция с изменяемой строкой, очевидно, намного быстрее.

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

// This will have awful performance if you don't use mutable strings
String join(String[] strings, String separator)
{
    StringBuilder mutable;
    boolean first = true;

    for(int i = 0; i < strings.length; i++)
    {
        if(!first) first = false;
        else mutable.append(separator);

        mutable.append(strings[i]);
    }

    return mutable.toString();
}

Поскольку объект mutable является локальной ссылкой, у вас нет беспокоиться о безопасности параллелизма (только один поток когда-либо касается его). А поскольку на него больше нигде нет ссылок, он размещается только в стеке, поэтому он освобождается, как только завершается вызов функции (вам не нужно беспокоиться о сборке мусора). И вы получаете все преимущества производительности как изменчивости, так и неизменности.

7
задан Gilles 'SO- stop being evil' 21 July 2011 в 23:58
поделиться

4 ответа

Один из простых подходов - это посмотреть на первый байт (класс A) IP-адреса, входящего в запрос UDP DNS, а затем, основываясь на том, что вы можете доставить правильный географический IP-адрес.

0
ответ дан 8 December 2019 в 01:47
поделиться

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

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

Чтобы получить более подробный обзор, ознакомьтесь с этой статьей о CDN (обратите внимание на раздел «Технологии»):

Сеть доставки контента - Википедия

Это типы сетей, которые большие сайты используют для распространения своего контента по net (популярный пример - Akamai). Как видите, все может довольно быстро усложниться, если у CDN есть собственные проприетарные протоколы и т. Д.

0
ответ дан 8 December 2019 в 01:47
поделиться

Один из подходов, как упомянул Джефф, заключается в использовании IP-адреса: http://en.wikipedia.org/wiki/Geolocation_software

По моему опыту, это точно ближайший относительно крупный город (по крайней мере, в США). Есть несколько открытых баз данных, которые могут помочь в этом (см. Вики-ссылку). Затем вы можете создавать теги изображений, ссылки для скачивания и тому подобное на основе этой информации.

Что касается поиска ближайшего сервера, я уверен, что вы можете придумать несколько способов сделать это. Например, если лучшая прибыль, которую вы можете получить, - это крупный город, вы можете найти этот город в списке широты / долготы и рассчитать ближайший сервер на основе этого.

0
ответ дан 8 December 2019 в 01:47
поделиться

Обновление: я не видел отказа от ответственности о коммерческих решениях в конце исходного сообщения. Я оставлю это для тех, кому это может быть интересно.

-

Взгляните на http://ultradns.com/ . Подобная управляемая служба DNS может быть именно тем, что вам нужно для выполнения того, что вы ищете.

Amazon.com, Forbes.com, Oracle, все используют их ...

Цитата из http: / /ultradns.com/solutions/traffic.html[1124185 provided:

Решение UltraDNS Traffic Management предоставляет набор инструментов, позволяющих ИТ-администраторам определять конфигурации балансировки нагрузки для серверов контента, находящихся в одном или нескольких географических местоположениях. Решение для управления трафиком управляет трафиком, направленным на серверы, путем динамического изменения ответов на запросы DNS. Балансировка нагрузки выполняется на основе динамических метрик, получаемых от хост-серверов на основе постоянного мониторинга. Решение UltraDNS Traffic Management - это не одно приложение, а объединяет в себе возможности нескольких существующих систем UltraDNS для контроля трафика, управления сбоями сайтов и оптимизации систем веб-контента.

0
ответ дан 8 December 2019 в 01:47
поделиться