.NET分布式Orleans - 3 - Grain放置

这篇具有很好参考价值的文章主要介绍了.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上处理,减少了跨网络的通信开销。文章来源地址https://www.toymoban.com/news/detail-843145.html

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放置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET分布式Orleans - 4 - 计时器和提醒

    Timer是什么 Timer 是一种用于创建定期粒度行为的机制。 与标准的 .NET System.Threading.Timer 类相似,Orleans 的 Timer 允许在一段时间后执行特定的操作,或者在特定的时间间隔内重复执行操作。 它在分布式系统中具有重要作用,特别是在处理需要周期性执行的任务时非常有用。 T

    2024年03月26日
    浏览(27)
  • Orleans 微软基于 Actor 的分布式框架

            Actor模型是一种并发编程模型,它基于消息传递实现,是一种轻量级的并发模型。在Actor模型中,每个Actor都是一个独立的执行单元,它可以接收和发送消息,并且可以执行一些本地操作,但是不能直接访问其他Actor的状态。 Actor模型的基本工作原理如下: 1.每个

    2024年02月17日
    浏览(27)
  • .NET开源分布式锁DistributedLock

    线程锁通常在单个进程中使用,以防止多个线程同时访问共享资源。 在我们.NET中常见的线程锁有: 自旋锁:当线程尝试获取锁时,它会重复执行一些简单的指令,直到锁可用 互斥锁: Mutex,可以跨进程使用。Mutex 类定义了一个互斥体对象,可以使用 WaitOne() 方法等待对象上的

    2024年02月01日
    浏览(26)
  • ASP.NET Core - 缓存之分布式缓存

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。 与其他将缓存数据存储在单个应用服务器上的缓存方案相比,分布式缓存具有

    2023年04月19日
    浏览(25)
  • .net使用nacos配置,手把手教你分布式配置中心

    Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 这么优秀的分布式服务管理平台,怎么能不接入呢? nacos的安装和使用这里就不细说了,可以参考网上教程和官方文档。https://nacos.io/zh-cn/docs/quick-start.html 我们以创建一个webapi项目为例手把手教你

    2023年04月24日
    浏览(37)
  • 开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本

    在经过1年多的深思,十几年的框架编写技术沉淀下,花了近一个月的时间,终于又为 .Net 及 .Net Core 的微服务系列框架贡献当中的一个重要组件。 https://github.com/cyq1162/Taurus.DTC   由于 CYQ.Data Orm 组件本身支持10多种数据库,因此提供的包,只根据消息队列的需要分拆提供。 默

    2024年02月02日
    浏览(54)
  • 『SEQ日志』在 .NET中快速集成轻量级的分布式日志平台

    📣读完这篇文章里你能收获到 如何在Docker中部署 SEQ:介绍了如何创建和运行 SEQ 容器,给出了详细的执行操作 如何使用 NLog 接入 .NET Core 应用程序的日志:详细介绍了 NLog 和 NLog.Seq 来配置和记录日志的步骤 日志记录示例:博客提供了一个简单的日志记录示例,展示了如何在

    2024年02月11日
    浏览(40)
  • 开源:Taurus.Idempotent 分布式幂等性锁框架,支持 .Net 和 .Net Core 双系列版本

    分布式幂等性框架的作用是确保在分布式系统中的操作具有幂等性,即无论操作被重复执行多少次,最终的结果都是一致的。幂等性是指对同一操作的多次执行所产生的效果与仅执行一次的效果相同。 以下是分布式幂等性框架的主要作用: 避免重复操作: 在分布式系统中,

    2024年03月09日
    浏览(28)
  • Taurus.mvc .Net Core 微服务开源框架发布V3.1.7:让分布式应用更高效。

    自首个带微服务版本的框架发布:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 已经过去快1年了,在这近一年的时间里,版本经历了N个版本的迭代。 如今,是时候写文章介绍一下了: 以下介绍中,仅以.Net Core 6 为示例代码。 框架支持在.Net Fr

    2024年02月08日
    浏览(30)
  • 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)

    为什么说是伪微服务框架,常见微服务框架可能还包括服务容错、服务间的通信、服务追踪和监控、服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了。 年前到现在在开发一个新的小项目,刚好项目最初的很多功能是比较通用的,所以

    2024年03月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包