据我所知,Azure 没有用于内部服务的负载均衡器,内部端点没有负载平衡。但有人可以实施“软”解决方案吗,或者可以建议我阅读一些有用的文章吗?
多谢
答案1
有两种方法可以处理这个问题:一种方法是在虚拟机中运行服务,另一种方法是在 Web / 辅助角色中运行服务。
第一:虚拟机。如果您的服务在虚拟机中运行,则可以利用 Azure 的外部负载平衡器在单个服务中运行的多个虚拟机之间进行负载平衡。传统上,这会带来安全问题,因为您将有一个向世界开放的外部(输入)端点,并且需要在虚拟机本身(iptables/Windows 防火墙)内相应地实现自己的安全性。有一项名为 ACL'd Endpoints 的全新功能,可让您根据 IP 范围允许/阻止对外部端点的访问。这意味着来自云服务(无论是虚拟机还是 Web/Worker)的任何流量都可以通过简单的配置调用(目前仅通过 PowerShell)正确允许访问。以下是 Michael Washam 的博客文章对这个:
$acl = New-AzureAclConfig
Set-AzureAclConfig -AddRule Permit -RemoteSubnet "1.2.3.4/32" -Order 1 -ACL $acl -Description "Just for my deployment"
Get-AzureVM -ServiceName myservice -Name myvm |
Set-AzureEndpoint -Name restapi -Protocol tcp -PublicPort 8000 -LocalPort 80 -ACL $acl |
Update-AzureVM
下一步:Web/worker。假设您正在以工作者角色运行私有服务,并具有多个实例。您可以从调用方枚举实例(例如 Web 角色实例),然后随机选择一个 ip+port(或循环,或您选择的任何机制)。相当简单,做这样的事情(并借用我的 StackOverflow 答案这里):
private String GetRandomServiceIP(String roleName, String endPointName)
{
var endpoints = RoleEnvironment.Roles[roleName].Instances.Select(i => i.InstanceEndpoints[endPointName]).ToArray();
var r = new Random(DateTime.Now.Millisecond);
int ipIndex = r.Next(endpoints.Count());
return endpoints[ipIndex].IPEndpoint.Address.ToString();
}
答案2
负载平衡的软件解决方案是使用工作角色实例数 > 1 的服务总线队列。每个工作角色都会监听队列并处理传入的消息。繁忙的工作角色显然必须先完成其正在执行的操作,然后才能从队列中获取下一条消息并进行处理。这样,负载就会在工作角色实例之间进行分配。