在ASP.NET中,有没有办法编写自定义Load Balancer?

时间:2012-01-30 21:48:00

标签: asp.net wcf load-balancing

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

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

这是一种可行的方法吗?我意识到对于一些高级开发人员来说,WCF解决方案没有任何问题。我问是否有一种更简单,更黑客的风格方法,允许我以我有限的能力创建1服务器解决方案,然后复制并负载平衡该解决方案的多个版本?

任何建议都值得赞赏!

3 个答案:

答案 0 :(得分:2)

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

如果您已经在运行Server 2008,那么使用操作系统的NLB功能可能更便宜,更容易(而且效率更高),而不是自己动手。例如,This是设置NLB群集的一个很好的演练。

最终当然这种方法取决于你,但我认为使用合适的工具总是一个好主意。如果你已经在操作系统中加入了循环,那么在WCF服务中重新发明循环IP集群似乎是浪费时间。

祝你好运:)

答案 1 :(得分:2)

您所描述的正是Load Balancers的构建内容 - 它们尝试在可用服务器池中分发传入请求。

许多托管公司提供涉及多个服务器的托管计划,您可以选择对其进行负载平衡。

例如:Rackspace提供负载均衡作为其部分托管计划的可选功能。

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

另外,请考虑在前端网站和后端批处理/密集型工作负载处理之间引入排队/消息总线。这样,您可以独立缩放系统的前端和后端。

说完所有这些之后,不要过度设计您的解决方案 - 专注于构建稳定,可靠,可靠,高效的系统,然后监控和测量其性能并在适当的时候进行调整。否则,您可能会花费宝贵的时间和精力来实现实际上不会使网站或用户受益的功能/调整!


根据OP的评论更新2012-01-31:

如果你想让你的工人角色一次执行一项任务,而只是在他们不再忙的时候再去做另一项工作,我建议你颠倒你的架构:

enter image description here

不要让某些前端服务器尝试找出哪些工作人员“忙”并相应地分配工作,而是考虑让前端服务器将传入消息排入“传入”队列。

工人从前端“拉”一个新的工作项,执行所需的任何工作,然后通知前端工作已完成,并要求另一个工作项。

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

当工作人员“拉”新工作项时,前端会为消息添加时间戳并将其移至辅助“待处理”队列。当工作人员完成工作时,工人会通知前端;前端将已完成的项目移动到“已完成”的队列(如果不关心则将其删除)。

然后,前端可以对“待处理”队列进行定期扫描,查找等待时间过长的消息,如果这些消息已经等待了很长时间,可以将这些消息返回到“传入”队列。

队列可以带来很多乐趣:)然而,构建这样的排队系统可能很复杂并且使其真正可靠可能既耗时又昂贵。

幸运的是,您可以利用一些非常熟练的消息总线实现,它们将为您提供实现这一目标所需的90%!我最喜欢的是微软基于云的Azure Message Bus,它为您提供了一个非常适合防弹的持久消息传递,发布 - 订阅和排队基础设施,非常适合您的场景。

HTH。

答案 2 :(得分:0)

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

即,不是将作业推送到特定服务器,而是让场中的每个服务器轮询可用的作业。

这样做的主要原因是您要求每台服务器一次只能为1个客户提供服务"。


所以,设置一下:

  1. 请求进来。
  2. 请求将记录到工作表
  3. 您的一个工作服务器请求下一份工作。
  4. 将其分配给该服务器。
  5. 工作完成后,服务器会将其标记为已完成。
  6. 现在,这为您提供了一些选择。首先,重新分配它是微不足道的...只需清除当前分配给该作业的服务器。你可能有一台显示器正在观看这张桌子,如果一份工作正在进行,那么“太长了”#34;那么你可以简单地让其他服务器抓住它。

    此外,您可以随意添加或删除工作服务器,而无需通知某种类型的控制服务器机器现在处于联机或脱机状态。


    为了更加健壮,您可以让每个工作服务器检入您的数据库,以表明它已准备好工作。然后,服务器将每隔几秒检入一次,以查看是否已分配任何内容。

    SQL作业可以每隔一段时间执行一次,分配工作。如果机器花了太长时间处理它,它也可能负责重新分配。