c# - 奥尔良-自定义TCP套接字连接

标签 c# orleans

连接到奥尔良服务器的正确方法是什么?

可以说我有一个移动应用程序,我想从该应用程序连接到奥尔良服务器。

我应该直接连接到奥尔良还是使用某些前端服务器(为什么?)

如果直接使用,我应该使用奥尔良流或自定义套接字连接。
如果我不能使用奥尔良客户端(和流),应该如何实现接受套接字连接的谷物。如果不使用谷物,甚至有可能将谷物从内存中逐出吗?

如果前端是前端,那么前端本身是否必须是谷物?

最佳答案

您有多种选择,可以使用自定义TCP套接字将移动应用程序连接到Orleans群集。有多种使用奥尔良构建系统的方法,但为简单起见,我将在此处提供三种模型:

奥尔良系统的中心部分是奥尔良集群。该集群包含多个奥尔良孤岛,这些孤岛是过程,在生产环境中,您将至少有三个孤岛,每个孤岛都在单独的主机上运行。集群中的孤岛将相互通信以调用粒度方法并维护集群,并且由于它们位于不同的主机上,因此通信将通过网络进行。

前端和群集分开

连接移动应用程序的第一个选项是创建一个单独的前端主机组,在其中执行自定义TCP套接字服务。当套接字服务收到请求时,它使用Orleans grain client与Orleans集群进行通信。谷物方法调用的代码看起来像一个简单的方法调用,但实际上,该调用是通过网络从前端发送到Orleans集群的。

如果要从套接字服务器“推送”到移动应用程序,则还需要能够将消息从Orleans群集推送到前端。有两种方法可以做到这一点:


使用grain observer
使用streams


我认为在某些时候,信息流比观察者更受青睐,但我认为情况不再如此。通常,观察者使用起来稍微容易一些,但是观察者方面的错误不会传播回集群,因此与能够传播错误的流相反,它本质上是一劳永逸的机制。

前端和群集在同一过程中

当前端与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时,可以立即使用。奥尔良可以帮助您进行加密密钥等的状态管理,这是可行的,但需要一些努力。我从实际经验中知道这一点。

关于c# - 奥尔良-自定义TCP套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55021791/

相关文章:

c# - 何时使用属性与方法?

c# - 通过条目获取条目

c# - MSR Orleans - 如何创建具有并行读取的读写器粒度

persistent-storage - 奥尔良 - 批量数据导入

c# - 我们可以继承单例类吗?

c# - HttpUtility.ParseQueryString 的可移植类库 (PCL) 版本

c# - 读取 %APPDATA% 的内容

orleans - 通过 Microsoft Orleans 中的 GUID 检查grain是否存在

microservices - Dapr 虚拟 Actor 的使用​​ vs Orleans

azure-cosmosdb - Cosmos DB 中的 PartitionKeyRangeId 是什么?