Apache Ignite.NET 2.8的新功能

简介:

Apache Ignite.NET 2.8的新功能
瘦客户端和分区感知
从一开始,Ignite就支持客户端和服务端连接模式。不过即使客户端模式不存储数据也不执行计算,它仍然相对“笨重”,启动Ignite.NET客户端节点需要一个嵌入式的JVM环境,可能至少需要一秒钟,并且消耗几兆字节的内存。

在某些场景中,例如短期在线应用、低功耗客户端主机、命令行工具等,可能不希望这样的架构。因此Ignite从2.4版本开始,新增了轻量级的瘦客户端协议来处理这些场景,下面是简单的比较:

胖客户端 瘦客户端
启动时间 1300 ms 15 ms
内存占用 40 MB (.NET + Java) 70 KB
是否需要 Java 是 否
Ignite.NET瘦客户端通过Ignition.StartClient()启动,并提供一组和胖客户端类似的API。根接口是分开的(IIgnite-> IIgniteClient,ICache-> ICacheClient),但是方法的命名方式相同,并且大多数代码可以轻松地来回切换。

瘦客户端协议是开放、可扩展并且文档化的,这样也为其他语言(例如Python、JavaScript和PHP)的客户端铺平了道路。

分区感知
瘦客户端的初始实现使用接入指定服务端节点的单个连接来执行所有的操作。大家都知道Ignite在集群节点之间平均分配缓存数据,当瘦客户端连接到节点A,但请求的数据在节点B上时,则必须从A到B发出另一个网络请求,这样并不高效。

Ignite从2.8版本开始,引入了瘦客户端分区感知功能:瘦客户端可以接入所有服务端节点,确定给定键的主节点,并将请求直接路由到该节点,从而避免了额外的网络负载。这种路由非常快,它通过键哈希值的一些基本数学运算,就可以根据已知的分区分布确定目标节点。通过IgniteClientConfiguration.EnablePartitionAwareness = true打开/关闭分区感知后,cache.Get操作的性能测试结果如下:

Method Mean Error StdDev
Get 90.73 us 2.114 us 5.892 us
GetPartitionAware 31.56 us 0.618 us 1.234 us

具体测试中,集群拓扑、网络速度和缓存数据量可能有所不同,测试结果可能会不一样,但改进幅度是很大的。

故障转移
瘦客户端多节点连接还意味着故障转移的能力:如果一个或多个服务端节点发生故障,则客户端会自动切换到其他连接。

跨平台支持:.NET Core、Linux、macOS
Ignite从2.4版本开始引入了.NET Core 2.x支持,最终放弃了和Windows相关的C++部分,并切换到JNI层的纯.NET实现,从而使Ignite.NET应用可以在Linux和macOS上运行。

Ignite在2.8版本中新增了官方的.NET Core 3.x支持,并且可以在该框架支持的任何操作系统上以任何模式运行:服务端、客户端、瘦客户端。

Ignite改进了NuGet软件包中处理jar文件的方式,使用MSBuild.targets文件替换了post_build脚本,该文件更可靠,跨平台,并且可以通过dotnet build以及dotnet publish处理:.jar文件会被自动复制到构建和发布目录,从而生成一个独立的软件包。

注意最低系统要求仍然相同:.NET 4.0和Visual Studio2010,Ignite会保证主要版本(2.x)内的向后兼容性。但是在即将推出的Ignite 3.x中将切换到.NET Standard 2.0。

LINQ:Conditional和批量更新
SQL的UPDATE .. WHERE ..或DELETE .. WHERE ..在ORM和LINQ中通常无法实现。Ignite最终使用.Where()来获取数据,然后一个一个更新,这个方案不是很理想,并且也不够优雅。

假设要冻结所有一年以上未使用我们网站的用户:

ICacheClient cache = client.GetCache("person");

var threshold = DateTime.UtcNow.AddYears(-1);

IQueryable> inactiveUsers = cache.AsCacheQueryable()

.Where(entry => entry.Value.LastActivityDate < threshold);

foreach (var entry in inactiveUsers)
{

entry.Value.IsDeactivated = true;
cache[entry.Key] = entry.Value;

}
这个代码会将匹配的数据加载到本地节点,浪费内存并给网络造成了压力,这也违背了Ignite并置处理的原则:即将代码发到数据所在处,而不是将数据拉到代码所在处。

解决方法是使用SQL代替:

cache.Query(new SqlFieldsQuery(

"UPDATE person SET IsDeactivated = true WHERE LastActivityDate < ?", threshold));

简单、简洁、高效:Ignite会将查询发送到所有节点,并对每个缓存数据在本地执行更新,从而避免了节点之间的任何数据移动。但是开发者不想要C#中的SQL,而是想要LINQ,因为它经过了编译器检查,并且由于IDE的高效而更易于读写。

Ignite在2.5中通过LINQ引入了DML更新(除了Ignite2.1中的删除操作):

