multi-tenant - Azure Service Fabric Multi-Tenancy

标签 multi-tenant azure-service-fabric

我正在尝试对这个已经回答的问题进行一些跟进......

Service Fabric multi-tenant

如果我要将我的租户设置为 Azure Service Fabric 无状态服务(他们将获得带外状态),我如何在集群中的每个节点上放置多个租户?在测试中,如果您尝试使实例数大于节点数,Service Fabric 似乎会出现问题。

这些租户非常轻量级,所以我应该可以在每个节点上运行几十个(我们总共会有数百个),我不想为每个节点都做一个节点。具体来说,租户或多或少只是打开与外部客户服务的长轮询 HTTP 连接并将数据流式传输回我们的系统 - 所以这里没有公共(public)端点在起作用。我只需要能够启动许多这样的工作人员,每个工作人员都会打开自己的长轮询连接。

有人可以指出我正确的方向吗?

仅供引用,我在这里解释了一点... https://social.msdn.microsoft.com/Forums/en-US/efd172e2-0783-489b-b3ab-ec62fb7b8ee4/multiple-instances-per-node?forum=AzureServiceFabric

提前致谢!

最佳答案

您需要以某种方式对您的服务进行分区。

有几个选项,但这里有两个很好的选择(以及您链接的 SO 问题):

拥有一个 SF 应用程序,每个租户都可以在其中获取您的服务实例。然后,您需要在前面有一个共享服务,以将请求路由到正确的服务。它应该看起来像这样。

MyAwesomeApp
    SharedStatelessApi <- External API points here
    MyTenantService_Tenant1 <- ServiceType: MyTenantService
    MyTenantService_Tenant2 <- ServiceType: MyTenantService
    ...

另一种解决方案是每个租户拥有一个(或多个)服务结构应用程序,并且看起来类似于:
MySharedApp
    SharedStatelessApi <- External API points here
Tenant1 <- ApplicationType: MyTenantApp
    MyTenantService <- ServiceType: MyTenantService
Tenant2 <- ApplicationType: MyTenantApp
    MyTenantService <- ServiceType: MyTenantService

它与第一个示例的概念相同,但分区是在更高的级别上完成的。

就个人而言,我更喜欢第二种情况。感觉更对了。
在这两种情况下,您都必须在新客户注册时手动创建服务/应用程序,或者在代码中创建。如果你想用代码来做,你应该看看 FabricClient。如果你需要一个例子,请告诉我。

此外,如您所见,您应该有一个共享的公共(public)端点,并在该端点中根据某些内容( header 、身份验证 token 、uri,与您的应用程序内联的任何内容)将请求路由到正确的服务。

使用 FabricClient 创建服务的示例:

首先你需要一个 FabricClient。对于不安全的集群(您的本地开发集群),以下内容就足够了:
var fabricClient = new FabricClient("localhost:19000");

当您部署到安全集群(例如在 Azure 中)时,您需要对 FabricClient 进行身份验证,如下所示:
var creds = new X509Credentials
{
    FindType = X509FindType.FindByThumbprint,
    FindValue = clientCertThumbprint,
    RemoteCertThumbprints = {clientCertThumbprint},
    StoreLocation = StoreLocation.LocalMachine,
    StoreName = "My"
};

var clusterEndpoint = "CLUSTERNAME.LOCATION.cloudapp.azure.com:19000"
// or whatever your cluster endpoint is

var fabricClient = new FabricClient(creds, clusterEndpoint);

然后,当你有一个 FabricClient 时,你可以像这样创建一个无状态服务:
var statelessDescriptor = new StatelessServiceDescription
{
    ApplicationName = new Uri("fabric:/MYAPP"),
    InstanceCount = 1, // How many instances.
    PartitionSchemeDescription = new SingletonPartitionSchemeDescription(),
    ServiceName = new Uri("fabric:/MYAPP/TenantA"),
    ServiceTypeName = "YourServiceTypeName",
    InitializationData = DATA_TO_PASS_TO_SERVICE_BYTE[] // Only if needed.
};

await _client.ServiceManager.CreateServiceAsync(statelessDescriptor)

如果您在“InitializationData” Prop 中传递了任何数据,它将在服务中作为 ServiceInitializationParameters.InitializationData 可用

关于multi-tenant - Azure Service Fabric Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35247726/

相关文章:

hibernate - 带有Spring Data JPA + Hibernate的基于判别器的 Multi-Tenancy

azure - Azure Service Fabric 使用哪些端口?

c# - 直接从服务访问应用程序参数

asp.net-web-api - 如何调用部署在azure上的WEB api服务结构?

azure-service-fabric - "HTTP Error 503. The service is unavailable"与 Service Fabric 上的 WebListener 共享端口

ruby-on-rails - 使用 Sidekiq 的 Redis 连接池实现 Multi-Tenancy (命名空间)设置

java - JPA/Eclipselink - 动态选择数据源/JDBC URL

actor - 服务结构参与者模型是否允许节流?如果没有,如何制作一个?

asp.net-web-api - 与多个 B2C 租户共享单个 WebApp 和 API 部署

php - 如何在每个租户都有多个用户的 laravel 中拥有 Multi-Tenancy 数据库?