我已经开始用CQRS/ES实现几个LOB应用程序并进行评估:
有很多不同EMS的比较,但没有对Actor框架的评估.
那么,请你比较Akka和奥尔良,即:
Azure Service Fabric似乎专注于所有数据都适合RAM并且持久性用作后备存储的场景.可靠服务旨在将信息存储在可靠集合中,该集合使用日志检查点系统将记录的信息写入RAM.同时,对于Reliable Actors,默认的actor状态提供者是"Service Fabric平台提供的分布式Key-Value存储".这似乎表明同样的限制将适用.
然而,可能存在这样的情况:人们想要将Service Fabric用于"热数据",而是将"冷数据"写入某种形式的永久存储器.处理此转换的最佳做法是什么?
在Orleans中,这似乎是使用Azure表等持久性存储自动处理的.但似乎Service Fabric和Reliable Collections的主要设计目的是避免需要外部服务,从而增强数据局部性.当前的文档预计可能会有人希望将数据移动到某个永久存储库以进行灾难恢复和分析,但它没有讨论在持久性支持的内存中的actor和更永久的存储形式之间来回移动数据的可能性.
一个可能的答案是Service Fabric已经这样做了.也许可靠字典有一些内置机制,用于在持久性支持的内存存储和永久存储之间进行切换.
或者,也许答案是必须管理自己.一种方法可能是让Actor跟踪它的"热"程度并根据需要切换其持久性存储.但这牺牲了Actor模型的一个好处,即演员的自动分配和释放.同样,我们可能会定期从Reliable Dictionary中删除项目并将其添加到其他持久性存储中,然后将其添加回来.但是,这又要求了解何时进行转换是有意义的.
一些例子可能有助于明确这一点:
(1)假设我们正在实施一个有许多不同"房间"的多人游戏.我们不需要同时在内存中的所有房间,但我们需要将它们移动到内存中,并在玩家加入后使用本地持久性作为备份.
(2)假设我们正在实现一个仅附加的B树作为数据库的一部分.诱惑是让每个B-Tree节点成为有状态的角色.我们希望热b树保留在内存中,但当然整个索引不能在内存中.看来这是一个已经为DocumentDB这样的东西实现的核心场景,但是从文档中我不清楚如何做到这一点.
我找到的一个相关问题就在这里.但是,该问题主要关注何时使用Azure Service Fabric与外部服务.我的问题是是否需要在它们之间进行转换,或者Azure Service Fabric是否已具备此处所需的所有功能.
我想知道这是否是一个太广泛的问题,但最近我让自己遇到了一段我想确定如何从C#转换为适当的F#的代码.旅程从这里开始(1)(TPL-F#交互的原始问题),并继续这里(2)(我正在考虑转换为F#的一些示例代码).
示例代码在这里重现的时间太长,但有趣的功能是ActivateAsync,RefreshHubs和AddHub.特别有趣的是
AddHub有签名private async Task AddHub(string address).RefreshHubsAddHub在循环中调用并收集一个列表tasks,然后它在最后等待await Task.WhenAll(tasks),因此返回值与其签名匹配private async Task RefreshHubs(object _).RefreshHubs被称为ActivateAsync一样await RefreshHubs(null),然后在年底有一个叫await base.ActivateAsync()匹配函数签名public override async Task ActivateAsync().题:
将这些函数签名正确转换为F#仍然保持接口和功能并尊重默认的自定义调度程序是什么?而且我也不太确定这个"在F#中异步/等待".至于如何"机械地"做到这一点.:)
原因是在链接"here(1)"中似乎存在问题(我没有验证这一点),因为F#异步操作不遵循(Orleans)运行时设置的自定义协作调度程序.此外,这里声明TPL操作逃脱调度程序并进入任务池,因此禁止使用它们.
我能想到解决这个问题的一种方法是使用F#函数,如下所示
//Sorry for the inconvenience of shorterned code, for context see the link "here (1)"...
override this.ActivateAsync() =
this.RegisterTimer(new Func<obj, Task>(this.FlushQueue), null, TimeSpan.FromMilliseconds(100.0), …Run Code Online (Sandbox Code Playgroud) 我正在尝试发布Azure云服务.开始发布大约1小时后,它会返回此错误.我通过Visual Studio 2013 ultimate发布.
我正在尝试创建一个基于奥尔良的测试服务(不是其中一个样本).我已经完成了逐步的云部署教程,找不到我可能错过的任何内容.我敢打赌这里有一些东西,比如在某处设置一些连接字符串错误.我将再次检查它以确保一切都在教程中(除非有错误).
此外,我使用移动服务作为API前端.设置这个问题可能会引起一些问题,因为它与我看过的样本不同.
嗨,我正处于为即将开始的项目选择一个actor框架的早期阶段.据我所知,奥尔良的目的是为了让开发人员尽可能地减轻痛苦,但要牺牲一些表现.在Akka.net中我知道演员大小是400字节如果我是对的,你必须进入低级别来处理集群连接和由奥尔良管理的事情,但会带给你很好的表现.
我在奥尔良互联网上找到的唯一性能指标是:
在Microsoft Azure上使用X-Large VM(8个CPU内核/ 14 GB RAM),每个VM有一个silo:
谷物每秒最多可处理1,000个请求.孤岛每秒最多可处理10,000个请求.筒仓将容纳100,000个活性谷物.
而在主Akka.net 页:
单台机器上5000万msg /秒.内存占用小; 每GB堆大约250万个演员.
我想知道在Akka.net场景中使用了什么机器,以及它们如何执行Grain vs Actor(就每秒请求数而言,你可以或多或少地在GB内存中放置多少粒/角色)和记忆中的谷粒重量是多少.
随着Orleans和Akka.net的引用看起来Akka.net的表现要好得多,但我想在性能方面进一步比较两者.
我发现这个Akka.Net VS MS Orleans Comparison and Orleans和Akka Actors:A Comparison但没有解决性能问题.
谢谢!
我已经阅读了奥尔良常见问题解答,当分裂脑可能发生但我不明白可能发生什么不好以及如何正确处理它.
常见问题解答说的含义如下:
您只需要考虑在编写应用程序时有两个actor实例的罕见可能性.
但实际上我应该如何考虑这一点以及如果不这样做会发生什么?
Orleans Paper(http://research.microsoft.com/pubs/210931/Orleans-MSR-TR-2014-41.pdf)说:
应用程序可以依赖外部持久存储来提供更强的数据一致性
但我不明白这意味着什么.
假设裂脑发生了.现在我有一个谷物的两个实例.当我发送一些消息时,这两个消息可能被接收(或者甚至可能有更多?)不同的实例.假设在接收这些消息之前的每个实例都具有相同的状态.现在,在处理这些消息后,它们具有不同的状态.
他们应该如何坚持自己的国家?可能存在冲突.
当另一个实例将被销毁时,只有一个实例将会被破坏的实例状态发生?它们处理过的消息从未被处理过吗?然后客户端状态和服务器状态可以是去同步化的IIUC.
我认为(裂脑)是一个大问题,我不明白为什么对它的关注很少.
我是 Microsoft Orleans 的新手,在阅读文档时我发现了这一点:
... Grain 持久性使用可扩展的插件模型,以便可以使用任何数据库的存储提供程序。此持久性模型的设计是为了简单性,并不旨在涵盖所有数据访问模式。Grains还可以直接访问数据库,而不需要使用Grain持久化模型。 这里
但在文档的其余部分中,仅描述了使用存储提供程序进行粒度持久性的方法。但对于这些提供程序,我仍然想知道如何像关系数据库中那样执行复杂的请求(使用 JOIN、GROUP BY、ORDER BY 等)。
所以我担心的是:
使用直接访问关系数据库进行 Grain 持久化的优点和缺点是什么?
如果有任何直接的方法来运行在Windows服务中托管的Orleans,请指出.如果没有直接的方法,那么有没有间接的方法呢?
先感谢您
我正在寻找一些有助于为奥尔良集群设计"混沌猴"测试方法的指导.
我是新手,所以我能想到的是一个可以随机重启筒仓,停止/移动谷物以及做其他破坏性行为的脚本.类似于Service Fabric Clusters中的Induce Controlled Chaos.
我非常感谢通过分享来帮助我提高速度
谢谢,
我不知道如何在使用奥尔良的测试代码和奥尔良之外的测试代码之间共享我的服务注册。我花了几天时间试图解决这个问题。
我的单元测试有自己的 ServiceCollection,我在其中注册了我的应用程序所需的服务。在我的实验中,我注册了一个单例 ( Something)。
我现在将 Orleans 的 TestClusterBuilder 添加到我的单元测试中。根据文档,我需要AddSiloBuilderConfigurator...。
如何避免Something重复注册?这感觉就像是先有鸡还是先有蛋的情况。更糟糕的是,注入到我的grain中的单例与注册到的Something单例不同。Somethingapp
这似乎只是我的单元测试中的一个问题。在主应用程序代码中,没有TestClusterBuilder,DI 按预期工作。
我的代码看起来像这样:
[SetUp]
public void Setup()
{
var webApplicationBuilder = WebApplication.CreateBuilder();
webApplicationBuilder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(c =>
{
c.RegisterType<Something>().AsSelf().SingleInstance();
});
var app = webApplicationBuilder.Build();
var testClusterBuilder = new TestClusterBuilder(1);
testClusterBuilder.AddSiloBuilderConfigurator<TestSiloConfigurations>();
TestCluster = testClusterBuilder.Build();
TestCluster.Deploy();
}
public class TestSiloConfigurations : ISiloConfigurator
{
public void Configure(ISiloBuilder siloBuilder)
{
siloBuilder.ConfigureServices(services =>
{
services.AddSingleton<Something>();
});
}
}
Run Code Online (Sandbox Code Playgroud)
根据记录,我们使用的是 Autofac,但我认为这在这里并不重要。