经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET分布式Orleans - 3 - Grain放置
来源:cnblogs  作者:chester·chen  时间:2024/3/25 9:04:18  对本文有异议

在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 来重写默认放置策略:

  1. siloBuilder.ConfigureServices(services =>
  2. services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());

自定义标记属性以节省网络开销

如果希望将不同Client的Grain对象放置在同一个Silo上,以节省网络开销,可以使用自定义标记属性和自定义放置策略来实现。

下面的代码是个例子,在一个游戏中,可以为每个玩家定义一个唯一的标记属性,然后使用自定义放置策略确保具有相同标记属性的Grain对象被放置在同一个Silo上。

这样,同一游戏中不同玩家的Grain对象就可以在同一个Silo上处理,减少了跨网络的通信开销。

  1. public interface IPlayerGrain : IGrainWithStringKey
  2. {
  3. Task<string> GetPlayerInfo();
  4. }
  5. [SameGamePlacementStrategy]
  6. public class PlayerGrain : Grain, IPlayerGrain
  7. {
  8. public Task<string> GetPlayerInfo()
  9. {
  10. return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
  11. }
  12. }
  13. // 自定义 IPlacementDirector,用于指定将相同游戏中的不同玩家放置在同一个 Silo 上
  14. public class SameGamePlacementDirector : IPlacementDirector
  15. {
  16. public Task<SiloAddress> OnAddActivation(
  17. PlacementStrategy strategy,
  18. PlacementTarget target,
  19. IPlacementContext context)
  20. {
  21. // 获取游戏 ID,这里简单假设游戏 ID 是整数类型
  22. int gameId = int.Parse(target.GrainIdentity.Key.ToString().Split('#')[0]);
  23. // 将游戏 ID 映射到 Silo 的哈希值
  24. int hashCode = gameId.GetHashCode();
  25. // 获取 Silo 集群中的 Silo 列表
  26. var silos = context.GetCompatibleSilos(target).ToArray();
  27. // 计算 Silo 的索引
  28. int index = Math.Abs(hashCode % silos.Length);
  29. // 返回被选中的 Silo 地址
  30. return Task.FromResult(silos[index]);
  31. }
  32. }
  33. // 自定义 PlacementStrategy,用于指定使用自定义的 IPlacementDirector
  34. [Serializable]
  35. public sealed class SameGamePlacementStrategy : PlacementStrategy
  36. {
  37. }
  38. [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
  39. public sealed class SameGamePlacementStrategyAttribute : PlacementAttribute
  40. {
  41. public SameGamePlacementStrategyAttribute() : base(new SameGamePlacementStrategy())
  42. {
  43. }
  44. }
  45. class Program
  46. {
  47. static async Task Main(string[] args)
  48. {
  49. var host = Host.CreateDefaultBuilder()
  50. .ConfigureServices((context, services) =>
  51. {
  52. services.AddOrleans(builder =>
  53. {
  54. builder
  55. .UseLocalhostClustering()
  56. .Configure<ClusterOptions>(options =>
  57. {
  58. options.ClusterId = "dev";
  59. options.ServiceId = "OrleansExample";
  60. })
  61. .AddMemoryGrainStorage("playerGrainStorage")
  62. .AddPlacementDirector<SameGamePlacementStrategy>(sp => new SameGamePlacementDirector()); ;
  63. }); ;
  64. })
  65. .ConfigureLogging(l => l.AddConsole())
  66. .Build();
  67. await host.StartAsync();
  68. var client = host.Services.GetRequiredService<IClusterClient>();
  69. var gameId = "123";
  70. var pId = gameId + "#" + Guid.NewGuid().ToString("N");
  71. var a = await client.GetGrain<IPlayerGrain>(pId).GetPlayerInfo();
  72. Console.ReadKey();
  73. await host.StopAsync();
  74. }
  75. }

原文链接:https://www.cnblogs.com/chenyishi/p/18091682

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号