使用计时器和http.get策略进行轮询

时间:2014-05-10 11:12:32

标签: node.js design-patterns timer polling

我需要向我网站的用户提供实时市场数据。我通过向外部API发出请求来获得股票价格。我使用socket.io向用户提供数据。 由于市场数据每毫秒都在变化,我需要至少每隔5或10秒更新一次。

我们说我在我的网站上连接了3个用户:

  • 用户1正在查看股票" GOOGLE"。
  • 用户2正在查看股票" APPLE"。
  • 用户3正在查看股票" APPLE"。

目前,我的服务器只需轮询2个不同的股票价格并缓存它们。

现在我有两个策略,包括优点/缺点:

策略1

  • 每次用户连接到socket.io时,都会触发一个计时器(即:计时器[User1]),每5秒重复一次。
  • 计时器检查相关股票是否已被其他用户轮询。如果是这样,它通过socket.io将缓存的数据发送给用户。如果没有,它会调用函数" getStockPrice" (这使得http调用API)。

在全球范围内,这种策略很容易开发,但我将面临成千上万的计时器运行的问题(如果我有数千名同时访问者)。

策略2

使用全局计时器获取列表/队列中的所有股票并通过socket.io broadcast提供服务:

  • 每次用户连接到socket.io时,它都会将此用户注册到特定的会议室,并在列表中添加该库存(如果该用户尚未加入)。
  • 全局计时器获取列表(每5秒钟),对于列表中的每个项目,它调用函数" getStockPrice"并将结果广播到正确的房间。

通过这种策略,我不会遇到多个计时器的问题。问题是我的服务器每隔5秒就会同时开始执行数千个http请求。 (在策略1中,http调用将在0到5秒之间的随机范围内)。 我可以通过使用像队列/出队这样的东西来解决这个问题,但这足以每5秒清除一次队列吗?

论文是我想到的两种策略,但也许还有其他策略,或者我应该只使用这两种策略中的一种进行一些更改。你觉得怎么样?

0 个答案:

没有答案