原文:https://devblogs.microsoft.com/dotnet/orleans-3-0/

作者:Reuben BondOrleans首席软件开发工程师

翻译:艾心

这是一篇来自Orleans团队的客座文章,Orleans是一个使用.NET创建分布式应用的跨平台框架。获取更多信息,请查看https://github.com/dotnet/orleans。

我们激动的宣布Orleans3.0的发布。自Orleans2.0以来,加入了大量的改进与修复,以及一些新特性。这些变化是由许多人在生产环境的大量场景中运行基于Orleans应用程序的经验,以及全球Orleans社区的智慧和热情推动的,他们致力于使代码库更好、更快、更灵活。非常感谢所有以各种方式为这个版本做出贡献的人。

自Orleans 2.0以来的关键变化:


Orleans 2.0发布于18个多月前,从那时起Orleans便取得了巨大的进步。以下是自Orleans 2.0以来的重大变化:

  • 分布式ACID事务-多个Grains加入到一个事务中,不管他们的状态存储在哪里
  • 一个新的调度器,在某些情况下,仅它就可以将性能提升30%以上
  • 一种基于Roslyn代码分析的新的代码生成器
  • 重写集群成员以提升恢复速度
  • 联合(Co-hosting)支持

还有很多其他的提升以及修复。

自从致力于开发Orleans2.0以来,团队就建立了一套实现或者继承某些功能的良性循环,包括通用主机、命名选项,在准备将这些功能好成为.NETCore的一部分之前与.NET团队密切合作、提供反馈和改进“upstream”,在以后的版本中会切换到.NET版本附带的最终实现。在开发Orleans 3.0期间,这个循环继续着,在最终发布为.NET Core 3.0的一部分之前,Orleans 3.0.0-beta1使用了Bedrock代码。类似的,TCP套接字连接对TLS的支持是作为Orleans 3.0的一部分实现的,并计划成为.NET Core未来版本的一部分。我们把这种持续的合作视为是我们对更大的.NET生态系统的贡献,这是真正的开源精神。

使用ASP.NET Bedrock替换网络层


一段时间以来,社区和内部合作伙伴一直要求支持与TLS的安全通信。在3.0版本中,我们引入了TLS支持,可以通过Microsoft.Orleans.Connections.Security包获取。有关更多信息,请查看TransportLayerSecurity范例。实现TLS支持之所以是一个重大任务要归因于上一个版本中Orleans网络层的实现方式:它并不容易适应使用SslStream的方式,而SslStream又是实现TLS最常用的方法。在TLS的推动下,我们着手重写Orleans的网络层。

Orleans 3.0使用了一个来自ASP.NET团队倡议的基于Bedrock项目构建的网络层替换了自己的整个网络层,Bedrock旨在帮助开发者构建快速的、健壮的网络客户端和服务器。

ASP.NET团队和Orleans团队一同合作设计了同时支持网络客户端和服务端的抽象,这些抽象与传输无关,并且可以通过中间件实现定制化。这些抽象允许我们通过配置修改网络,而不用修改内部的、特定于Orleans的网络代码。Orleans的TLS支持是作为Bedrock中间件实现的,我们的目的是使之通用,以便与.NET生态圈的其他人共享。

尽管这项工作是的动力是启用TLS支持,但是在夜间负载测试中,我们看到了平均吞吐量提升了大约30%。

网络层重写还包括借助使用MemoryPool<byte>替换我们的自定义缓存池,在进行这项修改时,序列化更多的使用到了Span<T>。有一些代码路径之前是依靠调用BlockingCollection<T>的专有线程进行阻塞,现在使用Channel<T>来异步传输消息。这将导致更少的专有线程占用,同时将工作移动到了.NET线程池。

Orleans的核心连接协议自发布以来一直都是固定的。在Orleans3.0中,我们已经增加了通过协议协商(negotiation)逐步更新网络层的支持。Orleans 3.0中添加的协议协商支持未来的功能增强,如定制核心序列化器,同时向后保持兼容性。新的网络协议的一个优点是支持全双工Silo到Silo的连接,而不是以前在Silo之间建立的单工连接对。协议版本可以通过ConnectionOptions.ProtocolVersion进行配置。

