我正在用我的晚上评估Azure Service Fabric作为我们当前的WebApps/CloudServices堆栈的替代品,并且对于如何决定何时服务/演员与州应该是有状态的演员以及何时他们应该是无国籍演员感到有点不确定外部持久化状态(Azure SQL,Azure存储和DocumentDB).我知道这是一个相当新的产品(至少对普通大众而言),所以可能还没有很多关于这方面的最佳实践,但我已经阅读了微软提供的大部分文档而没有找到明确的回答这个问题.
我正在接近的当前问题领域是我们的活动商店; 我们的部分应用程序基于事件源和CQRS,我正在评估如何将此事件存储移动到Service Fabric平台.事件存储将包含很多时间序列 - 数据,因为它是我们持久保存数据的唯一真实来源,它必须是一致的,复制的并存储到某种形式的持久存储中.
我考虑过这样做的一种方法是使用有状态的"EventStream"actor; 使用事件源的聚合的每个实例将其事件存储在隔离的流中.这意味着有状态的actor可以跟踪自己的流的所有事件,并且我已经满足了我对数据存储方式的要求(事务性,复制性和持久性).但是,有些流可能会变得非常大(数十万甚至数百万的事件),而这正是我开始不确定的地方.我想,拥有一个具有大量状态的actor会对这些大型数据模型需要从磁盘序列化或反序列化时对系统性能产生影响.
另一种选择是让这些演员无国籍,让他们只是从Azure SQL等外部存储中读取他们的数据 - 或者只使用无状态服务而不是演员.
基本上,当演员/服务的状态量"太多"时,你应该开始考虑其他处理状态的方法吗?
此外,Service Fabric Actors设计模式中的这一部分:一些反模式文档让我有点困惑:
将Azure Service Fabric Actors视为事务系统.Azure Service Fabric Actors不是基于提交ACID的两阶段提交系统.如果我们不实现可选的持久性,并且actor在die上运行,那么它的当前状态将随之而来.演员将非常快地进入另一个节点,但除非我们实现了支持持久性,否则状态将会消失.但是,在利用重试,重复过滤和/或幂等设计之间,您可以实现高水平的可靠性和一致性.
"如果我们不实施可选的持久性",这里指出了什么?我的印象是,只要您的事务修改状态成功,您的数据就会持久存储到持久存储并复制到至少一部分副本.这一段让我想知道是否存在我的演员/服务中的状态会丢失的情况,如果这是我需要处理的事情.我从文档其他部分的状态模型得到的印象似乎抵消了这种说法.
在观看了Azure Service Fabric的BUILD会议视频后,我想象一下这对于我们当前基于微服务的架构是否合适.有一件事我不太确定我将如何解决,但是 - API网关/代理.
考虑一个不那么简单的微服务架构,其中您在Azure Service Fabric中运行N个服务,从而暴露REST端点.在许多情况下,您希望将这些分散的API端点打包到单条目API中供消费者使用,以避免它们直接连接到服务结构实例.Azure Service Fabric解决方案在各方面都看起来如此完整,我有点想知道当我在BUILD会谈期间提到的功能中没有看到一种简单解决这个问题的方法时我是否错过了一些明显的东西.
像Vulcan这样的服务旨在通过让服务在etcd中注册他们想要路由到它们的路径来解决这个问题.我猜测解决这个问题的一种方法可能是创建一个单独的有状态Web服务,其他服务可以自己注册,提供服务名称和路由到它们的路径.然后,有状态Web服务可以根据其状态将流量路由到正确的实例.但是,这似乎并不完全理想,例如删除应用程序时删除路由,以及通常使状态与群集中部署的服务保持同步.有没有人对此提出任何想法,或者有任何想法如何在Azure Service Fabric中解决这个问题?
我正在开发Azure Service Fabric应用程序,我需要某些演员需要从其他服务接收ping/hook.该应用程序是一种事件分发引擎,旨在这样的工作:
MyEvent
,它将识别哪些订阅者正在收听以及他们希望如何传递该事件.对于异步传递,将在Azure Service Bus主题中弹出一条消息.但是对于同步传递,路由器actor将直接在订阅actor上调用订阅方法,等待它们的响应.其中大部分都是相当直接的,但我不完全确定我将如何实现这些事件的同步传递.我不希望事件路由器actor以任何方式知道订阅事件的actor中的任何内部 - 但是对于当前的ActorProxy
实现和类似,需要访问接口才能调用其他actor上的方法.
假设我订阅了一个事件类型,通知事件路由器我的地址是fabric:/MyApp/MyEventSubscriberActor
我想要订阅的MyEvent
.在Service Fabric API中是否有任何合理的方法我可以编程方式调用该actor上的方法(例如OnEventAsync(MyEvent ev)
使用ActorProxy.Create<IMyEventSubscriberActor>()
方法?这些API的源代码似乎不公开,所以我没有直接的检查方法如何在引擎盖下完成.
我正在使用DC/OS协调器对ACS进行一些实验,虽然在单个区域内启动集群似乎很简单,但我不太确定在多个区域进行部署的最佳做法是什么.
Azure本身现在似乎不支持部署到多个区域.有了这个假设,我想我唯一的另一个选择是在我希望可用的所有区域中创建多个相同的集群,然后使用Azure Traffic Manager将传入流量路由到最近的可用集群.
虽然这个解决方案有效,但它也会导致一些我不能100%确定如何解决的问题.
有没有人曾经使用Azure容器服务(或者真正的亚马逊容器服务,因为我假设可以在那里找到相同的挑战)使用类似的设置,并有一些指示如何处理这个?
在使用Azure Service Fabric进行了一些测试并观看了来自BUILD的流之后,我有点好奇是否有用于协调环境以用于更复杂的服务的工具周围的管道。
假设我建立了一个服务“ Service1”,该服务调用“ Service2”和“ Service3”中的参与者和服务;任何签出“ Service1”存储库以执行更改的开发人员,不仅必须签出“ Service2”和“ Service3”,还必须构建它们并将其部署到Service Fabric,然后才能在“ Service1”中正确测试其更改。 ”。将此与例如Compose for Docker进行比较(我知道Azure Service Fabric本身不是容器式的基础结构,而只是作为示例),您可以在其中创建描述服务及其依赖项的清单。然后,您可以轻松地引导运行和测试服务所需的整个环境。
这对于自动测试乃至服务质量检查也很有用,您可以在其中启动新集群并部署服务-及其依赖关系-并在开始生产部署之前对所做的更改进行实际的实时测试。
这可能是一个更适合作为产品反馈的问题或建议,但是在将其表述为建议之前,对此有更多输入将是很有趣的。我对作为示例使用的Compose或Azure Service Fabric并不十分熟悉,因此对于那里的问题可能有更好的解决方案。