请教各位谁有基于SSH架构的terracotta实施经验。

dongen88

最近一直在做terracotta集群。大致步骤都了解了。但是对于我将它实施到我们公司产品上还没成功。望高人指点下。特别是DSO配置这块。联系我:QQ:281236325,msn:dongen88@live.cn

banq
2010-01-13 09:31

可以到terracotta中国论坛提问,DSO配置很简单,就那几个,关键你要确定哪些数据是集群全局唯一。太多也会引起性能问题。

Hibernate 配置二级缓存使用EHcache,使用terracotta集群,网上有很多实践分享,查一下就可以。

总得来说:terracotta缓存对数据选择有讲究,而memcache由于是将数据全部加进来,就没有特别讲究,当然有其他问题。

dongen88
2010-01-13 09:59

非常感谢banq一大早帮忙解决问题,关于DSO配置我都差不多理解了,也能 动手做些集群的例子。假如就是我目前要做的集群的例子吧:
/*
spring bean
*/
public class UserSessionManagerImpl extends BaseService implements UserSessionManager,UserSessionAttributes {
private static final Log logger=LogFactory.getLog(UserSessionManagerImpl.class);
private Map<String,String> userId2SessionIdMap=Collections.synchronizedMap(new HashMap<String,String>());
private SessionContainer sessionContainer=null;
private OnlineUserMessageListenerManager onlineUserMessageListenerManager=null;
private List<UserSessionListener> sessionListeners=null;
......
}

/*
spring bean
*/
public class OnlineServiceImpl extends BaseService implements OnlineService {
private static final Log logger=LogFactory.getLog(OnlineServiceImpl.class);

private OnlineUserActivityManager onlineUserActivityManager=null;
private OnlineUserMessageListenerManager onlineUserMessageListenerManager=null;
private UserSessionManager userSessionManager=null;//需要集群的对象
...
}
中文的terracotta社区我一直在提问,还没解决。中文开发文档也看了不少都是入门的或者讲原理的。就刚才的两个spring bean。我需要集群userSessionManager这个对象,其中UserSessionManagerImpl 中的userId2SessionIdMap属性(保存所有用户在线信息)。我一直不能对userSessionManager对象加锁(lock)。所以一直不能成功。
[该贴被dongen88于2010-01-13 09:59修改过]
[该贴被dongen88于2010-01-13 10:00修改过]

banq
2010-01-13 11:01

terracotta是对Hibernate进行集群的,是对数据状态分布式,好像和Spring没太大关系。

dongen88
2010-01-13 11:39

从宏观上看,Terracotta for Spring提供了:
• HTTP session状态的集群。保证Spring Web Flow中的用户状态和扩展仓库或放入HTTP session的其它状态的高可用性和故障恢复能力。
• Spring bean的集群。Springbean的生命周期语义和域在集群间被保存,它们在“逻辑”上相同的ApplicationContext中。目前能被集群的bean类型是singleton和session scoped. 用户可以声明式配置哪个application contexts中的哪个bean需要被集群。
• 透明集群POJO。 不需要修改已有的代码,甚至不需要源代码。应用基于很少的声明式XML 配置文件,在载入期透明的生效。Terracotta for Spring不需要实现Serializable, Externalizable或其它接口的类。能这样实现的原因它并没有使用序列化,而只是将实际的差量和已经改变了的数据传输给当前需要的节点 (lazily)。
• 虚拟内存管理。它也提供分布式垃圾收集和虚拟堆功能。比如,由于物理内存在需要时被换入换出,它能在一个4G RAM的机器上运行需要200G堆的Web应用。 这也意味着你不需要关心Spring Web Flow 会话数据的大小是否超过了物理堆大小。


还是要谢谢热心的banq。以后经常来你论坛逛逛,真的很不错。
[该贴被dongen88于2010-01-13 11:42修改过]

banq
2010-01-13 14:49

欢迎常来逛逛,不过忠言逆耳。还是得说说。
>HTTP session状态的集群
HttpSession集群不关Spring事情吧,是Tomcat等服务器的事情,不能把Spring和Web标准混淆。

>Spring bean的集群。
都是单例或Session,没有必要集群啊,使用一个Apache做负载平衡就可以了。集群概念包括负载平衡+失败恢复,不知道terracotta能否做Bean的失败恢复

>透明集群POJO
Terracotta 对任何对象都不需要Serializable,Spring的POJO是属于对象,所以这一规则对Spring也适用。

>虚拟内存管理
这也是Terracotta本身特点。

说了半天,Terracotta for Spring基于没有一项特别针对Spring的。但是如果出于宣传,是靠边的。

关于Session集群,你会发现性能很差,总体使用terracotta会比不使用单机性能有降低,这是它的机制决定的,特别是要Session复制。

架构上考虑,Terracotta是属于分布状态,在多个服务器之间共享数据,当然,最Scalable的方法是分布事件,所以,我现在开始对Terracotta这一分布状态包括JavaEE集群分布状态做法有多大可伸缩性表示怀疑。

关键你集群的目的,你的性能瓶颈在哪里,是在Spring这里worker功能计算,还是在访问数据库的瓶颈。

以上只是个人总结,仅供参考吧。

[该贴被banq于2010-01-13 15:16修改过]

dongen88
2012-11-16 16:31

现在我想删除 或者 编辑帖子。好像不行哦
[该贴被dongen88于2012-11-16 16:31修改过]