让我们说我有一个移动应用程序,我想从该应用程序连接到奥尔良服务器。
我应该直接连接到奥尔良还是使用某些前端服务器(为什么?)
如果直接我应该使用Orleans Streams或自定义Socket连接。 如果我不能使用奥尔良客户端(和流),应该如何实现接受套接字连接的谷物。甚至有可能在不使用谷物时将其从内存中清除吗?
如果前端是前端,那么前端本身是否需要是谷物?
答案 0 :(得分:4)
您有多种选择,可以使用自定义TCP套接字将移动应用程序连接到Orleans集群。使用奥尔良构建系统的方法有很多,但为简单起见,我将在此处提供三种模型:
奥尔良系统的中心部分是奥尔良集群。该集群包含多个奥尔良孤岛,这些孤岛是过程,在生产环境中,您将至少有三个孤岛,每个孤岛都在单独的主机上运行。集群中的孤岛将相互通信以调用粒度方法并维护集群,并且由于它们位于不同的主机上,因此通信将通过网络进行。
连接移动应用程序的第一个选项是创建一个单独的前端主机组,在其中执行您的自定义TCP套接字服务。套接字服务收到请求后,它将使用Orleans grain client与Orleans集群进行通信。谷物方法调用的代码看起来像一个简单的方法调用,但实际上,该调用是通过网络从前端发送到Orleans集群的。
如果要从套接字服务器“推送”到移动应用程序,则还需要能够将消息从Orleans集群推送到前端。有两种方法可以做到:
我认为在某些时候流比观看者更受青睐,但我认为情况不再如此。通常,观察者使用起来稍微容易一些,但是观察者方面的错误不会传播回集群,因此与能够传播错误的流相反,它本质上是一劳永逸的机制。
当前端与Orleans群集分开托管时,您会获得一些安全性,因为Orleans筒仓主机不会直接暴露给Internet。但是,每个请求或推送消息都需要一个额外的网络跃点。为了避免这种情况,您可以将筒仓和套接字服务组合到一个进程中,而不是拥有单独的前端主机和筒仓主机,而现在只有一个集群既可以操作套接字服务,又可以运行Orleans。
但是,您必须解决一个问题。除非使用谷物客户端,否则即使使用与谷物相同的进程也无法调用谷物。幸运的是,现在存在一个托管客户端,该客户端允许您从同一个进程但在筒仓外部进行谷物调用,而不必使用通过网络发送数据的完整谷物客户端。这是一个相当新的功能,我还没见过any documentation about how to use this yet。
与其使用谷物客户端调用Orleans群集和使用观察者/流将消息发送到群集之外,还可以将整个套接字服务托管在群集中的谷物中。您需要实现一个可以充当自定义TCP套接字服务器的粒度。要启动此服务器,您需要使用startup task,它将调用RunAsync()
方法(或其他方法)来启动套接字服务器。
您可能希望在每个筒仓中激活该谷物的实例。有多种方法可以实现这一目标。您可以使用stateless worker,也可以使用一种放置策略,以确保将套接字服务器粒度放置在执行启动任务的筒仓中。基本思想是,当启动新筒仓时,将执行启动任务,并且此任务可确保在筒仓中激活了所需的谷物。奥尔良将删除不活动的颗粒,因此您还必须确保永远不会停用套接字服务器颗粒。您可以通过配置或延迟晶粒内部的停用来完成此操作。
由于套接字服务器位于grain中,因此您可以自由调用其他grain方法,而不必通过单独的grain客户端,而可以使用套接字服务器grain的GrainFactory
属性。如果套接字服务器要求您启动将使用GrainFactory
的独立任务,则必须注意有关grains and tasks的规则。
如果“自定义TCP套接字”是Web套接字,并且可以使用.NET Core构建系统,则建议您将ASP.NET Core与web sockets middleware(而不是SignalR)一起使用,并使用任一单独的前端使用Orleans托管客户端托管或在前端和Orleans群集之间共享主机。
如果要构建完整的自定义TCP套接字解决方案,则可能必须处理加密和身份验证。使用Web框架和HTTPS时,可以立即使用。奥尔良可以帮助您进行加密密钥等的状态管理,这是可行的,但需要一些努力。我从实际经验中知道这一点。
答案 1 :(得分:1)
当您无法完全控制客户端设备(例如移动应用程序)的安全性时,最好使对奥尔良的任何请求都通过安全前端(例如RESTful API)传递,并让客户忽略了后端技术。
这样做的原因是,奥尔良邮件系统无法满足用户身份验证和授权要求。 任何奥尔良集群客户端可以出于 any 原因在 any 时间调用 any 谷物。如果您将Orleans群集开放给组织外部不受控制的通信,则会打开它进行安全攻击。
奥尔良集群最适合作为围墙花园-让所有物品流入内部,禁止所有物品进入外部。
以上内容并不意味着必须在不同的过程中实现API。奥尔良可以与ASP.NET Core Kestrel服务器在同一过程中共存。这就是托管客户端功能的目的,它允许进程内代码像使用Orleans客户端一样使用筒仓本身,且零配置。
但是,当涉及到向外界开放端口时,请将奥尔良留在围墙花园后面,同时打开API端口 并在那里应用用户身份验证和授权规则。
在API后面抽象Orleans集群还有其他好处,例如版本端点,实现灵活性等,但这是另外一回事了。
答案 2 :(得分:0)
通常我认为建议使用某种API(例如REST,GRPC等),然后通过客户端将其连接到筒仓。因此,您的电话应用访问api,然后使用客户端访问orleans集群。
但是也有一个托管客户端,但是到目前为止我找不到有关此选项的更多信息。但是我在最新的RC的发行说明中看到了它:
默认情况下,启用了可在筒仓过程中高效托管前端代码的托管客户端。
https://github.com/dotnet/orleans/releases
更新: 我认为这是对此功能的请求: https://github.com/dotnet/orleans/pull/3362