C# 如何在有状态服务中缓存数据?

C# 如何在有状态服务中缓存数据?,c#,.net,visual-studio-2017,azure-service-fabric,C#,.net,Visual Studio 2017,Azure Service Fabric,群集需要访问位于群集外部的sql server中的数据集 我希望创建一个有状态的服务,使用远程数据库中的数据定期刷新缓存,而不是对每个请求强制远程调用数据库 我们会看到下面这样的东西吗 internal sealed class StatefulBackendService : StatefulService { public StatefulBackendService(StatefulServiceContext context) : base(context

群集需要访问位于群集外部的sql server中的数据集

我希望创建一个有状态的服务,使用远程数据库中的数据定期刷新缓存,而不是对每个请求强制远程调用数据库

我们会看到下面这样的东西吗

    internal sealed class StatefulBackendService : StatefulService
{
    public StatefulBackendService(StatefulServiceContext context)
        : base(context)
    {
    }

    /// <summary>
    /// Optional override to create listeners (like tcp, http) for this service instance.
    /// </summary>
    /// <returns>The collection of listeners.</returns>
    protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
    {
        return new ServiceReplicaListener[]
        {
            new ServiceReplicaListener(
                serviceContext =>
                    new KestrelCommunicationListener(
                        serviceContext,
                        (url, listener) =>
                        {
                            ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

                            return new WebHostBuilder()
                                .UseKestrel()
                                .ConfigureServices(
                                    services => services
                                        .AddSingleton<IReliableStateManager>(this.StateManager)
                                        .AddSingleton<StatefulServiceContext>(serviceContext))
                                .UseContentRoot(Directory.GetCurrentDirectory())
                                .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                                .UseStartup<Startup>()
                                .UseUrls(url)
                                .Build();
                        }))
        };
    }
}
我想操作的顺序如下:

  • 将帐户表加载到内存中
  • 响应请求,例如?$top=10
  • 按时间间隔刷新服务中的数据
  • 我应该使用哪些数据类型来缓存这些数据?从sql server数据库将数据加载到有状态服务中的过程是什么?

    l---------------->
    这里有更多与您的评论相关的信息… 嘿,m8。。。可靠的集合设计为运行多个实例(一次在多个节点上运行)。。。在每个实例中,数据被划分为一个或多个组(如何划分完全取决于您自己)。。。所以有负载分配和故障转移,还有更多的话要说。。。但我不想把水弄脏,所以我会尽量保持高水位。可靠集合中的此类服务数据存在于内存中,可以“备份”。。。如果您希望将数据正式写入光盘,并对写入光盘的时间有更多的控制,则需要查看参与者。这是一个很好(非常简单)的服务结构、可靠集合和连接内部通信示例的集合。唯一让人觉得奇怪的是,有很多不同的“配方”用于促进后端和从后端到公共(无状态)端的通信

    我看到你增加了你的问题,并改变了一点意图。。。我会直截了当地告诉你我“认为”你真正想要的是什么。。。您需要一个或多个“有状态服务”(这是您的数据服务层,如果您需要,可以将其抽象为3个组件…有状态服务本身,以及2个类库,一个用于您的服务接口,一个用于您的合同…或者更确切地说,您的数据模型…基本上这是一个POCO),您可以在有状态服务中包含这两个类库,并使用它们创建字典条目(可能类似于new IReliableDictionary…)并绑定接口。您需要使用(添加到)iSeries接口(对于您为服务接口创建的接口项目,您需要获取一个nuget软件包“Service Fabric Remoting”。关于如何在Service Fabric中实现远程处理,有很多信息,因为这是一种标准的通信方法。还有更多信息,但简单地构建它将是一个可行的实验,并将有效地取而代之的是你的数据库。你可以使用Actor或一种简单的备份方法将数据正式持久化到光盘上,这种备份方法是由service fabric封装的。从本质上说,我建议你建立它是为了证实你可以从这个场景中完全删除数据库的事实……你真的不需要它。我上面所描述的取而代之的是仅限db…如果不为此编写前端(使用远程处理与后端通信),公众将无法访问此功能…至少不容易。
    太长了,读不下去了。太长了,读不下去了。我基本上同意你的其他贡献者在说什么……我的意见不那么谦虚,所以我会简单地陈述一下。如果你处理服务数据中的数据,你的应用程序就不会那么复杂,更快,更可靠。……TR;DR?——我的DB。如果你真的紧张,它只存在于内存中,使用演员 这里有更多与您的评论相关的信息… 嘿,m8…可靠的集合设计为运行多个实例(一次在多个节点上运行)…在每个实例中,数据被划分为一个或多个组(如何划分完全取决于您)…所以有负载分配和故障转移,还有更多的话要说…但我不想弄乱局面,所以我尝试保持它的高水平。可靠集合中的此类服务数据存在于内存中,可以“备份”…如果您希望将数据正式写入光盘,并对写入光盘的时间有更多的控制,则需要查看参与者。这是一个很好的(非常简单的)收集服务结构、可靠收集和连接内部通信的示例。查看此示例时,唯一令人感到奇怪的是,有许多不同的“配方”用于促进后端和从后端到公共(无状态)端的通信

    我看到你增加了你的问题,并改变了一点意图…我会有针对性地告诉你我“认为”你真正想要的是什么…你想要一个或多个“有状态服务”(这是您的数据服务层,如果您需要,可以将其抽象为3个组件…有状态服务本身,以及2个类库,一个用于服务接口,一个用于合同…或者更确切地说是数据模型…基本上这是一个POCO),您将在有状态服务中包含这两个类库,并使用它们创建字典条目(可能类似于new IReliableDictionary…并绑定接口。您将希望使用(添加到)iSeries接口(对于您为服务接口创建的接口项目,您需要获取一个nuget软件包“Service Fabric Remoting”。关于如何在Service Fabric中实现远程处理,有很多信息,因为这是一种标准的通信方法。还有更多信息,但简单地构建它将是一个可行的实验,并将有效地你可以使用Ac将数据正式保存到光盘上
    Create table Account (varchar name, int key)