hazelcast vs ehcache

Jav*_*tar 59 ehcache hazelcast

如你在标题中看到的那样,问题很清楚,我将很高兴听到你对adv./disadv的看法.他们之间的差异.

更新: 我决定使用Hazelcast,因为它具有分布式缓存/锁定机制等优点,并且在适应您的应用程序时非常容易配置.

小智 86

我们尝试了其中一个最大的在线分类和电子商务平台.我们从ehcache/terracotta(服务器阵列)开始,因为它是众所周知的,由Terracotta支持并且拥有比hazelcast更大的社区支持.
当我们在生产环境(分布式,超出一个节点集群)上获得它时,事情发生了变化,我们的后端架构变得非常昂贵,因此我们决定给予hazelcast机会.

Hazelcast很简单,它可以完成它所说的并且在没有任何配置开销的情况下表现非常好.

我们的缓存层在淡褐色的基础上超过一年,我们对它非常满意.


Dar*_*der 18

尽管Ehcache在Java系统中很受欢迎,但我发现它不如其他缓存解决方案灵活.我和Hazelcast一起玩,是的,它完成了工作,很容易运行等等,它比Ehcache更新.我可以说Ehcache比Hazelcast具有更多功能,更成熟,并且背后有很大的支持.

还有其他几个很好的缓存解决方案,具有所有不同的属性和解决方案,如良好的旧Memcache,Membase(现在的CouchBase),Redis,AppFabric,甚至几个NoSQL解决方案,提供有或没有持久性的键值存储.它们在实现CAP定理或BASE定理以及交易时都具有不同的特征.

您应该更关心,哪个具有您在应用程序中需要的功能,同样,您应该考虑CAP定理或BASE定理.

这项测试最近由Netflix在云端与Cassandra一起完成.它们达到每秒百万次写入,大约有300个实例.Cassandra不是内存缓存,但您的数据模型就像一个缓存,它由键值对组成.您也可以使用Cassandra作为分布式内存缓存.

  • CAP并不意味着实现,它表示在分布式系统中,您不能同时具有一致性可用性和分区容错.基本可用的软状态最终一致性意味着可用性优先于一致性,但数据最终将是一致的,软状态意味着数据存储在易失性存储器(例如RAM)中.大多数分布式缓存和NoSQL产品都实现了BASE ....所以BASE是处理CAP的方法 (2认同)

小智 11

Hazelcast一直是规模的噩梦,稳定仍然是一个主要问题.

网格组件选择的专用客户端是

  1. 凌乱的版本无法在任何地方丢失节点,否定备份点(超级客户端),或者
  2. 一个非常慢的本机客户端选项,它不允许任何类型的负载平衡来处理网格中的节点.

如果任何主机可以从这个数据网格请求记录,那将是一个甜蜜的设计,但你仍然坚持使用这两个平淡无奇的选项来从中获取任何东西.

数据库线程池锁定单个成员而不向数据库写入任何内容,导致永久性记录丢失也是一个常见问题,我们经常需要花费数小时来刷新任何JVM.分裂大脑仍然是一个问题,虽然在1.9.6它似乎已经平静了一点.

拉力转向Ehcache并改进数据库层,而不是将其用作创可贴.

  • PS:我为Hazelcast工作.詹姆斯,我很抱歉你遇到了Hazelcast的重大问题.据我记得你使用Hazelcast就像一个带有查询的关系数据库,我们建议将其更改为键/值模式.使用密钥的访问模式比执行查询快得多.但是我同意有时使用Hazelcast 1.9,节点丢失被迫重启集群.在1.9之后我们发布了Hazelcast 2,它现在是2.6.2版本,最近是Hazelcast 3.我们对集群层进行了大量改进. (32认同)

小智 7

只要有节点(标准节点),Hazelcast会对所有内容进行序列化,因此您将保存到Hazelcast的数据必须实现序列化.

http://open.bekk.no/efficient-java-serialization/


Dea*_*son 6

Hazelcast一直是我的噩梦.我能够在集群的Websphere环境中"工作".我松散地使用"工作"一词.首先,Hazelcast的所有文档都已过时,仅显示使用弃用方法调用的示例.尝试在Javadocs中使用没有注释的新代码,并且文档中没有示例是非常困难的.此外,J2EE容器代码此时不起作用,因为它不支持Websphere中的XA事务.抛出一个错误调用显式跟随他们唯一的J2EE示例的代码(它看起来像Milestone 3.0正在解决这个问题).我不得不忘记将Hazelcast加入到J2EE事务中.看起来Hazelcast肯定适用于非EJB /非J2EE容器环境.打电话给Hazelcast.当从一个企业java bean切换到另一个企业java bean时,getAllInstances()无法保留有关Hazelcast状态的任何信息.这迫使我创建一个新的Hazelcast实例,只是为了运行允许我访问我的数据的调用.这导致许多Hazelcast实例在同一个JVM上启动.此外,从Hazelcast检索数据并不快.我尝试使用Native Client和直接作为群集成员检索数据.我存储了51个列表,每个列表在Hazelcast中只包含625个对象.我无法直接在列表上执行查询,并且不希望存储地图只是为了访问该功能(可以在地图上执行SQL操作).检索每个625个对象列表需要大约半秒钟,因为Hazelcast序列化整个列表并通过网络发送它而不是仅仅给我三角形(已经改变了).另一件事,我不得不切换到TCPIP配置并明确列出我想要在群集中的服务器的IP地址.默认的多播配置不起作用,并且从谷歌的小组讨论中,其他人也遇到了这种困难.总结一下; 通过数小时的曲折程序配置和反复试验,我最终得到8台机器在集​​群中进行通信(文档将没什么帮助)但是当我这样做时,由于Hazelcast for EJB/J2EE的半成品特性,我仍无法控制每个JVM上创建的实例和分区数量,而且非常慢.我在我工作的失业保险申请中实施了一个真实的用例,并且代码更快地直接调用数据库.如果Hazelcast像宣传的那样工作会很酷,因为我真的不想使用单独的服务来实现我想要做的事情.我已经广泛使用了MongoDB,所以我可以跳过整个内存缓存,只是将我的对象序列化为一个单独的存储库中的文档.如果Hazelcast像宣传的那样工作会很酷,因为我真的不想使用单独的服务来实现我想要做的事情.我已经广泛使用了MongoDB,所以我可以跳过整个内存缓存,只是将我的对象序列化为一个单独的存储库中的文档.如果Hazelcast像宣传的那样工作会很酷,因为我真的不想使用单独的服务来实现我想要做的事情.我已经广泛使用了MongoDB,所以我可以跳过整个内存缓存,只是将我的对象序列化为一个单独的存储库中的文档.