减少多实例服务的不必要工作
Reducing unnecessary work for a multiple-instance service
我有一个连接到第三方网络服务的小服务,获取一些信息并将其保存到 mongo 集合中。该服务感兴趣的数据是非常静态的,但在特殊情况下它可能会发生变化(顺便说一句,这是足球赛程)。为了获得有关更改的通知,该服务每 3-6 小时检查一次,以查看是否有任何比赛已被取消或重新安排。新条目最终进入数据库,旧条目被丢弃(因为它们已经在集合中)。
该服务还公开了一个 GET 端点,用户可以连接到该端点。
现在,当我 运行 服务的单个实例时这很好,但当我有多个实例时就不太好了(可能所有实例每三个查询一次数据服务没有意义小时并丢弃大部分结果)。
我有以下解决方法的想法:
- 使用某种leader选举算法,只有leader应该查询第三方服务
- 将服务一分为二:一个较小的服务会查询数据(在多个实例中仍然存在问题),将结果放在消息队列中,这样可以保证只有一个消费者获取并处理该结果
- 结合前两个思路:查询服务的leader选举,消费数据的消息队列
- 使用某种分布式锁(我知道 Redis/Jedis 的解决方案)所以只有一个服务进行查询。然而,这感觉有点矫枉过正;添加 Redis 只是为了锁定就像...meh...
- 在这种情况下常用的更好的其他想法:-)
能否请您告诉我是否有解决此类问题的首选方案?
我会让事情变得简单,避免过于复杂。
在再次调用 WS 之前,只需保留 WS 响应时间和每个实例,应该检查数据库自上次调用以来经过了多少时间。
我有一个连接到第三方网络服务的小服务,获取一些信息并将其保存到 mongo 集合中。该服务感兴趣的数据是非常静态的,但在特殊情况下它可能会发生变化(顺便说一句,这是足球赛程)。为了获得有关更改的通知,该服务每 3-6 小时检查一次,以查看是否有任何比赛已被取消或重新安排。新条目最终进入数据库,旧条目被丢弃(因为它们已经在集合中)。
该服务还公开了一个 GET 端点,用户可以连接到该端点。
现在,当我 运行 服务的单个实例时这很好,但当我有多个实例时就不太好了(可能所有实例每三个查询一次数据服务没有意义小时并丢弃大部分结果)。
我有以下解决方法的想法:
- 使用某种leader选举算法,只有leader应该查询第三方服务
- 将服务一分为二:一个较小的服务会查询数据(在多个实例中仍然存在问题),将结果放在消息队列中,这样可以保证只有一个消费者获取并处理该结果
- 结合前两个思路:查询服务的leader选举,消费数据的消息队列
- 使用某种分布式锁(我知道 Redis/Jedis 的解决方案)所以只有一个服务进行查询。然而,这感觉有点矫枉过正;添加 Redis 只是为了锁定就像...meh...
- 在这种情况下常用的更好的其他想法:-)
能否请您告诉我是否有解决此类问题的首选方案?
我会让事情变得简单,避免过于复杂。 在再次调用 WS 之前,只需保留 WS 响应时间和每个实例,应该检查数据库自上次调用以来经过了多少时间。