具有分布式后台工作的Azure Web角色

时间:2012-12-23 08:30:18

标签: multithreading azure scalability distributed-computing azure-web-roles

我想在网络角色中创建一个wcf来为智能手机客户提供服务。

此外,我需要创建无限的后台任务,迭代每个成员,并在需要时向成员发送推送通知(根据每个成员的某些facebook查询做出决定)。

目前,该应用程序是新的,我没有客户端,所以我不想要多于一个VM(为了节省成本..),但我将来可能需要扩展,所以我想要支持它。 我唯一的要求是,所有成员的迭代将在不到30分钟的时间间隔内完成。

我在考虑两种解决方案:

1。要运行仅在一个VM中运行的经典Windows服务(如果我向外扩展,则此Windows服务的一个实例将仅在其中一个上运行)。此外,我将在wcf服务中添加一个“void Handle(成员成员)方法。”windows服务将具有向该方法发送wcf请求的无限循环。 这样,如果我扩展我的实例,负载平衡将分配工作。

问题:Windows服务不知道他可以向wcf服务发送多少并发请求。我真的需要对成员进行并发处理(当然,服务器可以并行处理它们的限制)因为当我等待一个facebook查询完成时,我可以向其他成员发送更多的facebook请求(这需要几秒钟的时间)每个facebook查询响应,因为我使用facebook批量请求)。

2。每个webrole实例都将负责处理不同的成员(我只讨论后台工作)。例如,如果我有2个实例(因为我扩展了一次),第一个实例将负责id为%2 == 0的成员,第二个实例为id%2 == 1。 为了实现它,我想在每个实例的启动时,我在一些sql表中注册当前实例。

此外,每个Web角色实例都有后台线程:

  1. 检查sql表以了解哪些成员负责
  2. 处理这些成员
  3. 设置LastHandleTime日期
  4. 检查是否存在5分钟未更新其LastHandleTime的实例记录,删除其记录(以便其他人下次将其成员)
  5. 编辑:此解决方案也存在问题。我不能保持后台线程运行我的wcf服务的所有生命 - 如果我的服务中没有活动,IIS可能会杀死它[更多详细信息:http://forums.asp.net/t/1830688.aspx/ 1]

    Edit2:要解决它,我会将后台线程作为单独的Windows服务运行。在未来,如果需要,我可以轻松地将其转换为工人角色。 因为web角色和windows服务使用相同的处理逻辑,除了从第一个有响应,从第二个有推送通知(如果需要),我将使用共享dll与它们的处理逻辑

    哪种解决方案更好?我如何解决我提出的问题?

1 个答案:

答案 0 :(得分:1)

我不会在云端使用Windows服务,也会避免使用#2设计,因为它不能很好地扩展。这是我处理你的场景的方式:

我想构建一个分发服务(DS)和一个处理服务(SP)。 DS的作用是发布需要在Azure队列中接收通知的用户/成员列表。 DS可以按照您的建议从数据库中读取数据。使用Azure队列可以更轻松地跨工作人员角色分配工作负载,并使用内置冗余,如果未在特定时间范围内处理队列中的项目,则会重新出现这些冗余。 DS可能是您的WCF服务中的后台线程,但我可能会为此创建一个专用的工作者角色。如果需要多于1个DS用于冗余,请使用共享锁定机制(例如租用公共Blob或使用Azure表),以便只有1个DS发布要在队列中通知的成员列表。需要接收通知的每个成员都由Azure队列中的消息表示。例如,您可以在队列中存储用户ID:2019932 - 因此,如果您要发送10,000条消息,则Azure Queue中将有10,000条消息。

SP是另一个辅助角色,它从队列中读取并处理队列中的每个项目。 SP一次可以从队列中取出N个项目(例如10个)并处理它们。 SP也可以有多个线程(假设是T个线程),因此每个SP可以并行处理大约N * P个请求。让我们进一步假设您的代码需要S秒来处理每条消息(检查Facebook,发送通知,更新数据库)。要扩展,您需要做的就是部署更多SP。部署X SP会平均每秒为您提供X * N * P /(N * S)消息的吞吐量。

从技术上讲,您可以让DS和SP具有相同的工作角色;只要您处理共享锁定机制,在多台计算机上部署角色时就不必担心重复的消息。

像往常一样,当您处理大量请求时,您将进入分片世界。有关Azure的当前可伸缩性目标,请参阅此链接。例如,单个队列每秒最多可处理2,000条消息。这是一个目标......不是保证... :)如果你认为你需要更多,你总是可以使用多个队列。