Высокая доступность: несколько копий сервиса.
Высокая производительность: ограничение времени ожидания.
Балансировка нагрузки: кольцевой буфер.
На бэкенде есть несколько одинаковых поисковых сервисов и несколько одинаковых серверов REDIS, а промежуточный слой бизнес-логики не вызывает напрямую поисковые сервисы и REDIS, вместо этого он обращается к этому компоненту для выполнения вызовов.
Компиляция зависимостей:
Указание зависимостей в pom.xml:
<dependency>
<groupId>org.apdplat.service</groupId>
<artifactId>high-availability</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
Создание каталога conf в src/main/resources и файла conf.txt в нём:
В файле conf.txt указываются следующие настройки:
Настройка конфигурации Redis:
Здесь указываются адреса серверов Redis, параметры пула соединений и другие настройки.
Конфигурация слушателя в web.xml:
Добавляется слушатель HighAvailabilityListener.java.
Код класса 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();
}
}
Здесь происходит получение экземпляра поискового сервиса и его использование для поиска по ключевому слову.
В коде происходит получение соединения с серверами 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(); } }
Компиляция зависимостей:
git clone https://github.com/ysc/high-availability.git cd high-availability mvn install
В файле pom.xml укажите следующие зависимости:
org.apdplat.service high-availability 1.0-SNAPSHOTСоздайте каталог 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
Добавьте каталог conf в classpath:
java -cp conf:xxx-1.0-SNAPSHOT-jar-with-dependencies.jar
Запустите поисковый сервис и отслеживайте код конфигурации каталога:
Path conf = Paths.get(ConfWatcher.class.getResource("/conf/").getPath()); LOGGER.info("Запуск поискового сервиса, отслеживание каталога конфигурации: {}", conf); ConfWatcher.startWatch(conf); SearchAPI searchAPI = new SearchAPIImpl();
Вызов поискового сервиса:
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();
Получение соединения с 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 )