web应用服务器端的负载平衡是否会生成JSF单例应用范围bean的多个实例?

web应用服务器端的负载平衡是否会生成JSF单例应用范围bean的多个实例?,jsf,singleton,load-balancing,javabeans,server-side,Jsf,Singleton,Load Balancing,Javabeans,Server Side,假设我在AWS或GAE上部署我的web应用程序,并且我在JSF中的应用程序有一个单例应用程序处理的Bean,其方法是“void setList(List)”“List getList()”。 当用户修改列表时,我从SessionScoped bean调用此方法。 我希望通过向所有用户推送通知消息,确保所有用户都能在自己的会话中获得更改,以便再次获得列表。 如果AWS或GAE的负载平衡器在多个实例中拆分应用程序,他们如何管理这个单例应用程序范围bean?有很多单身的例子吗?它们是如何同步的?是否存

假设我在AWS或GAE上部署我的web应用程序,并且我在JSF中的应用程序有一个单例应用程序处理的Bean,其方法是“void setList(List)”“List getList()”。 当用户修改列表时,我从SessionScoped bean调用此方法。 我希望通过向所有用户推送通知消息,确保所有用户都能在自己的会话中获得更改,以便再次获得列表。 如果AWS或GAE的负载平衡器在多个实例中拆分应用程序,他们如何管理这个单例应用程序范围bean?有很多单身的例子吗?它们是如何同步的?是否存在一个实例具有不同信息的风险

我认为参与负载平衡的每个服务器上的应用程序的所有实例都需要以某种方式进行更新,但这会扼杀负载平衡的目的,因为工作将在任何地方复制。单例工作可能不是负载平衡的,但我不知道。文档非常广泛,很难熟悉

@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 );
  }
}
@ManagedBean(name=“theModelBean”,
渴望(正确)
@独生子女
@适用范围
公共类ModelBean{
阵列列表;
公共列表getList(){
返回列表;
}
公共无效集合列表(列表列表列表){
this.theList=aList;
}
}
@ManagedBean(name=“控制器”)
@会议范围
公共类控制器{
@ManagedProperty(value=“#{theModelBean}”)
私有模型bean模型bean;
公共食物({
ArrayList=新的ArrayList;
添加(新数据());
modelbean.setList(列表);
}
}
我希望负载平衡不会干扰我的逻辑,它以一种透明的方式为我处理所有事情。否则,我可能必须让ModelBean在每次列表更改时将其写入数据库,并在每次会话请求时从数据库中获取列表

我将忽略您问题中的“负载平衡”/“负载平衡”术语,并假设您实际上指的是“集群”/“集群”。如中所示:同一个WAR文件正在部署到多个服务器,这些服务器都位于一个代理之后(谁负责实际的负载平衡,但负载平衡本身并不是观察到的问题的原因)

是的,集群的每台服务器都将获得自己的任何“应用程序范围”bean实例。这不仅包括JSF
@javax.faces.bean.ApplicationScoped
,还包括CDI
@javax.enterprice.context.ApplicationScoped
@javax.inject.Singleton
以及EJB
@javax.EJB.Singleton

通常的方法实际上是跟踪集群中所有服务器使用的单个公共数据源中的共享数据。通常,基于SQL的RDBMS用于此目的。通常,您会在每个请求/视图上触发一个SQL查询,以从数据库中获取最新的数据。如果使用JPA,通常使用二级缓存来缓存数据,以减少DB命中量。这可以在集群范围内进行配置

如果数据是不可变的(即创建后为只读),则在数据库中保存数据的替代方法是依赖会话持久性。拥有一个
@SessionScoped
bean,该bean在
writeObject()
期间从
@ApplicationScoped
读取一个,如果在
readObject()
期间不在
@ApplicationScoped
期间写入。在JSF
和OmniFaces

背后的代码中实现了一个真实世界的示例,我将忽略您问题中的“负载平衡”/“负载平衡”术语,并假设您实际上指的是“集群”/“集群”。如中所示:同一个WAR文件正在部署到多个服务器,这些服务器都位于一个代理之后(谁负责实际的负载平衡,但负载平衡本身并不是观察到的问题的原因)

是的,集群的每台服务器都将获得自己的任何“应用程序范围”bean实例。这不仅包括JSF
@javax.faces.bean.ApplicationScoped
,还包括CDI
@javax.enterprice.context.ApplicationScoped
@javax.inject.Singleton
以及EJB
@javax.EJB.Singleton

通常的方法实际上是跟踪集群中所有服务器使用的单个公共数据源中的共享数据。通常,基于SQL的RDBMS用于此目的。通常,您会在每个请求/视图上触发一个SQL查询,以从数据库中获取最新的数据。如果使用JPA,通常使用二级缓存来缓存数据,以减少DB命中量。这可以在集群范围内进行配置


如果数据是不可变的(即创建后为只读),则在数据库中保存数据的替代方法是依赖会话持久性。拥有一个
@SessionScoped
bean,该bean在
writeObject()
期间从
@ApplicationScoped
读取一个,如果在
readObject()
期间不在
@ApplicationScoped
期间写入。JSF
和OmniFaces

背后的代码中实现了一个真实世界的示例了解负载平衡和集群之间的差异(例如会话和应用程序范围的复制)了解负载平衡和集群之间的差异(例如,执行会话和应用程序范围的复制)谢谢。我不知道我是否应该就此提出另一个问题:每当ApplicationScoped bean检测到事件时,我想在某个xhtml页面中向当前用户推送消息。如果用户分布在不同服务器上的ApplicationScoped bean的多个实例中,我如何保证其中一个实例推送消息是正确的如果我使用AWS或GAE,我怎么知道集群中有多少服务器在运行我的应用程序呢?还有,我应该在哪里选择