我想创建一个 web 角色的 wcf 来服务智能手机客户端。
此外,我需要创建迭代每个成员的无限后台任务,并在需要时向成员发送推送通知(决定是基于每个成员的一些 facebook 查询做出的)。
目前,该应用程序是新的,我没有客户端,所以我不想要超过一个 VM(为了节省成本..),但我将来可能需要扩展,所以我想支持它。我唯一的要求是对所有成员的迭代将在不到 30 分钟的时间间隔内完成。
我在考虑2个解决方案:
1. 运行仅在一个 VM 中运行的经典 Windows 服务(如果我横向扩展,此 Windows 服务的一个实例仍将仅在其中一个上运行)。此外,我将在 wcf 服务中添加一个“void Handle(Member member) 方法。Windows 服务将有无限循环向该方法发送 wcf 请求。这样,如果我扩展我的实例,负载平衡将分配工作。
问题:windows 服务不知道他可以向 wcf 服务发送多少并发请求。我真的需要对成员进行并发处理(当然,服务器可以并行处理它们的限制)因为当我等待一个 facebook 查询完成时,我可以为其他成员发送更多 facebook 请求(这需要几秒钟每个 facebook 查询都要响应,因为我使用 facebook 批处理请求)。
2.每个webrole实例将负责处理不同的成员(我说的只是后台工作)。例如,如果我有 2 个实例(因为我曾经横向扩展过),第一个实例将负责 id % 2 == 0 的成员,第二个实例负责 id % 2 == 1 的成员。为了实现它,我是认为在每个实例启动时,我在某个 sql 表中注册当前实例。
此外,每个 Web 角色实例都会有后台线程:
- 检查 sql 表以了解哪些成员是他的责任
- 处理那些成员
- 设置 LastHandleTime 日期
- 检查是否有一个实例的记录在 5 分钟内没有更新其 LastHandleTime,删除它的记录(这样其他人下次会带走它的成员)
编辑:这个解决方案也有问题。我无法在我的 wcf 服务的整个生命周期中保持后台线程运行 - 如果我的服务中没有任何活动,IIS 可能会杀死它 [更多详细信息:http://forums.asp.net/t/1830688.aspx/ 1]
Edit2:为了解决它,我会将后台线程作为单独的 Windows 服务运行。将来,如果需要,我可以轻松地将其转换为工人角色。由于 Web 角色和 Windows 服务使用相同的处理逻辑,除了从第一个开始有响应,从第二个开始有推送通知(如果需要),我将使用一个共享 dll 和它们的处理逻辑.
哪种解决方案更好?我如何解决我提出的问题?