Предположим, я развернул свое веб-приложение в AWS или GAE, а в моем приложении в JSF имеется компонент Singleton ApplicationScoped Bean с методами "void setList (List)" "List getList ()".
Я вызываю этот метод из компонента SessionScoped, когда пользователь вносит изменения в список.
Я хочу убедиться, что все пользователи получат изменения в своем собственном сеансе, отправив им уведомление, чтобы они могли снова получить список.
Если балансировщик нагрузки AWS или GAE разделяет приложение в нескольких случаях, как они управляют этим одноэлементным компонентом ApplicationScoped? Много ли экземпляров синглтона? как они синхронизируются? есть ли риск, что один экземпляр имеет другую информацию?
Я предполагаю, что все экземпляры приложения на каждом сервере, участвующем в балансировке нагрузки, должны быть как-то обновлены, но это уничтожит цель балансировки нагрузки, поскольку работа будет реплицирована повсеместно. Возможно, что работа синглтона не сбалансирована по нагрузке, но я не знаю. Документация очень обширная и с ней трудно ознакомиться.
@ManagedBean( name = "theModelBean",
eager = true )
@Singleton
@ApplicationScoped
public class ModelBean {
ArrayList<Data> theList;
public List<Data> getList(){
return theList;
}
public void setList( List<Data> aList ) {
this.theList = aList;
}
}
@ManagedBean( name = "theController" )
@SessionScoped
public class Controller {
@ManagedProperty(value = "#{theModelBean}")
private ModelBean theModelBean;
public foo(){
ArrayList<Data> list = new ArrayList<>;
list.add( new Data() );
theModelBean.setList( list );
}
}
Хотелось бы, чтобы балансировка нагрузки не мешала моей логике и чтобы все было прозрачно для меня. В противном случае мне, возможно, придется заставить theModelBean записывать список в базу данных каждый раз, когда он изменяется, и получать его оттуда каждый раз, когда его запрашивают из сеанса.