C# Akka刮削设计

C# Akka刮削设计,c#,akka,akka.net,C#,Akka,Akka.net,我目前正在学习使用Akka创建分布式软件,我正在尝试制作的程序是一个剪贴程序。我面临的主要挑战是,我需要控制有多少simunitanies请求发送到同一主机,这样我就不会被禁止访问这些站点。因为我以前从未使用过Akka进行任何真正的扩展,所以如果我的设计很好或者完全没有抓住要点,我真的需要一些帮助 我的设计思想是为每台主机制作一个路由器,路由器的数量是我想继续访问该站点的数量。通过一个协调器将请求发送到正确的路由器 由于我的Cordinator是一个普通的参与者,它一次只能路由一个请求,有没有办

我目前正在学习使用Akka创建分布式软件,我正在尝试制作的程序是一个剪贴程序。我面临的主要挑战是,我需要控制有多少simunitanies请求发送到同一主机,这样我就不会被禁止访问这些站点。因为我以前从未使用过Akka进行任何真正的扩展,所以如果我的设计很好或者完全没有抓住要点,我真的需要一些帮助

我的设计思想是为每台主机制作一个路由器,路由器的数量是我想继续访问该站点的数量。通过一个协调器将请求发送到正确的路由器

由于我的Cordinator是一个普通的参与者,它一次只能路由一个请求,有没有办法让它能够像路由器一样在一次路由多个请求,这样它就不会成为一个瓶颈

我在代码中的想法

public class HttpRequestCordinator : ReceiveActor
{
    private Dictionary<string, IActorRef> hostDownloader; 

    public HttpRequestCordinator()
    {
        hostDownloader = new Dictionary<string, IActorRef>();

        this.Receive<HttpRequestMessage>(r =>
        {
            this.OnHttpRequesetMessage(r);
        });
    }

    private void OnHttpRequesetMessage(HttpRequestMessage message)
    {
        var host = message.Address.Host.ToLower();
        if (!hostDownloader.ContainsKey(host))
        {
            IActorRef child = Context.ActorOf(Props.Create(() => new HttpRequestActor()).WithRouter(new RoundRobinPool(1, new DefaultResizer(0, 10))));
            hostDownloader.Add(host, child);
        }
        hostDownloader[host].Tell(message, Sender);
    }
}
    public class HttpRequestActor : ReceiveActor
    {
        public HttpRequestActor()
        {
            Receive<Messages.HttpRequestMessage>(async r =>
            {
                try
                {
                    CancellationTokenSource cancellationToken = new CancellationTokenSource();
                    using (var handler = this.GetHandler())
                    {
                        using (HttpClient client = new HttpClient(handler))
                        {
                            AddDefaultHeadersToClient(client);
                            cancellationToken.CancelAfter(r.TimeOut);
                            var result = await client.SendAsync(r.Message, cancellationToken.Token);
                            Sender.Tell(result);
                        }
                    }
                }
                catch (Exception exp)
                {
                    Sender.Tell(new HttpRequsetFailed(r));
                }
            });
        }

        private HttpClientHandler GetHandler()
        {
            return new HttpClientHandler()
            {
                UseCookies = false,
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
            };
        }

        private void AddDefaultHeadersToClient(HttpClient client)
        {
            client.DefaultRequestHeaders.Add("Accept", "*/*");
            client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
            client.DefaultRequestHeaders.Add("Accept-Language", "da-DK,da;q=0.8,en-US;q=0.6,en;q=0.4");
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36");
            client.DefaultRequestHeaders.Add("AcceptCharset", "utf-8");
        }
    }
公共类HttpRequestCordinator:ReceiveActor
{
私有字典下载程序;
公共HttpRequestCordinator()
{
hostDownloader=新字典();
这个。接收(r=>
{
这个.onHttpRequestMessage(r);
});
}
私有无效OnHttpRequestMessage(HttpRequestMessage消息)
{
var host=message.Address.host.ToLower();
if(!hostDownloader.ContainsKey(主机))
{
IActorRef child=Context.ActorOf(Props.Create(()=>new-httprequestor()).WithRouter(new-RoundRobinPool(1,new-DefaultResizer(0,10)));
添加(主机,子级);
}
hostDownloader[host].Tell(消息,发件人);
}
}
公共类httprequestor:ReceiveActor
{
公共httprequestor()
{
接收(异步r=>
{
尝试
{
CancellationTokenSource cancellationToken=新的CancellationTokenSource();
使用(var handler=this.GetHandler())
{
使用(HttpClient=newhttpclient(handler))
{
向客户(客户)添加DefaultHeaders;
cancellationToken.CancelAfter(r.TimeOut);
var result=wait client.sendaync(r.Message,cancellationToken.Token);
告诉(结果);
}
}
}
捕获(异常扩展)
{
Sender.Tell(新的HttpRequestFailed(r));
}
});
}
私有HttpClientHandler GetHandler()
{
返回新的HttpClientHandler()
{
UseCookies=false,
AutomaticDecompression=DecompressionMethods.GZip | DecompressionMethods.Deflate
};
}
私有void AddDefaultHeadersToClient(HttpClient客户端)
{
client.DefaultRequestHeaders.Add(“接受”,“*/*”);
Add(“接受编码”、“gzip、deflate”);
client.DefaultRequestHeaders.Add(“接受语言”,“da-DK,da;q=0.8,en-US;q=0.6,en;q=0.4”);
client.DefaultRequestHeaders.Add(“用户代理”、“Mozilla/5.0(Windows NT 6.3;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/40.0.2214.115 Safari/537.36”);
client.DefaultRequestHeaders.Add(“AcceptCharset”、“utf-8”);
}
}

您应该在协调器和下载路由器之间添加限制级别


虽然我不确定这是否在akka.net开箱即用中实现

但您应该在协调器和下载路由器之间添加一个限制级别


虽然我不确定这是否在akka.net开箱即用中实现了

您找到问题的答案了吗?您找到问题的答案了吗?您找到问题的答案了吗?