在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放置的更多相关文章

  1. Microsoft Orleans构建高并发、分布式的大型应用程序框架

    Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...

  2. Microsoft Orleans 之 入门指南

    Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...

  3. Orleans 框架3.0 官方文档中文版系列一 —— 概述

    关于这个翻译文档的一些说明: 之前逛博客园的时候,看见有个园友在自己的博客上介绍Orleans. 觉得Orleans 是个好东西. 当时心想:如果后面有业务需要的时候可以用用Orleans框架. 当真 ...

  4. orleans开篇之hello world

    orleans开篇之hello world 什么是orleans Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务.Orleans项目基本上被认为是并行计 ...

  5. Orleans简单配置

    Orleans简单配置 这是Orleans系列文章中的一篇.首篇文章在此 话说曾几何时,我第一次看到xml文件,心中闪过一念想:"这<>是什么鬼?"-用ini或者jso ...

  6. Orleans 整体介绍

    背景 Orleans 是微软开源的Actor模型开发框架. Actor模型 此模型解决了并发编程时对资源竞争使用的问题,将对同一个业务数据的访问从并行变为串行执行,降低了多线程编程的难度,使普通编程人 ...

  7. Orleans安装

    一.Nuget包Orleans NuGet软件包从v1.5.0开始在大多数情况下,您需要使用4个关键的NuGet包: 1,Microsoft Orleans Build-time Code Gener ...

  8. Microsoft Orleans 之 开发人员指南

    开发一个Grain 在开发Grain之前请先阅读Grains 这篇文章 Grain 接口 Grains通过调用各自定义在接口中的方法相互作用,一个grain实现了事先定义好的一个或多个接口,grain ...

  9. Newbe.Claptrap 框架如何实现在多种框架之上运行?

    Newbe.Claptrap 框架如何实现在多种框架之上运行?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Box. 特别感谢 kotone 为本文提供的校对建议! Newbe.Cl ...

  10. .htaccess应该放在哪里?

    根据 Apache 官方的介绍,.htaccess 文件属于分布式配置文件,可以放置在网站 www 根目录的所有子目录.以及 www 根目录的上一级目录中,生效的路径总是当前目录及其所有子目录(可在文 ...

随机推荐

  1. FUN GAME 一款普通的C++游戏

    凑合看吧,不是完整版. #include<bits/stdc++.h> #include<windows.h> #include<conio.h> using na ...

  2. NC14526 购物

    题目链接 题目 题目描述 在遥远的东方,有一家糖果专卖店. 这家糖果店将会在每天出售一些糖果,它每天都会生产出 \(m\) 个糖果,第i天的第j个糖果价格为 \(C[i][j]\) 元. 现在的你想要 ...

  3. useMemo与useCallback

    useMemo与useCallback useMemo和useCallback都可缓存函数的引用或值,从更细的角度来说useMemo则返回一个缓存的值,useCallback是返回一个缓存函数的引用. ...

  4. oracle 游标变量ref cursor详解

    一 介绍      像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言 ...

  5. ORACLE查询优化及gather_plan_statistics hint

    查询优化手段和gather_plan_statistics hint: 在10g以后我们可以通过利用gather_plan_statistics提示来了解更多的SQL执行统计信息,具体使用方法如下: ...

  6. 代码+案例,实战解析BeautifulSoup4

    本文分享自华为云社区<从HTML到实战:深入解析BeautifulSoup4的爬虫奇妙世界>,作者:柠檬味拥抱. 网络上的信息浩如烟海,而爬虫技术正是帮助我们从中获取有用信息的重要工具.在 ...

  7. windows 上 cmake 添加 vcpkg 选项

    使用 cmake 编写相关的工程时,工程有时会使用 vcpkg 添加的第三方库,比如 zip 库 查看一些案例后,我发现有些回答不太准确,遂记录下 现在,我们需要在工程中使用 zip_open 函数执 ...

  8. goroutine并发

    每一个并非的执行单元叫作一个goroutine.设想这里的一个程序有两个函数,一个函数做计算,另一个输出结果,假设两个函数没有相互之间的调用关系.一个线性的程序会先调用其中的一个函数,然后再调用另一个 ...

  9. 【LeetCode数组#2双指针法】移除元素、删除有序数组中的重复项、移动0

    移除元素 力扣27题目链接(opens new window) 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组 ...

  10. ZYNQ 裸机模式下修改默认uart端口

    ## 背景 调试ZYNQ 裸机code, 调用 printf()后在UART端口无法看到打印信息输出,查看原理图后发现,板子用的UART 1作为默认串口调试接口,UART 0分配给了RS485使用,因 ...