1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ysc-high-availability

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Обеспечение непрерывной высокой доступности, высокой производительности и балансировки нагрузки

Высокая доступность: несколько копий сервиса.

Высокая производительность: ограничение времени ожидания.

Балансировка нагрузки: кольцевой буфер.

Уже реализованные функции:

  1. Поисковый сервис с возможностью вызова через HTTP.
  2. Доступ к REDIS.

Принцип работы проекта в одном предложении:

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

Использование в WEB-проекте

  1. Компиляция зависимостей:

  2. Указание зависимостей в pom.xml:

    <dependency>
        <groupId>org.apdplat.service</groupId>
        <artifactId>high-availability</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
  3. Создание каталога conf в src/main/resources и файла conf.txt в нём:

    В файле conf.txt указываются следующие настройки:

    • search.api.server.urls — список URL-адресов серверов поиска;
    • search.api.timeout.seconds — время ожидания ответа от сервера поиска;
    • status.log.enabled — включение вывода статуса в журнал при каждом недоступном URL;
    • unavailable.schedule.initial.delay.seconds — начальная задержка перед началом проверки доступности серверов;
    • unavailable.schedule.period.seconds — период проверки доступности серверов.
  4. Настройка конфигурации Redis:

    Здесь указываются адреса серверов Redis, параметры пула соединений и другие настройки.

  5. Конфигурация слушателя в web.xml:

    Добавляется слушатель HighAvailabilityListener.java.

  6. Код класса HighAvailabilityListener:

public class HighAvailabilityListener implements ServletContextListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(HighAvailabilityListener.class);

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        String conf = sce.getServletContext().getRealPath("/WEB-INF/classes/conf/");
        LOGGER.info("Запуск поискового сервиса, мониторинг конфигурации: {}", conf);
        ConfWatcher.startWatch(conf);
        sce.getServletContext().setAttribute("SearchAPI", new SearchAPIImpl());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        LOGGER.info("Остановка поискового сервиса");
        SearchAPI searchAPI = (SearchAPI) sce.getServletContext().getAttribute("SearchAPI");
        if (searchAPI != null) {
            searchAPI.close();
        }
        LOGGER.info("Завершение мониторинга конфигурации");
        ConfWatcher.stopWatch();
    }
}
  1. Вызов поискового сервиса в jsp:

Здесь происходит получение экземпляра поискового сервиса и его использование для поиска по ключевому слову.

  1. Получение соединения с Redis:

В коде происходит получение соединения с серверами Redis. redis_ha_detector

Jedis jedis = null; try{ jedis = JedisAPI.getInstance().getJedis(); // Если все сервисы REDIS недоступны, то возвращается null if(jedis != null) { jedis.set(DETECT_KEY, String.valueOf(System.currentTimeMillis())); System.out.println(jedis.get(DETECT_KEY)); System.out.println("Состояние сервиса REDIS:\n" + JedisAPI.getInstance().getStatus()); } }finally { if (jedis != null){ // После использования соединения необходимо закрыть его, вызвав метод close jedis.close(); } }

Использование в не-WEB проекте

  1. Компиляция зависимостей:

    git clone https://github.com/ysc/high-availability.git cd high-availability mvn install

  2. В файле pom.xml укажите следующие зависимости:

    org.apdplat.service high-availability 1.0-SNAPSHOT
  3. Создайте каталог conf и в нём файл conf.txt, добавив следующие настройки:

    #search api зависит от этих серверов search.api.server.urls=http://192.168.0.100:8080/search.jsp, http://192.168.0.101:8080/search.jsp #конфигурация таймаута для гарантии времени отклика search.api.timeout.seconds=1 #включать ли вывод статуса в журнал при каждом недоступном URL-адресе status.log.enabled=true #начальная задержка таймера недоступности unavailable.schedule.initial.delay.seconds=60 #период таймера недоступности unavailable.schedule.period.seconds=60 #серверы REDIS redis.servers=192.168.0.102:6379:b01cbe1209a545a7cdb, 192.168.0.103:6379:b01cbe1209a545a7cdb

    redis.pool.blockWhenExhausted=false redis.pool.jmxEnabled=false redis.pool.lifo=true redis.pool.maxIdle=500 redis.pool.maxTotal=500 redis.pool.maxWaitMillis=500 redis.pool.minEvictableIdleTimeMillis=1800000 redis.pool.minIdle=0 redis.pool.numTestsPerEvictionRun=3 redis.pool.softMinEvictableIdleTimeMillis=1800000 redis.pool.testOnBorrow=true redis.pool.testWhileIdle=true redis.pool.timeBetweenEvictionRunsMillis=-1 redis.pool.readTimeoutMillis=2000

  4. Добавьте каталог conf в classpath:

    java -cp conf:xxx-1.0-SNAPSHOT-jar-with-dependencies.jar

  5. Запустите поисковый сервис и отслеживайте код конфигурации каталога:

    Path conf = Paths.get(ConfWatcher.class.getResource("/conf/").getPath()); LOGGER.info("Запуск поискового сервиса, отслеживание каталога конфигурации: {}", conf); ConfWatcher.startWatch(conf); SearchAPI searchAPI = new SearchAPIImpl();

  6. Вызов поискового сервиса:

    String keyword = "CCTV-1"; int topN = 5;

    String result = null; long start = System.currentTimeMillis(); result = searchAPI.search(keyword, topN); String cost = Utils.getTimeDes(System.currentTimeMillis()-start);

    // Если вы хотите узнать состояние поискового сервиса String status = searchAPI.getStatus();

  7. Получение соединения с REDIS:

    String DETECT_KEY = "redis_ha_detector";

    Jedis jedis = null; try{ jedis = JedisAPI.getInstance().getJedis(); // Если все сервисы REDIS недоступны, то возвращается null if(jedis != null) { jedis.set(DETECT_KEY, String.valueOf(System.currentTimeMillis())); System.out.println(jedis.get(DETECT_KEY)); System.out.println("Состояние сервиса REDIS:\n" + JedisAPI.getInstance().getStatus()); } }finally { if (jedis != null){ // После использования соединения необходимо закрыть его, вызвав метод close jedis.close(); } }

Структура каталогов

. ├── README.md ├── pom.xml └── src └── main └── java └── org └── apdplat └── service ├── api ├── JedisAPI.java └── SearchAPI.java └── configration ├── ConfManager.java

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Обеспечение непрерывной высокой доступности, высокой производительности и балансировки нагрузки. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/ysc-high-availability.git
git@api.gitlife.ru:oschina-mirror/ysc-high-availability.git
oschina-mirror
ysc-high-availability
ysc-high-availability
master