这里是基准源代码:
https://github.com/a-rog/px100data/tree/master/examples/HazelcastVsIgnite。它是我之前提到的JDBC式NoSQL框架Px100 Data的一部分:
Px100 Data。
构建和运行方式如下:
cd <project-dir>
mvn clean package
cd target
java -cp "grid-benchmark.jar:lib/*" -Xms512m -Xmx3000m -Xss4m com.px100systems.platform.benchmark.HazelcastTest 100000
java -cp "grid-benchmark.jar:lib/*" -Xms512m -Xmx3000m -Xss4m com.px100systems.platform.benchmark.IgniteTest 100000
正如您所看到的,我将内存限制设置得很高,以避免垃圾收集。您也可以运行我的自己的框架测试(请参见Px100DataTest.java),并与上述两个进行比较,但让我们集中精力提高性能。两个测试都只使用了Hazelcast 3.5.1和Ignite 1.3.3 - 目前最新的版本。
基准测试会在事务中插入指定数量的约为1K大小的记录(一共10万条 - 您可以增加,但要注意内存),每次批量插入1000条。然后执行两个查询,一个升序,一个降序:总共四个查询。所有查询字段和ORDER BY都被索引。
我不打算发布整个类(可以从GitHub下载)。Hazelcast查询如下:
PagingPredicate predicate = new PagingPredicate(
new Predicates.AndPredicate(new Predicates.LikePredicate("textField", "%Jane%"),
new Predicates.GreaterLessPredicate("id", first.getId(), false, false)),
(o1, o2) -> ((TestEntity)o1.getValue()).getId().compareTo(((TestEntity)o2.getValue()).getId()),
100);
匹配的Ignite查询:
SqlQuery<Object, TestEntity> query = new SqlQuery<>(TestEntity.class,
"FROM TestEntity WHERE textField LIKE '%Jane%' AND id > '" + first.getId() + "' ORDER BY id LIMIT 100");
query.setPageSize(100);
以下是在我拥有8核心和8G内存的2012年MBP上执行的结果:
Hazelcast
Starting - used heap: 49791048 bytes
Inserting 100000 records: ....................................................................................................
Inserted all records - used heap: 580885264 bytes
Map: 100000 entries, used heap: 531094216 bytes, inserts took 5458 ms
Query 1 count: 100, time: 344 ms, heap size: 298844824 bytes
Query 2 count: 100, time: 115 ms, heap size: 454902648 bytes
Query 3 count: 100, time: 165 ms, heap size: 657153784 bytes
Query 4 count: 100, time: 106 ms, heap size: 811155544 bytes
Ignite
Starting - used heap: 100261632 bytes
Inserting 100000 records: ....................................................................................................
Inserted all records - used heap: 1241999968 bytes
Cache: 100000 entries, heap size: 1141738336 bytes, inserts took 14387 ms
Query 1 count: 100, time: 222 ms, heap size: 917907456 bytes
Query 2 count: 100, time: 128 ms, heap size: 926325264 bytes
Query 3 count: 100, time: 7 ms, heap size: 926325264 bytes
Query 4 count: 100, time: 103 ms, heap size: 934743064 bytes
一个明显的区别是插入性能-在实际应用中非常明显。然而,很少有人会插入1000条记录。通常只进行一次插入或更新(保存输入的用户数据等),所以这不会困扰我。但查询性能则不同。大多数数据中心业务软件都以读为主。
请注意内存消耗。Ignite比Hazelcast更加依赖RAM。这可以解释更好的查询性能。如果我决定使用内存网格,那么我需要担心内存吗?
你可以清楚地知道数据网格何时命中索引,何时没有命中,以及如何缓存编译后的查询(例如7ms)。我不想猜测,让你自己尝试一下,同时Hazelcast和Ignite的开发者也提供了一些见解。
就整体性能而言,它与MySQL相当,甚至略低。在我看来,内存技术应该做得更好。我相信两家公司都会做笔记。
上面的结果非常接近。然而,在Px100 Data和更高级别的Px100(它严重依赖于带排序字段的索引进行分页)中使用时,Ignite领先,更适合我的框架。我主要关心查询性能。