.NET分布式Orleans - 3 - Grain放置
在Orleans 7中,Grain放置是指确定将Grain对象放置在Orleans集群中的哪些物理节点上的过程。
Grain是Orleans中的基本单位,代表应用程序中的逻辑单元或实体。Grain放置策略是一种机制,用于根据不同的因素,将Grain对象放置在合适的节点上,以实现负载均衡、最小化网络延迟和提高容错性。
Grain放置的概念
Grain放置是指将Grain对象放置在Orleans集群中的物理节点上的过程。每个Grain对象都有一个唯一的标识符,Orleans根据Grain对象的标识符以及放置策略来决定将Grain对象放置在哪个节点上。
Grain放置的依据
Orleans 7中Grain放置的依据主要包括:
- 负载均衡:确保集群中的每个节点负载尽可能均衡,避免某些节点负载过重。
- 网络拓扑:考虑物理网络拓扑结构,将Grain对象放置在合适的物理节点上,以减少通信延迟。
- 容错性:确保Grain对象在集群中的高可用性和容错性,避免单点故障。
Grain放置策略
Orleans 7中常见的Grain放置策略包括:
- RandomPlacement:随机选择一个可用节点来放置Grain对象。这也是默认的策略。
- ActivationCountBasedPlacement:根据节点上已激活的Grain对象数量选择当前负载最轻的节点来放置Grain对象,以实现负载均衡。
- PreferLocalPlacement:优先将Grain对象放置在发起调用的本地节点上,以减少跨节点通信的延迟。
- CustomPlacement:允许用户根据特定需求自定义Grain放置策略。
配置默认放置策略
Orleans 默认将使用随机放置。 可以通过在配置期间注册实现 PlacementStrategy 来重写默认放置策略:
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
自定义标记属性以节省网络开销
如果希望将不同Client的Grain对象放置在同一个Silo上,以节省网络开销,可以使用自定义标记属性和自定义放置策略来实现。
下面的代码是个例子,在一个游戏中,可以为每个玩家定义一个唯一的标记属性,然后使用自定义放置策略确保具有相同标记属性的Grain对象被放置在同一个Silo上。
这样,同一游戏中不同玩家的Grain对象就可以在同一个Silo上处理,减少了跨网络的通信开销。
public interface IPlayerGrain : IGrainWithStringKey
{
Task<string> GetPlayerInfo();
} [SameGamePlacementStrategy]
public class PlayerGrain : Grain, IPlayerGrain
{
public Task<string> GetPlayerInfo()
{
return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
}
} // 自定义 IPlacementDirector,用于指定将相同游戏中的不同玩家放置在同一个 Silo 上
public class SameGamePlacementDirector : IPlacementDirector
{
public Task<SiloAddress> OnAddActivation(
PlacementStrategy strategy,
PlacementTarget target,
IPlacementContext context)
{
// 获取游戏 ID,这里简单假设游戏 ID 是整数类型
int gameId = int.Parse(target.GrainIdentity.Key.ToString().Split('#')[0]);
// 将游戏 ID 映射到 Silo 的哈希值
int hashCode = gameId.GetHashCode();
// 获取 Silo 集群中的 Silo 列表
var silos = context.GetCompatibleSilos(target).ToArray();
// 计算 Silo 的索引
int index = Math.Abs(hashCode % silos.Length);
// 返回被选中的 Silo 地址
return Task.FromResult(silos[index]);
}
}
// 自定义 PlacementStrategy,用于指定使用自定义的 IPlacementDirector
[Serializable]
public sealed class SameGamePlacementStrategy : PlacementStrategy
{ } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SameGamePlacementStrategyAttribute : PlacementAttribute
{
public SameGamePlacementStrategyAttribute() : base(new SameGamePlacementStrategy())
{
}
}
class Program
{
static async Task Main(string[] args)
{
var host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddOrleans(builder =>
{
builder
.UseLocalhostClustering()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "dev";
options.ServiceId = "OrleansExample";
})
.AddMemoryGrainStorage("playerGrainStorage")
.AddPlacementDirector<SameGamePlacementStrategy>(sp => new SameGamePlacementDirector()); ;
}); ; })
.ConfigureLogging(l => l.AddConsole())
.Build(); await host.StartAsync(); var client = host.Services.GetRequiredService<IClusterClient>();
var gameId = "123";
var pId = gameId + "#" + Guid.NewGuid().ToString("N");
var a = await client.GetGrain<IPlayerGrain>(pId).GetPlayerInfo(); Console.ReadKey(); await host.StopAsync();
}
}
.NET分布式Orleans - 3 - Grain放置的更多相关文章
- Microsoft Orleans构建高并发、分布式的大型应用程序框架
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- Microsoft Orleans 之 入门指南
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- Orleans 框架3.0 官方文档中文版系列一 —— 概述
关于这个翻译文档的一些说明: 之前逛博客园的时候,看见有个园友在自己的博客上介绍Orleans. 觉得Orleans 是个好东西. 当时心想:如果后面有业务需要的时候可以用用Orleans框架. 当真 ...
- orleans开篇之hello world
orleans开篇之hello world 什么是orleans Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务.Orleans项目基本上被认为是并行计 ...
- Orleans简单配置
Orleans简单配置 这是Orleans系列文章中的一篇.首篇文章在此 话说曾几何时,我第一次看到xml文件,心中闪过一念想:"这<>是什么鬼?"-用ini或者jso ...
- Orleans 整体介绍
背景 Orleans 是微软开源的Actor模型开发框架. Actor模型 此模型解决了并发编程时对资源竞争使用的问题,将对同一个业务数据的访问从并行变为串行执行,降低了多线程编程的难度,使普通编程人 ...
- Orleans安装
一.Nuget包Orleans NuGet软件包从v1.5.0开始在大多数情况下,您需要使用4个关键的NuGet包: 1,Microsoft Orleans Build-time Code Gener ...
- Microsoft Orleans 之 开发人员指南
开发一个Grain 在开发Grain之前请先阅读Grains 这篇文章 Grain 接口 Grains通过调用各自定义在接口中的方法相互作用,一个grain实现了事先定义好的一个或多个接口,grain ...
- Newbe.Claptrap 框架如何实现在多种框架之上运行?
Newbe.Claptrap 框架如何实现在多种框架之上运行?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Box. 特别感谢 kotone 为本文提供的校对建议! Newbe.Cl ...
- .htaccess应该放在哪里?
根据 Apache 官方的介绍,.htaccess 文件属于分布式配置文件,可以放置在网站 www 根目录的所有子目录.以及 www 根目录的上一级目录中,生效的路径总是当前目录及其所有子目录(可在文 ...
随机推荐
- C语言,结构体成员的地址
先回顾一个基础的知识,不同类型的数据在16位,32位,64位的机器分别占用多少字节. 类型 16位机器(字节) 32位机器(字节) 64位机器(字节) char 1 1 1 short 2 2 2 i ...
- apache kafka-01-kafka 入门介绍
kafka 名字背后的故事 说到卡夫卡,不知道你脑海中第一个想到的是什么? 是<变形记>的作者弗兰兹·卡夫卡(Franz Kafka)?还是村上春树的<海边的卡夫卡>? 不知 ...
- 【OpenGL ES】绘制魔方
1 前言 在立方体贴图(6张图)中,绘制了一个立方体,贴了 6 张图,本文的魔方案例,将实现绘制 27个立方体,贴 162 张图.贴图图片如下: 说明:inside.png 为魔方内部色块,用 ...
- Java设计模式-单例模式Singleton
介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如 Hibernate 的 SessionF ...
- Java利用反射实现运行时方法调用
1.介绍 在这篇短文中,我们将快速了解如何在运行时使用Java反射API调用方法. 2.准备工作 来创建一个简单的类: public class Operations { public double ...
- win32 - 监控DNS是否发生改变
两种方法: 第一种是使用WMI进行后台轮询 第二种是查询注册表对应的DNS键值 Here: HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameter ...
- 修改centos7虚拟机的用户密码
在忘记原密码无法登录桌面的情况下,修改centos7的用户密码 非常规启动,进入编辑启动菜单 在启动GRUB菜单中选择编辑选项,按键e进入编辑; 找到linux16开头的一行,在该行中寻找ro的所在地 ...
- 关于“非法的前向引用(illegal forward reference)”的探究
1.问题: 有如下代码: public class Test { static { i = 0;// 给变量赋值可以正常编译通过 System.out.print(i);// 编译器会提示" ...
- 【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
问题描述 在博文 "[Azure Developer]使用 Powershell az account get-access-token 命令获取Access Token (使用用户名+密码 ...
- consul 的 HTTP API 和使用方法
目录 搭建起 consul Consul 的 HTTP API Service API 简单地注册服务 健康检查的配置和查询 建议读者先学习笔者的另一篇文章 学习搭建 Consul 服务发现与服务网格 ...