cache.AsCacheQueryable()

.Where(entry => entry.Value.LastActivityDate < threshold)
.UpdateAll(d => d.Set(person => person.IsDeactivated, true));

它将效率和LINQ的优点结合起来,转换为与上面相同的SQL查询。

动态服务代理
IServices.GetDynamicServiceProxy()是一个返回dynamic实例的新API,这样就无需事先创建接口即可调用任意服务,例如:

interface ISomeService
{

int GetId(string data);

}
...
ISomeService proxy = ignite.GetServices().GetServiceProxy("someService");
var id = proxy.GetId("foo");
可以替换为:

dynamic proxy = ignite.GetServices().GetDynamicServiceProxy("someService");
var id = proxy.GetId("foo");
这在POC、调用Java服务等许多场景中都很有用。

后续甚至还可以通过字符串名字调用服务的方法:

var methodName = "foo";
var proxy = (DynamicObject) ignite.GetServices().GetDynamicServiceProxy("someService");
proxy.TryInvokeMember(new SimpleBinder(methodName), new object[0], out var result);
总结
今后,瘦客户端协议及其各种语言的实现是Apache Ignite社区的主要方向之一,其中分区感知是一个重要的里程碑。下一步是自动服务端节点发现,这样就不必手动提供端点列表。在即将发布的版本中,还会将计算、服务、事务(已在Java瘦客户端中提供)和其他API添加到瘦客户端,瘦客户端的功能将变得更为强大。

原文地址https://my.oschina.net/liyuj/blog/3190945

相关文章
|
12月前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
291 1
|
分布式计算 大数据 Apache
跨越界限:当.NET遇上Apache Spark,大数据世界的新篇章如何谱写?
【8月更文挑战第28天】随着信息时代的发展,大数据已成为推动企业决策、科研与技术创新的关键力量。Apache Spark凭借其卓越的分布式计算能力和多功能数据处理特性,在大数据领域占据重要地位。然而,对于.NET开发者而言,如何在Spark生态中发挥自身优势成为一个新课题。为此,微软与Apache Spark社区共同推出了.NET for Apache Spark,使开发者能用C#、F#等语言编写Spark应用,不仅保留了Spark的强大功能,还融合了.NET的强类型系统、丰富库支持及良好跨平台能力,极大地降低了学习门槛并拓展了.NET的应用范围。
206 3
|
Java Spring API
Spring框架与GraphQL的史诗级碰撞:颠覆传统,重塑API开发的未来传奇!
【8月更文挑战第31天】《Spring框架与GraphQL:构建现代API》介绍了如何结合Spring框架与GraphQL构建高效、灵活的API。首先通过引入`spring-boot-starter-data-graphql`等依赖支持GraphQL,然后定义查询和类型,利用`@GraphQLQuery`等注解实现具体功能。Spring的依赖注入和事务管理进一步增强了GraphQL服务的能力。示例展示了从查询到突变的具体实现,证明了Spring与GraphQL结合的强大潜力,适合现代API设计与开发。
268 0
|
开发框架 .NET Apache
301重定向代码合集(iis,asp,php,asp.net,apache)
301重定向代码合集(iis,asp,php,asp.net,apache)
386 0
|
分布式计算 Hadoop
flume报错记录:java.net.ConnectException:拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
flume报错记录:java.net.ConnectException:拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
772 0
flume报错记录:java.net.ConnectException:拒绝连接; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
|
域名解析 Apache Docker
Linux-apache部署多个.net项目
apache部署多个.net项目
195 0
|
分布式计算 大数据 测试技术
微软发布 .Net for Apache Spark :用什么语言开发大数据都可以
Apache Spark 是当今最流行的开源大数据处理框架。Spark 用于进行分布式、大规模的数据处理,提供了更高级的编程接口、更高的性能。除此之外,Spark 不仅能进行常规的批处理计算,还提供了流式计算支持。
|
.NET 容器 开发框架
Asp.net Core 2.1新功能Generic Host(通用主机),了解一下
什么是Generic Host ?   这是在Asp.Net Core 2.1加入了一种新的Host,现在2.1版本的Asp.Net Core中,有了两种可用的Host。 Web Host –适用于托管Web程序的Host,就是我们所熟悉的在Asp.Net Core应用程序的Mai函数中用CreateWebHostBuilder创建出来的常用的WebHost。
1467 0
|
机器学习/深度学习 .NET 容器
Asp.net Core 2.1新功能Generic Host(通用主机)深度学习
什么是Generic Host ?image 这是在Asp.Net Core 2.1加入了一种新的Host,现在2.1版本的Asp.Net Core中,有了两种可用的Host。 Web Host –适用于托管Web程序的Host,就是我们所熟悉的在Asp.Net Core应用程序的Mai函数中用CreateWebHostBuilder创建出来的常用的WebHost。
2572 0

热门文章

最新文章