Сеансы обычно являются оптимизацией для повышения производительности при работе с несколькими серверами.Они повышают производительность, гарантируя, что запросы клиентов всегда отправляются на тот же сервер, который кэшировал данные клиентов.
Если вы хотите запустить только один сервер, вам не придется беспокоиться о сеансах.Существует два распространенных подхода к решению этой проблемы.
1.В состоянии памяти
Если состояние, которое вы хотите поддерживать, достаточно мало, чтобы поместиться в память, и вы не против потерять его в случае сбоя или перезагрузки сервера, вы можете сохранить его в памяти.Вы можете создать весенний сервис, который содержит структуру данных.Затем вы можете внедрить эту службу в свои контроллеры и изменить состояние в ваших обработчиках http.
Службы по умолчанию являются одиночными.Таким образом, состояние, хранящееся в службе, доступно для всех контроллеров, компонентов и пользовательских запросов.Ниже приведен небольшой псевдо-пример.
Класс обслуживания
@Service
public class MyState
{
private Map<String, Integer> sums = new HashMap<>();
public synchronized int get(String key) {
return sums.get(key);
}
public synchronized void add(String key, int val) {
int sum = 0;
if (sums.contains(key)) {
sum = sum.get(key);
}
sum += val;
sums.put(key, (Integer)sum);
}
}
Класс контроллера
@RestController
@RequestMapping("/sum")
public class FactoryController
{
@Autowired
private MyState myState;
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public SuccessResponse saveFactory(@RequestBody KeyVal keyVal)
{
myState.add(keyVal.getKey(), keyVal.getValue());
}
}
Примечание: Этот подход не будет работать, если выработают несколько серверов за балансировщиком нагрузки, если только вы не используете более сложное решение, такое как распределенный кеш.Сеансы могут использоваться для оптимизации производительности в этом случае.
2.База данных
Другой вариант - просто использовать базу данных для хранения вашего состояния.Таким образом, вы не потеряете данные в случае сбоя или перезагрузки.Spring поддерживает Hibernate Persistence Framework, и вы можете запустить базу данных, такую как Postgres.
Примечание: Если вы используете несколько серверов, вам потребуется более сложное решение, так как Hibernate кэширует данные в памяти.Вам придется подключить Hibernate к распределенному кешу для синхронизации в состоянии памяти между несколькими серверами.Сеансы можно использовать здесь для оптимизации производительности.
Важно
Всякий раз, когда вы изменяете состояние, вы должны убедиться, что вы делаете это потокобезопасным способом, иначе ваше состояние может быть неправильным.