通过通用主机进行联合托管


Orleans与其他框架共同进行联合托管,如ASP.NETCore,得益于.NET通用主机,相同的进程中(使用联合托管)现在要比以前容易多了。

下面是一个使用UseOrleans将Orleans和ASP.NETCore一起添加到主机的例子:

 var host = new HostBuilder()
.ConfigureWebHostDefaults(webBuilder =>
{
// Configure ASP.NET Core
webBuilder.UseStartup<Startup>();
})
.UseOrleans(siloBuilder =>
{
// Configure Orleans
siloBuilder.UseLocalHostClustering();
})
.ConfigureLogging(logging =>
{
/* Configure cross-cutting concerns such as logging */
})
.ConfigureServices(services =>
{
/* Configure shared services */
})
.UseConsoleLifetime()
.Build(); // Start the host and wait for it to stop.
await host.RunAsync();

使用通过主机构建器,Orleans将与其他托管程序共享同一个服务提供者。这使得这些服务可以访问Orleans。例如,一个开发者可以注入IClusterClient或者IGrainFactory到ASP.NETCore MVC Controller中,然后从MVC应用中直接调用Grains。

这个功能可以简化你的部署拓扑或者向现有程序中额外添加功能。一些团队内部使用联合托管,通过ASP.NET Core健康检查将Kubernetes活跃性和就绪性探针添加到其Orleans Silo中。

可靠性提高


得益于扩展了Gossip,集群现在可以更快的从失败中恢复。在以前的Orleans版本中,Silo会向其他Silo发送成员Gossip信息,指示他们更新成员信息。现在Gossip消息包括集群成员的版本化、不可变快照。这样可以缩短Silo加入或者离开集群的收敛时间(例如在更新、扩展或者失败后),并减轻共享成员存储上的争用,从而加快集群转换的速度。故障检测也得到了改进,利用更多的诊断信息和改进功能以确保更快、更准确的检测。故障检测涉及集群中的Silo,他们相互监控,每个Silo会定期向其他Silo的子集发送健康探测。Silo和客户端现在还主动与已声明为已失效的Silo的连接断开,它们将拒绝与此类Silo的连接。

现在,消息错误得到了更一致的处理,从而将错误提示信息传播回调用者。这有助于开发者更快地发现错误。例如,当消息无法被完全序列化或者反序列化时,详细的异常信息将会被返回到原始调用方。

可扩展性增强


现在,Streams可以有自定义的数据适配器,从而允许他们以任何格式提取数据。这使得开发人员更好的控制Streamitems在存储中的表示方式。他还使Stream提供者可以控制如何写入数据,从而允许Streams与老的系统和Orleans服务集成。

Grain扩展允许通过自己的通信接口附件新的组件,从而在运行时向Grain添加其他行为。例如,Orleans事务使用Grain扩展对用户透明的向Grain中添加事务生命周期方法,如“准备”、“提交”和“中止”。Grain扩展现在也可用于Grain服务和系统目标。

现在,自定义事务状态可以声明其在事务中能够扮演的角色。例如,将事务生命周期事件写入服务总线队列的事务状态实现不能满足事务管理器的职责,因为它(该事务状态的职责)是只写的。

由于预定义的放置策略现在可以公开访问,因此在配置期间可以替换任何放置控制器。

共同努力


既然Orleans 3.0已经发布,我们也就会将注意力转向未来的版本-我们有一些令人兴奋的计划!快来加入我们在GitHub和Gitter上的社区,帮助我们实现这些计划。

