首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保并行查询到ext。系统只执行一次,然后缓存。

如何确保并行查询到ext。系统只执行一次,然后缓存。
EN

Stack Overflow用户
提问于 2015-01-08 00:39:08
回答 2查看 107关注 0票数 0

服务器框架: Scala,Play 2.2,ReactiveMongo,Heroku

我想我有很有趣的脑筋挑逗你:

在我的旅行规划应用程序中,我希望在地图上显示天气预报(类似于)。我使用付费休息服务查询天气数据。为了加快用户体验并降低成本,我计划将每个位置的天气数据缓存一个小时。

有一些不那么明显的事情需要考虑:

  • 可能需要查询最多100个位置的来显示一个天气图。
    • 必须以并行的方式查询天气,因为考虑到网络延迟,以串行方式查询天气要花费太长时间。
    • 然而,为每个用户请求启动100个线程也不是,也不是选项(想象一下一次只看一个地图的5个用户)
    • 解决方案是让我们假设50员工来查询用户请求的天气

  • 多用户可能正在查看地图 的相同部分的
    • 有一个可能的赛车条件,其中一个位置是多次查询。
    • 但是,应该只查询一次,然后缓存.。

  • 应用程序在集群环境中运行,这意味着将有、多个play实例。

来自Java背景,我可以使用Java堆栈找到一个非常好的解决方案。

但是,我想知道如何使用Scala/Play堆栈中更自然的东西来实现这一点: Akka。有一个类似问题的例子(google“”),但它不能解决一个问题:当多个用户同时查询相同的数据时,赛车条件。

您将如何实现这一点?

编辑:我已经决定,确保只更新天气数据一次的要求不是必要的。这种情况发生的频率太低,不足以成为真正的问题,而提出的所有解决方案都会给系统带来太多的开销和复杂性,使其无法成为可行的。

感谢大家的时间和努力。我希望这个问题的答案能帮助将来有类似问题的人。

EN

回答 2

Stack Overflow用户

发布于 2015-01-08 01:54:27

在Akka,您可以从多种路由策略中进行选择。在这种情况下,ConsistentHashingRoutingLogic可以很好地为您服务。因为参与者是单线程的,所以您可以轻松地在每个参与者中维护一个缓存。这个路由逻辑将确保两个相同的消息总是击中同一个参与者。

每个演员都可以以下列方式工作:

代码语言:javascript
复制
1. check local cache (for example apache commons LRUMap)
   - if found, return
2. check global cache (distributed memcache or any other key-value store)
   - if found, store the result in the local cache and return
3. query the REST service
4. store the result in the global and local caches

你可以看看问题,我的答案是基于这个问题。

票数 1
EN

Stack Overflow用户

发布于 2015-01-09 19:43:32

我决定也发布我的JMS解决方案。

处理天气请求的控制器执行以下操作:

  1. 查询数据库中的天气数据。如果没有没有过时数据回复的位置,请立即回复。否则继续:
  2. 开始听一个主题(稍后解释)。
  3. 对于每个位置:检查该位置的天气是否正在更新。
  4. 如果没有,则向队列发送天气更新请求消息。
    1. 一定数量的工人(50?)听那个队列。
    2. 员工首先将位置天气标记为正在更新。
    3. 工作人员检索更新的天气并更新DB。
    4. 工作人员向具有该位置的天气数据的主题发送一条消息。

  1. 当控制器接收到(通过主题)所有过时地点的天气更新时,将其与最新位置相结合并回复。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27831194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档