我目前正在编写一个使用 Steam Web API 抓取 DotA 2 比赛的服务。因为我希望我的解决方案具有可扩展性,所以我希望允许同时缓冲和处理爬网作业。这就是为什么想到队列的原因:
所有组件都应该能够在不同的计算机/VM 上运行(没有内存或进程间同步)。爬行作业可能是这样的:
Job 1: Crawl match 1234 with options ABC
Job 2: Crawl match 2345 with options BCD
由于数据的性质,指向同一个比赛的多个工作可能会被排队(例如,两个玩家玩同一个游戏)。因此,我需要一些队列无法提供的同步机制(爬虫不能同时尝试写入相同匹配的数据)。
我的实际问题是:是否有一种模式可用于同步需要访问相同数据的队列工作人员?
我想到的一种方法是引入另一种允许爬虫进行Lock
匹配的服务(这需要在从数据库读取或写入匹配数据之前完成):
但这会引入一大堆新的问题和要求:
- 如何缩放控制器?
- 如果控制器崩溃怎么办?
- 如果队列工作者没有解锁匹配怎么办?
- ...
如果感兴趣,以下是我可能会使用的技术:
- 队列:Windows Server 的服务总线
- 服务:.NET Web API
- 数据库:SQL Server 2012