基于微服务的架构和每个节点的单独缓存
Microservices based architecture and individual cache for each node
在分布式微服务应用程序中为每个节点使用单独的本地缓存是否被认为是不好的做法?我听说在单体应用程序中,可以使用本地 EHCache 作为 Hibernate 的二级缓存提供程序,但在分布式环境中,通常的做法是使用分布式缓存,例如 Memcached、Redis 或 Hazelcast。对每个节点使用单独的缓存有什么后果?
"There are only two hard problems in Computer Science:cache invalidation and naming things."-- Phil Karlton
app-server 中本地缓存的主要问题是它使缓存失效比以前更加困难。
每次资源更改时,它都必须在所有本地缓存上失效(并更新)。这将需要一个在任何时间点都知道所有缓存服务器 运行 的系统。该系统必须被告知所有更新,以便它可以 co-ordinate 所有服务器上的数据失效。它还必须负责重试、处理失败的服务器等。
如果您的应用服务器有自己的本地缓存,您将不得不使用单独的系统或在应用程序代码中自行解决这些问题。分布式缓存系统可以为您解决这些问题。您可以进行更新调用并在成功时保证数据一致性(或最终一致性)。
这是关注点分离。使用单独的缓存集群,缓存逻辑和相关问题在一个地方处理。同一个集群可以很容易地重复用于多个应用程序,而不是为您开发的每个应用程序重做相同的集群。
另一个小缺点是,如果您不希望性能下降,则每次生成新服务器时都必须预热缓存。这将导致生成服务器的时间更长。
这里我们还可以做一件事,就是使用message broker做缓存失效。
使用kafka或任何其他队列来捕获数据包并使它们无效。
在分布式微服务应用程序中为每个节点使用单独的本地缓存是否被认为是不好的做法?我听说在单体应用程序中,可以使用本地 EHCache 作为 Hibernate 的二级缓存提供程序,但在分布式环境中,通常的做法是使用分布式缓存,例如 Memcached、Redis 或 Hazelcast。对每个节点使用单独的缓存有什么后果?
"There are only two hard problems in Computer Science:cache invalidation and naming things."-- Phil Karlton
app-server 中本地缓存的主要问题是它使缓存失效比以前更加困难。
每次资源更改时,它都必须在所有本地缓存上失效(并更新)。这将需要一个在任何时间点都知道所有缓存服务器 运行 的系统。该系统必须被告知所有更新,以便它可以 co-ordinate 所有服务器上的数据失效。它还必须负责重试、处理失败的服务器等。
如果您的应用服务器有自己的本地缓存,您将不得不使用单独的系统或在应用程序代码中自行解决这些问题。分布式缓存系统可以为您解决这些问题。您可以进行更新调用并在成功时保证数据一致性(或最终一致性)。
这是关注点分离。使用单独的缓存集群,缓存逻辑和相关问题在一个地方处理。同一个集群可以很容易地重复用于多个应用程序,而不是为您开发的每个应用程序重做相同的集群。
另一个小缺点是,如果您不希望性能下降,则每次生成新服务器时都必须预热缓存。这将导致生成服务器的时间更长。
这里我们还可以做一件事,就是使用message broker做缓存失效。
使用kafka或任何其他队列来捕获数据包并使它们无效。