在ASP.NET中,是否有编写自定义负载平衡器的方法?

在ASP.NET中,是否有编写自定义负载平衡器的方法?,asp.net,wcf,load-balancing,Asp.net,Wcf,Load Balancing,我一直致力于通过WCF实现(1)个服务器,(n)个工作者角色服务器设置。一台服务器处理请求,通过WCF将工作传递给一个可用的工作者角色,后者处理请求,并将数据传递回服务器。这对我来说有点太复杂了。我试图简化解决方案,并认为可以通过创建(n)个服务器来删除WCF组件,每个服务器都能够处理工作者角色服务和web服务器角色。假设每个辅助服务器只能执行(1)个辅助角色 这样,当一个请求传入时,一些循环式处理程序会选择一个可用的服务器,并将HTTP请求转发给该服务器/工作者。该服务器/工作者完成工作,并将

我一直致力于通过WCF实现(1)个服务器,(n)个工作者角色服务器设置。一台服务器处理请求,通过WCF将工作传递给一个可用的工作者角色,后者处理请求,并将数据传递回服务器。这对我来说有点太复杂了。我试图简化解决方案,并认为可以通过创建(n)个服务器来删除WCF组件,每个服务器都能够处理工作者角色服务和web服务器角色。假设每个辅助服务器只能执行(1)个辅助角色

这样,当一个请求传入时,一些循环式处理程序会选择一个可用的服务器,并将HTTP请求转发给该服务器/工作者。该服务器/工作者完成工作,并将数据直接返回给请求者

这是可行的方法吗?我意识到对于一些高级开发人员来说,WCF解决方案不会带来任何问题。我想问的是,是否有一种更简单、更黑客式的方法,可以让我在能力有限的情况下创建一个单服务器解决方案,然后复制和负载平衡该解决方案的多个版本


任何建议都值得欣赏

我不建议这样做。对大多数开发人员来说,平衡一开始似乎很简单(“嘿,我只会跟踪每个请求,并将下一个请求转发到下一个服务器上,等等”),但实际上,如果它不是完全琐碎的话,它是复杂的。您需要考虑维护每台服务器的负载配额,处理停机的服务器,等等

如果您已经在运行Server2008,那么使用操作系统的NLB功能(而不是自己开发)可能更便宜、更容易(而且性能更高)。例如,这是设置NLB群集的一个很好的演练

当然,最终的方法取决于你,但我认为使用正确的工具来完成这项工作总是一个好主意。在WCF服务中重新发明循环式IP集群似乎是浪费时间,如果你已经在操作系统中使用了循环式IP集群的话


祝您好运:)

您所描述的正是构建负载平衡器的目的——它们试图在可用服务器池中分发传入请求

许多托管公司提供涉及多台服务器的托管计划,您可以选择使用这些服务器对传入请求进行负载平衡

例如:Rackspace将负载平衡作为其某些托管计划的可选功能

如果您在Microsoft的Azure云中托管一个具有多个web角色实例的站点,则您的站点将自动实现负载平衡。您还可以构建站点,使其在多个地理区域内实现动态负载平衡,以便将来自(例如)亚洲的请求路由到亚洲的数据中心,从而减少延迟和数据中心内带宽

还考虑在前端网站和后端批处理/密集工作负载处理之间引入排队/消息总线。通过这种方式,您可以独立地缩放系统的前端和后端

综上所述,不要过度设计您的解决方案—专注于构建一个稳定、可靠、高效的系统,然后监视和测量其性能,并在适当的情况下对其进行调整。否则,您可能会花费宝贵的时间和精力来实施实际上对站点或用户没有好处的功能/调整


根据OP的意见更新2012-01-31:

如果您想让您的工作人员角色一次执行一项任务,并且只在他们不再忙碌时返回进行另一项工作,我建议您反转您的体系结构:

<> P>而不是有一些前端服务器试图找出哪些工人“忙”并分配工作,考虑让前端服务器队列传入消息进入“传入”队列。 工人从前端“拉”出一个新的工作项,执行所需的任何工作,然后通知前端工作已完成,并要求另一个工作项

这种方法的美妙之处在于,它可以以线性方式扩展,并且具有很高的弹性

当工作程序“拉入”一个新的工作项时,前端会给消息加上时间戳,并将其移动到第二个“挂起”队列。工人在完成工作项目时通知前端;前端将已完成的项目移动到“已完成”队列中(如果不在乎,则删除它们)

然后,前端可以定期扫描“挂起”队列,查找等待时间过长的消息,如果这些消息挂起时间过长,则可以将其返回到“传入”队列

排队很有趣:)然而,建立这样一个排队系统可能会很复杂,使其真正可靠可能会耗费时间和成本

幸运的是,您可以利用一些非常熟练的消息总线实现,这些实现将为您提供实现这一点所需的90%!我最喜欢的是微软的云计算,它为您提供了一个非常适合您的场景的防弹耐用的消息传递、发布订阅和排队基础设施


嗯。

我建议你采取完全不同的方法

也就是说,不要将作业推送到特定服务器,而是让服务器场中的每台服务器在作业可用时轮询作业

这样做的主要原因是您要求每个服务器“一次只能为一个客户机提供服务”


因此,要建立一些东西:

  • 一个请求进来了
  • 请求被记录到工作表中
  • 您的一个工作服务器请求下一个作业
  • 它被分配给该服务器
  • 工作完成后,服务器将其标记为已完成
  • 现在,这给了你一些选择。首先,重新分配任务很简单。。。只需清除作业当前分配给的服务器即可。你可能会有一个监视器监视这张桌子,如果一个工作正在进行“太多”