Orleans 3.0 为我们带来了什么的更多相关文章

  1. Orleans 3.0 为我们带来了什么(转载)

    以下为本篇文章的 作者: 艾心 出处: https://www.cnblogs.com/edison0621/ 原文:https://devblogs.microsoft.com/dotnet/orl ...

  2. 【翻译】Orleans 3.0 发布

    aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUF ...

  3. Event Store 2.0发布,带来了安全支持和测试版Projections库

    Event Store 2.0版本于上周发布,它带来了安全支持允许锁定Event Store和在事件流上设置访问控制列表.其主要新特性包括: HTTP和TCP之上的身份认证,包括账户管理 测试版Pro ...

  4. Android SDK 5.0 这个语句带来折腾 - 生命在于折腾!

    Android SDK 5.0  带来的这番折腾 - 生命在于折腾! 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...

  5. orleans 2.0 教程之-----官方文档翻译,给大家学习ol一个参考

    本人也是英文盲,翻译不对的地方请谅解.由于翻译内容较多,会慢慢更新 orleans简称ol,一些专用词不做翻译.先决条件,读这表文章之前需要了解:actor,es,cqrs 参考链接: https:/ ...

  6. Sailfish OS 2.1.0 发布,带来重大的架构变化

    Sailfish OS 2.1.0 Iijoki 发布了. Iijoki通过引入Qt 5.6 UI框架.BlueZ 5 蓝牙堆栈和 64 位架构的基本实现,为Sailfish操作系统带来了重大的架构变 ...

  7. 关于android 5.0对开发带来的影响

    由于google推出了android5.0的系统,在app的安装方式,权限的管理方面与之前的系统有较大的区别.自己做的app也有体会.现在记录一些要注意的东西,防止忘记: 1.5.0改变了对自定义权限 ...

  8. orleans 2.0 进阶之自定义持久化储存

    一丶简单介绍下目录结构和项目依赖,如图 二丶主要核心自定义代码 1. 添加自定义实现类 CustomProvider public class CustomProvider : IGrainStora ...

  9. android 7.0带来的

    Android 7.0 给开发者带来了什么 新的 Andorid N (Andorid 7.0)预览版发布了,但是新的Android预览版需要我们在已存在的APP上测试几乎全部内容,包括不同种类的屏幕 ...

随机推荐

  1. QCustomplot使用分享(九) 绘制图表-多功能游标

    目录 一.概述 二.效果图 三.源码讲解 1.源码结构 2.头文件 3.添加游标 4.监测移动 5.移动游标 6.其他函数 四.测试方式 1.测试工程 2.测试文件 3.测试代码 五.相关文章 六.总 ...

  2. 玩转OneNET物联网平台之MQTT服务① —— OneNetMqtt全方位调试

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  3. Nginx 了解一下?

    这篇文章主要简单的介绍下 Nginx 的相关知识,主要包括以下几部分内容: Nginx 适用于哪些场景? 为什么会出现 Nginx? Nginx 优点 Nginx 的编译与配置 Nginx 适用于哪些 ...

  4. 认证授权-学习笔记1-OAuth 2.0

    简介 客户端必须得到用户的授权(authorization grant),才能获得令牌(access token).OAuth 2.0定义了四种授权方式. 授权码模式(authorization co ...

  5. Nginx在Window上简单的使用

    先上Nginx在Window上的基本常用指令: IP_hase也可以解决Session共享的问题:不过不推荐这样使用,建议使用 Memcache/redis来处理 session共享的问题 轮询还是权 ...

  6. Java ArrayList底层实现原理源码详细分析Jdk8

    简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用 ...

  7. Oracle大规模数据快速导出文本文件

    哈喽,前几久,和大家分享过如何把文本数据快速导入数据库(点击即可打开),今天再和大家分享一个小技能,将Oracle数据库中的数据按照指定分割符.指定字段导出至文本文件.首先来张图,看看导出的数据是什么 ...

  8. node留言板

    这是一个nodejs + mongodb 的小项目,对数据库的增删改查 1. 引入项目依赖 "art-template": "^4.13.2", "b ...

  9. 全排列函数(next_permutation())

    平常需要全排列的时候,一般都是dfs然后字符串匹配啥的……今天看题解的时候突然发现了这个神器. next_permutation()函数在c++的algorithm库里,作用是传入一个数组,输出这个数 ...

  10. [考试反思]1013csp-s模拟测试72:距离

    最近总是这个样子. 看上去排名好像还可以,但是实际上离上面的分差往往能到80分,但是身后的分差其实只有10/20分. 比上不足,比下也不怎么的. 所以虽然看起来没有出rank10,但是在总分排行榜上却 ...