乐观缓存并发设计模式

Cod*_*nci 10 java concurrency design-patterns

我有一个在服务器集群上运行的Web服务.此Web服务执行一些内部处理,然后可以调用外部服务,这会产生费用.

我想进行一些缓存,这样如果我收到相同的服务请求(保证会发生),那么我就不必重复处理,既节省了处理时间/功率,也节省了外部部件的成本服务电话.

但是,当我遇到以下约束时,我正在努力弄清楚如何管理这个缓存

  • 该服务在多个Web服务器上运行,以实现高可用性和可伸缩性
  • 请求可能需要5秒才能响应,但与此同时,我可能已收到2或3个其他相同的请求.

在分布式环境中工作时,如何阻止执行其他服务调用,直到第一个服务调用响应(因此在缓存中可用).

我已经考虑过放入一个前端代理模式并在代理中建立一个相同请求的队列,这样当第一次返回时,它也可以向其他请求返回相同的响应.这是正确的模式,还是有更好的并发模式来处理这种情况?

JB *_*zet 6

你可以

  1. 计算请求的加密哈希值
  2. 查看结果是否已存在于此哈希的数据库中,如果是,则返回它
  3. 将哈希值存储在具有"结果挂起"状态的数据库中
  4. 调用Web服务并使用结果更新数据库中的行.

在步骤2,如果散列已经在数据库中,并且具有"结果挂起"状态,则可以每隔X毫秒轮询一次数据库,并最终返回结果.

当然,魔鬼在细节中,因为如果发生错误,您必须决定做什么:

  • 您是否为所有后续相同的请求返回错误?
  • 你是否导致等待线程重试调用Web服务?
  • 你是否返回错误,但只有一段时间,然后重试?