Мы используем простые веб-сокеты для подключения к мобильным клиентам. Наше приложение запускается с использованием трех реплик в файле 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