Мы используем простые веб-сокеты для подключения к мобильным клиентам. Наше приложение запускается с использованием трех реплик в файле Deployment.yaml в K8s.
Когда мы перешли на мультипод с настройки одного модуля, мы ожидали проблемы с масштабированием. Мы применили блокировки Redis с помощью Redisson для код, который используется для получения данных учетной записи, в код, который идентифицирует лицо при входе в магазин.
Мы также использовали API K8s для отправки событий веб-сокета всем модулям, чтобы события не терялись. . Мы также выступаем в качестве клиента веб-сокета и подключаемся к серверу веб-сокетов за пределами сервера через прокси-сервер с использованием веб-сокетов Jetty.
Я уверен, что этой информации недостаточно, и код не является минимальным кодом. для запуска и отладки.
Будут ли эти подходы работать при масштабировании количества модулей?
Блокировка Redisprivate RedisAccountDTO getAccountNoFromRedis(String AccountNo) {
logger.info("Inside getAccountNoFromRedis with EAN:: {}", AccountNo);
String key = AccountNo + "LK";
RLock rLock = redissonClient.getLock(key);
RBucket bucket = null;
RedisAccountDTO redisAccountDTO = null;
String shoppingSessionStatus = null;
try {
logger.info("Acquiring lock for key:: {}", key);
logger.info("lockExpiryTime:ssss: {}", lockExpiryTime);
rLock.lock(Long.parseLong(lockExpiryTime), TimeUnit.MILLISECONDS);
logger.info("Lock accuired for key:; {}", key);
bucket = redissonClient.getBucket(AccountNo);
if (bucket != null) {
shoppingSessionStatus = bucket.get();
logger.info("shoppingSessionStatus:: {}", shoppingSessionStatus);
if (shoppingSessionStatus == null) {
logger.info("Setting shoppingsession as Active");
bucket.set(Constants.ACTIVE);
bucket.expire(Long.parseLong(bucketExpiryTime), TimeUnit.SECONDS);
}
redisAccountDTO = new RedisAccountDTO();
redisAccountDTO.setAccountNo(AccountNo);
redisAccountDTO.setIsShoppingSessionActive(shoppingSessionStatus);
}
} finally {
rLock.unlock();
logger.info("Lock Reld");
}
logger.info("RedisAccountDTO:: {}", redisAccountDTO);
return redisAccountDTO;
}
Мероприятия для наших мобильных клиентов
private void broadCastEventRest(String sessionVariableValue, String AccountNo, Event response) {
logger.info("Inside broadCastEventRest...");
try {
List podsIP = kubeClientAPIImpl.getPodsIP();
logger.info("podsIP:: {}", podsIP);
List runnables = new ArrayList();
if (!(podsIP == null || podsIP.isEmpty())) {
for (String podIp : podsIP) {
runnables.add(() -> pushEventRest(podIp, sessionVariableValue, AccountNo, response));
}
}
logger.info("runnables::{}",runnables);
runnables.stream().map(CompletableFuture::runAsync).collect(Collectors.toList()).stream()
.forEach(CompletableFuture::join);
} catch (Exception e) {
logger.info("fed in broadcasting event");
e.printStackTrace();
}
logger.info("Successfully broadcasted event");
}
private String pushEventRest(String podIp, String sessionVariableValue, String AccountNo, Event response) {
logger.info("Inside pushEventRest...");
String uri = baseProtocol + podIp + "/api/v1/" + "/pushEvent/" + sessionVariableValue;
logger.info("uri:: {}", uri);
HashMap header = getHttpHeaders();
RestResponse RestResponse = RestClient.doPost(uri, header, response,
String.class, AccountNo, "");
if (RestResponse != null && RestResponse.getHttpStatusCode() == 200) {
logger.info("Event Pushed Successfully");
return RestResponse.getResponseBody();
} else {
logger.info("Fed in pushing event");
}
return null;
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... pring-boot
Масштабирование веб-сокета при весенней загрузке ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1714710125
Anonymous
Мы используем простые веб-сокеты для подключения к мобильным клиентам. Наше приложение запускается с использованием трех реплик в файле Deployment.yaml в K8s.
Когда мы перешли на мультипод с настройки одного модуля, мы ожидали проблемы с масштабированием. Мы применили блокировки Redis с помощью Redisson для код, который используется для получения данных учетной записи, в код, который идентифицирует лицо при входе в магазин.
Мы также использовали API K8s для отправки событий веб-сокета всем модулям, чтобы события не терялись. . Мы также выступаем в качестве клиента веб-сокета и подключаемся к серверу веб-сокетов за пределами сервера через прокси-сервер с использованием веб-сокетов Jetty.
Я уверен, что этой информации недостаточно, и код не является минимальным кодом. для запуска и отладки.
Будут ли эти подходы работать при масштабировании количества модулей?
[b]Блокировка Redis[/b]private RedisAccountDTO getAccountNoFromRedis(String AccountNo) {
logger.info("Inside getAccountNoFromRedis with EAN:: {}", AccountNo);
String key = AccountNo + "LK";
RLock rLock = redissonClient.getLock(key);
RBucket bucket = null;
RedisAccountDTO redisAccountDTO = null;
String shoppingSessionStatus = null;
try {
logger.info("Acquiring lock for key:: {}", key);
logger.info("lockExpiryTime:ssss: {}", lockExpiryTime);
rLock.lock(Long.parseLong(lockExpiryTime), TimeUnit.MILLISECONDS);
logger.info("Lock accuired for key:; {}", key);
bucket = redissonClient.getBucket(AccountNo);
if (bucket != null) {
shoppingSessionStatus = bucket.get();
logger.info("shoppingSessionStatus:: {}", shoppingSessionStatus);
if (shoppingSessionStatus == null) {
logger.info("Setting shoppingsession as Active");
bucket.set(Constants.ACTIVE);
bucket.expire(Long.parseLong(bucketExpiryTime), TimeUnit.SECONDS);
}
redisAccountDTO = new RedisAccountDTO();
redisAccountDTO.setAccountNo(AccountNo);
redisAccountDTO.setIsShoppingSessionActive(shoppingSessionStatus);
}
} finally {
rLock.unlock();
logger.info("Lock Reld");
}
logger.info("RedisAccountDTO:: {}", redisAccountDTO);
return redisAccountDTO;
}
[b]Мероприятия для наших мобильных клиентов[/b]
private void broadCastEventRest(String sessionVariableValue, String AccountNo, Event response) {
logger.info("Inside broadCastEventRest...");
try {
List podsIP = kubeClientAPIImpl.getPodsIP();
logger.info("podsIP:: {}", podsIP);
List runnables = new ArrayList();
if (!(podsIP == null || podsIP.isEmpty())) {
for (String podIp : podsIP) {
runnables.add(() -> pushEventRest(podIp, sessionVariableValue, AccountNo, response));
}
}
logger.info("runnables::{}",runnables);
runnables.stream().map(CompletableFuture::runAsync).collect(Collectors.toList()).stream()
.forEach(CompletableFuture::join);
} catch (Exception e) {
logger.info("fed in broadcasting event");
e.printStackTrace();
}
logger.info("Successfully broadcasted event");
}
private String pushEventRest(String podIp, String sessionVariableValue, String AccountNo, Event response) {
logger.info("Inside pushEventRest...");
String uri = baseProtocol + podIp + "/api/v1/" + "/pushEvent/" + sessionVariableValue;
logger.info("uri:: {}", uri);
HashMap header = getHttpHeaders();
RestResponse RestResponse = RestClient.doPost(uri, header, response,
String.class, AccountNo, "");
if (RestResponse != null && RestResponse.getHttpStatusCode() == 200) {
logger.info("Event Pushed Successfully");
return RestResponse.getResponseBody();
} else {
logger.info("Fed in pushing event");
}
return null;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78422662/websocket-scaling-in-spring-boot[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия